Question Lancer une commande cmd à partir d'un script ps

Plus d'informations
il y a 16 ans 6 mois #5204 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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 6 mois #5208 par Lymnia
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 \&quot;commande\&quot; in cmd.exe :woohoo:
ç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.

Pour WMI, pensez &agrave; scriptomatic &ccedil;a peut aider quand on connait pas la classe que l'on voudrait utiliser.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 6 mois #5209 par Laurent Dardenne
bvivi57 écrit:

Le simple appel de la variable $Commande, m'affiche son contenu mais n'exécute pas la ligne en question.

Tu peux utiliser Invoke-Expression $Commande. Pour info je suis en train d'écrire un tuto sur le dynamisme sous PS...

Lymnia écrit:

mais j'ai un truc simple mais compliqué parce qu'il doit y avoir mieux:pinch: ^^

Tu voulais peut être dire, \&quot;pas très élégant\&quot; ?
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:

ça ma ouvert une fenêtre dos et :( ça ma refermé la fenêtre aussitôt.

Tu peux utiliser ceci:
[code:1]
function Start-Process([string]$Path,[string]$Parameters)
{
[diagnostics.process]::«»start($Path,$Parameters)
}
$Process=Start-Process \&quot;cmd\&quot; \&quot;/C dir c:\&amp;&amp;pause\&quot;
$Process=Start-Process \&quot;cmd\&quot; \&quot;/C dir z:\&amp;&amp;pause\&quot;
[/code:1]
Le \&quot;mieux\&quot; 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.

Plus d'informations
il y a 16 ans 6 mois #5234 par Burgun
merci beaucoup pour votre aide.

Invoke-Expression fonctionne parfaitemment

Voiçi le script fini :

[code:1]

\&quot;\&quot;
$PcDistant = \&quot;\&quot;
$Repertoire = \&quot;\&quot;
$AppLocationCourt=\&quot;\&quot;
$Binaire=read-host \&quot;Veuillez taper le chemin complet du dossier qui contient psexec (pas de \ à la fin) : ex c:\pstools\&quot;
\&quot;\&quot;
#Do {$pcname = Read-Host \&quot;Nom du serveur distant\&quot;} While ($pcname -eq \&quot;\&quot;«»)
\&quot;\&quot;
Do {$AppLocation = read-Host \&quot;Veuillez taper le chemin complet du dossier qui contient les sources du logiciel à installer (pas de \ à la fin) : ex c:\temp\monlogiciel\&quot;} While ($AppLocation -eq \&quot;\&quot;«»)
Do {$Setup = Read-Host \&quot;Veuillez entrer le nom du Setup : ex install.exe\&quot;} While ($AppName -eq \&quot;\&quot;«»)
\&quot;\&quot;
$Para=read-host \&quot;Veuillez taper les parametres à associer à votre setup : ex /silent ou -f\&quot;
\&quot;\&quot;
#Recuperation du chemin ou l'application se trouve (suppression de la lettre de lecteur:\)
$AppLocationCourt=$AppLocation -replace('^...', '')

Write-host \&quot;La commande qui sera exécutée sur le serveur distant est la suivante\&quot;
\&quot;\&quot;
Write-Host \&quot;psexec.exe \\Serveur c:\Temp\$AppLocationCourt\$Setup $Para\&quot;
\&quot;\&quot;
$Validation = Read-Host \&quot;Taper Y pour valider ou N pour annuler, si Y l'installation sera faite sur tous les serveurs présent dans c:\liste.txt\&quot;
\&quot;\&quot;
If ($Validation -eq \&quot;Y\&quot;«»)
{
Get-Content -Path C:\liste.txt | ForEach-Object {

Write-host \&quot;Installation sur $_\&quot;

#Mappage d'un disque
$Drive = \&quot;W:\&quot;
$UNC = \&quot;\\$_\C$\&quot;
$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 \&quot;$AppLocation\&quot; -destination \&quot;W:\temp\\&quot; -recurse


#Création de la commande
$Commande=\&quot;$Binaire\psexec.exe \\$_ c:\Temp\$AppLocationCourt\$Setup $Para\&quot;
$Commande

#Lancement de la commande
Invoke-Expression $Commande

remove-item \&quot;W:\Temp\$AppLocationCourt\\&quot; -recurse
#Demappage du disque
$net.removenetworkdrive($Drive)


}


}
Else {\&quot;Installation annulé\&quot;}
[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.061 secondes
Propulsé par Kunena