175 votes

Exécution d'une commande stockée dans une variable depuis PowerShell

J'ai une commande que j'ai construite et stockée dans une variable dans PowerShell. Cette commande fonctionne si je fais un Write-Host et copier-coller dans un fichier standard cmd.exe fenêtre.

Comment exécuter cette commande à l'intérieur de mon script ?

J'ai essayé plusieurs combinaisons de Invoke-Command ou Invoke-Expression, sans succès.

C'est ainsi que j'ai construit la variable :

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

Voici à quoi ressemble la variable si elle est imprimée à l'écran :

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

0 votes

Ce n'est pas juste le symbole '&' ? stackoverflow.com/questions/22074507/

248voto

Roman Kuzmin Points 13913

Voici encore un autre moyen sans Invoke-Expression mais avec deux variables (command:string et parameters:array). Cela fonctionne bien pour moi. Supposons que 7z.exe est dans le chemin du système.

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

Si la commande est connue (7z.exe) et que seuls les paramètres sont variables, ceci fera l'affaire.

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

BTW, Invoke-Expression avec un paramètre fonctionne aussi pour moi, par exemple ceci fonctionne

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

P.S. Je préfère généralement la méthode avec un tableau de paramètres car elle est plus facile à de composer de manière programmatique que de construire une expression pour Invoke-Expression .

0 votes

C'est génial. Ça commence à prendre forme maintenant. Au lieu de 'c' : \temp\with espace \test1.zip Puis-je simplement utiliser une $variable ? Dois-je le placer en "" ou '' ?

0 votes

Le fractionnement semble fonctionner de la même manière : & $cmd @prm Mais je suis curieux de savoir pourquoi

0 votes

Ça ne marche pas : $path=C:\blah y & $path\test.exe blah1 .

56voto

kbrimington Points 14081

Essayez d'invoquer votre commande avec Invoke-Expression :

Invoke-Expression $cmd1

Voici un exemple fonctionnel sur ma machine :

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iex est un alias para Invoke-Expression pour que vous puissiez le faire :

iex $cmd1

Pour une liste complète : Visitez https://ss64.com/ps/ pour plus Powershell truc.

Bonne chance...

0 votes

Il me dit que le terme '7z.exe a -tzip c : \arc_logs\site -host-at-web1-100827.zip c : \inetpub\logs\logfiles\w3svc1\u_ex100827.log ' n'est pas reconnu comme le nom d'un cmdlet, d'une fonction, d'un fichier script ou d'un programme exploitable. Vérifiez l'orthographe du nom, ou si un chemin d'accès a été inclus, vérifiez que le chemin d'accès est correct et réessayez. À :ligne:14 char:1 + & <<<< $cmd1

0 votes

@Travis : Oops. L'esperluette fonctionne s'il n'y a pas d'args. J'ai mis à jour le post avec une solution pour votre commande.

0 votes

J'ai déjà essayé invoke-expression et cela n'a pas fonctionné. L'erreur suivante s'affiche : Bad numeric constant : 7. At :line:1 char:2 + 7z <<<< .exe a -tzip c : \arc_logs\site -host-at-web1-100827.zip c : \inetpub\logs\logfiles\w3svc1\u_ex100827.log On dirait presque qu'il essaie de l'évaluer au lieu de l'exécuter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X