Question
Lancer une commande cmd à partir d'un script ps
- Burgun
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 40
- Remerciements reçus 0
il y a 16 ans 6 mois #5204
par Burgun
Lancer une commande cmd à partir d'un script ps a été créé par Burgun
Bonjour,
Voila, je cherche actuellement à construire un script me permettant d'installer de petites applications sur des pc distants.
En fouillant le web, j'ai vu que ps pouvait proposer ce genre de fonctionnalité, mais surtout pour des package msi.
J'ai souvent utilisé psexec auparavant, et m'étant habitué à travailler avec ce dernier, j'ai voulu combiner son utilisation à un script ps.
Mon idée est de demander à l'utilisateur les paramètres de son setup si besoin( /q -f ....) et de lancer psexec pour permettre l'installation du logiciel. J'utilise une liste de serveur afin de pouvoir déployer un même logiciel sur plusieurs machines.
Voici mon code :
[code:1]
#Initialisation des variables
$PcDistant = \"\"
$Repertoire = \"\"
$Para = \"\"
$Commande = \"\"
$Binaire = \"\"
$Validation = \"\"
#Lecture des parametres
$Binaire=read-host \"Veuillez taper le chemin complet qui contient psexec\"
#Pour une utilisation ponctuelle : Un seul serveur
#Do {$pcname = Read-Host \"Nom du serveur distant\"} While ($pcname -eq \"\"«»)
Do {$AppLocation = read-Host \"Chemin complet du repertoire contenant votre installation\"} While ($AppLocation -eq \"\"«»)
Do {$Setup = Read-Host \"Nom du Setup\"} While ($AppName -eq \"\"«»)
$Para=read-host \"Veuillez taper les parametres à associer à votre setup\"
#Affichage des parametres : récapitulatif de la commande
Write-host \"Votre commande est la suivante\"
Write-Host \"psexec.exe \\Serveur c:\Temp\$Setup $Para\"
#Demande de validation
$Validation = Read-Host \"Taper Y pour valider ou N pour annuler\"
#Si validation OK
If ($Validation -eq \"Y\"«»)
#Parcourir la liste de serveur liste.txt
{
Get-Content -Path C:\liste.txt | ForEach-Object {
Write-host \"Installation sur de $_\"
#Création de la commande
$Commande=\"$Binaire\psexec.exe \\$_ c:\Temp\$Setup $Para\"
#Mappage d'un disque
$Drive = \"W:\"
$UNC = \"\\$_\C$\"
$UNC
#Create the Com object with New-Object -com
$net = New-Object -com WScript.Network;
#$net.removenetworkdrive($Drive)
$net.mapnetworkdrive($Drive,$Unc)
#Copie des sources sur le serveur distant
Copy-Item \"$AppLocation\" -destination \"W:\temp\\" -recurse
#Lancement de la commande
$Commande
#Demappage du disque
$net.removenetworkdrive($Drive)
}
}
Else {\"Installation annulée\"}
[/code:1]
Je ne suis pas très doué dans le scripting, et je bloque dans la possibilité de lancer ma commande psexec.
Je place dans une variable $Commande, la ligne incluant psexec avec les bon paramètres. Mais comment lancer cette commande comme je pourrais le faire dans une fenêtre cmd classique.
Le simple appel de la variable $Commande, m'affiche son contenu mais n'exécute pas la ligne en question.
Quelqu'un pourrait m'aider.
Message édité par: bvivi57, à: 26/08/09 18:40<br><br>Message édité par: bvivi57, à: 26/08/09 18:41
Voila, je cherche actuellement à construire un script me permettant d'installer de petites applications sur des pc distants.
En fouillant le web, j'ai vu que ps pouvait proposer ce genre de fonctionnalité, mais surtout pour des package msi.
J'ai souvent utilisé psexec auparavant, et m'étant habitué à travailler avec ce dernier, j'ai voulu combiner son utilisation à un script ps.
Mon idée est de demander à l'utilisateur les paramètres de son setup si besoin( /q -f ....) et de lancer psexec pour permettre l'installation du logiciel. J'utilise une liste de serveur afin de pouvoir déployer un même logiciel sur plusieurs machines.
Voici mon code :
[code:1]
#Initialisation des variables
$PcDistant = \"\"
$Repertoire = \"\"
$Para = \"\"
$Commande = \"\"
$Binaire = \"\"
$Validation = \"\"
#Lecture des parametres
$Binaire=read-host \"Veuillez taper le chemin complet qui contient psexec\"
#Pour une utilisation ponctuelle : Un seul serveur
#Do {$pcname = Read-Host \"Nom du serveur distant\"} While ($pcname -eq \"\"«»)
Do {$AppLocation = read-Host \"Chemin complet du repertoire contenant votre installation\"} While ($AppLocation -eq \"\"«»)
Do {$Setup = Read-Host \"Nom du Setup\"} While ($AppName -eq \"\"«»)
$Para=read-host \"Veuillez taper les parametres à associer à votre setup\"
#Affichage des parametres : récapitulatif de la commande
Write-host \"Votre commande est la suivante\"
Write-Host \"psexec.exe \\Serveur c:\Temp\$Setup $Para\"
#Demande de validation
$Validation = Read-Host \"Taper Y pour valider ou N pour annuler\"
#Si validation OK
If ($Validation -eq \"Y\"«»)
#Parcourir la liste de serveur liste.txt
{
Get-Content -Path C:\liste.txt | ForEach-Object {
Write-host \"Installation sur de $_\"
#Création de la commande
$Commande=\"$Binaire\psexec.exe \\$_ c:\Temp\$Setup $Para\"
#Mappage d'un disque
$Drive = \"W:\"
$UNC = \"\\$_\C$\"
$UNC
#Create the Com object with New-Object -com
$net = New-Object -com WScript.Network;
#$net.removenetworkdrive($Drive)
$net.mapnetworkdrive($Drive,$Unc)
#Copie des sources sur le serveur distant
Copy-Item \"$AppLocation\" -destination \"W:\temp\\" -recurse
#Lancement de la commande
$Commande
#Demappage du disque
$net.removenetworkdrive($Drive)
}
}
Else {\"Installation annulée\"}
[/code:1]
Je ne suis pas très doué dans le scripting, et je bloque dans la possibilité de lancer ma commande psexec.
Je place dans une variable $Commande, la ligne incluant psexec avec les bon paramètres. Mais comment lancer cette commande comme je pourrais le faire dans une fenêtre cmd classique.
Le simple appel de la variable $Commande, m'affiche son contenu mais n'exécute pas la ligne en question.
Quelqu'un pourrait m'aider.
Message édité par: bvivi57, à: 26/08/09 18:40<br><br>Message édité par: bvivi57, à: 26/08/09 18:41
Connexion ou Créer un compte pour participer à la conversation.
- Lymnia
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 16 ans 6 mois #5208
par Lymnia
Pour WMI, pensez à scriptomatic ça peut aider quand on connait pas la classe que l'on voudrait utiliser.
Réponse de Lymnia sur le sujet Re:Lancer une commande cmd à partir d'un script ps
Je suis très loin d'être un expert en powershell.
mais j'ai un truc simple mais compliqué parce qu'il doit y avoir mieux:pinch: ^^
enfin je sais que quand tu donne un fichier avec sont chemin à powershell, il l'ouvre et si c'est un .bat, il l'exécute.
Donc tu écris ta commande dans un fichier toto.bat et tu lance le fichier. C'est pas l'extase mais bon ça doit marcher.
sinon j'ai tenter un start \"commande\" in cmd.exe
ça ma ouvert une fenêtre dos et
ça ma refermé la fenêtre aussitôt. Excepter pour la ligne : start pause in cmd.exe qui ma bien lancé une pause.
mais j'ai un truc simple mais compliqué parce qu'il doit y avoir mieux:pinch: ^^
enfin je sais que quand tu donne un fichier avec sont chemin à powershell, il l'ouvre et si c'est un .bat, il l'exécute.
Donc tu écris ta commande dans un fichier toto.bat et tu lance le fichier. C'est pas l'extase mais bon ça doit marcher.
sinon j'ai tenter un start \"commande\" in cmd.exe
ça ma ouvert une fenêtre dos et
Pour WMI, pensez à scriptomatic ça peut aider quand on connait pas la classe que l'on voudrait utiliser.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 6 mois #5209
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Lancer une commande cmd à partir d'un script ps
bvivi57 écrit:
Lymnia écrit:
Si c'est le cas l'esthétisme n'a pas, à mon avis, vraiment ça place dans le développement. C'est une solution
Lymnia écrit:
[code:1]
function Start-Process([string]$Path,[string]$Parameters)
{
[diagnostics.process]::«»start($Path,$Parameters)
}
$Process=Start-Process \"cmd\" \"/C dir c:\&&pause\"
$Process=Start-Process \"cmd\" \"/C dir z:\&&pause\"
[/code:1]
Le \"mieux\" se trouve dans la doc du framework .NET, mais je te l'accorde, on doit connaître l'information.
Encore faut-il avoir le temps de la creuser...
Tu peux utiliser Invoke-Expression $Commande. Pour info je suis en train d'écrire un tuto sur le dynamisme sous PS...Le simple appel de la variable $Commande, m'affiche son contenu mais n'exécute pas la ligne en question.
Lymnia écrit:
Tu voulais peut être dire, \"pas très élégant\" ?mais j'ai un truc simple mais compliqué parce qu'il doit y avoir mieux:pinch: ^^
Si c'est le cas l'esthétisme n'a pas, à mon avis, vraiment ça place dans le développement. C'est une solution
Lymnia écrit:
Tu peux utiliser ceci:ça ma ouvert une fenêtre dos et
ça ma refermé la fenêtre aussitôt.
[code:1]
function Start-Process([string]$Path,[string]$Parameters)
{
[diagnostics.process]::«»start($Path,$Parameters)
}
$Process=Start-Process \"cmd\" \"/C dir c:\&&pause\"
$Process=Start-Process \"cmd\" \"/C dir z:\&&pause\"
[/code:1]
Le \"mieux\" se trouve dans la doc du framework .NET, mais je te l'accorde, on doit connaître l'information.
Encore faut-il avoir le temps de la creuser...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Burgun
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 40
- Remerciements reçus 0
il y a 16 ans 6 mois #5234
par Burgun
Réponse de Burgun sur le sujet Re:Lancer une commande cmd à partir d'un script ps
merci beaucoup pour votre aide.
Invoke-Expression fonctionne parfaitemment
Voiçi le script fini :
[code:1]
\"\"
$PcDistant = \"\"
$Repertoire = \"\"
$AppLocationCourt=\"\"
$Binaire=read-host \"Veuillez taper le chemin complet du dossier qui contient psexec (pas de \ à la fin) : ex c:\pstools\"
\"\"
#Do {$pcname = Read-Host \"Nom du serveur distant\"} While ($pcname -eq \"\"«»)
\"\"
Do {$AppLocation = read-Host \"Veuillez taper le chemin complet du dossier qui contient les sources du logiciel à installer (pas de \ à la fin) : ex c:\temp\monlogiciel\"} While ($AppLocation -eq \"\"«»)
Do {$Setup = Read-Host \"Veuillez entrer le nom du Setup : ex install.exe\"} While ($AppName -eq \"\"«»)
\"\"
$Para=read-host \"Veuillez taper les parametres à associer à votre setup : ex /silent ou -f\"
\"\"
#Recuperation du chemin ou l'application se trouve (suppression de la lettre de lecteur:\)
$AppLocationCourt=$AppLocation -replace('^...', '')
Write-host \"La commande qui sera exécutée sur le serveur distant est la suivante\"
\"\"
Write-Host \"psexec.exe \\Serveur c:\Temp\$AppLocationCourt\$Setup $Para\"
\"\"
$Validation = Read-Host \"Taper Y pour valider ou N pour annuler, si Y l'installation sera faite sur tous les serveurs présent dans c:\liste.txt\"
\"\"
If ($Validation -eq \"Y\"«»)
{
Get-Content -Path C:\liste.txt | ForEach-Object {
Write-host \"Installation sur $_\"
#Mappage d'un disque
$Drive = \"W:\"
$UNC = \"\\$_\C$\"
$UNC
#Create the Com object with New-Object -com
$net = New-Object -com WScript.Network;
#$net.removenetworkdrive($Drive)
$net.mapnetworkdrive($Drive,$Unc)
#Copie des sources sur le serveur distant
Copy-Item \"$AppLocation\" -destination \"W:\temp\\" -recurse
#Création de la commande
$Commande=\"$Binaire\psexec.exe \\$_ c:\Temp\$AppLocationCourt\$Setup $Para\"
$Commande
#Lancement de la commande
Invoke-Expression $Commande
remove-item \"W:\Temp\$AppLocationCourt\\" -recurse
#Demappage du disque
$net.removenetworkdrive($Drive)
}
}
Else {\"Installation annulé\"}
[/code:1]
Invoke-Expression fonctionne parfaitemment
Voiçi le script fini :
[code:1]
\"\"
$PcDistant = \"\"
$Repertoire = \"\"
$AppLocationCourt=\"\"
$Binaire=read-host \"Veuillez taper le chemin complet du dossier qui contient psexec (pas de \ à la fin) : ex c:\pstools\"
\"\"
#Do {$pcname = Read-Host \"Nom du serveur distant\"} While ($pcname -eq \"\"«»)
\"\"
Do {$AppLocation = read-Host \"Veuillez taper le chemin complet du dossier qui contient les sources du logiciel à installer (pas de \ à la fin) : ex c:\temp\monlogiciel\"} While ($AppLocation -eq \"\"«»)
Do {$Setup = Read-Host \"Veuillez entrer le nom du Setup : ex install.exe\"} While ($AppName -eq \"\"«»)
\"\"
$Para=read-host \"Veuillez taper les parametres à associer à votre setup : ex /silent ou -f\"
\"\"
#Recuperation du chemin ou l'application se trouve (suppression de la lettre de lecteur:\)
$AppLocationCourt=$AppLocation -replace('^...', '')
Write-host \"La commande qui sera exécutée sur le serveur distant est la suivante\"
\"\"
Write-Host \"psexec.exe \\Serveur c:\Temp\$AppLocationCourt\$Setup $Para\"
\"\"
$Validation = Read-Host \"Taper Y pour valider ou N pour annuler, si Y l'installation sera faite sur tous les serveurs présent dans c:\liste.txt\"
\"\"
If ($Validation -eq \"Y\"«»)
{
Get-Content -Path C:\liste.txt | ForEach-Object {
Write-host \"Installation sur $_\"
#Mappage d'un disque
$Drive = \"W:\"
$UNC = \"\\$_\C$\"
$UNC
#Create the Com object with New-Object -com
$net = New-Object -com WScript.Network;
#$net.removenetworkdrive($Drive)
$net.mapnetworkdrive($Drive,$Unc)
#Copie des sources sur le serveur distant
Copy-Item \"$AppLocation\" -destination \"W:\temp\\" -recurse
#Création de la commande
$Commande=\"$Binaire\psexec.exe \\$_ c:\Temp\$AppLocationCourt\$Setup $Para\"
$Commande
#Lancement de la commande
Invoke-Expression $Commande
remove-item \"W:\Temp\$AppLocationCourt\\" -recurse
#Demappage du disque
$net.removenetworkdrive($Drive)
}
}
Else {\"Installation annulé\"}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.046 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Lancer une commande cmd à partir d'un script ps