2010-08-28 6 views
104

J'ai une commande que j'ai créée et stockée dans une variable dans le shell de puissance. Cette commande fonctionne si je fais un write-host et copie et passe dans une fenêtre cmd.exe standard. Comment exécuter cette commande depuis l'intérieur de mon script?Exécution d'une commande stockée dans une variable à partir de Powershell

J'ai essayé plusieurs combinaison de invoke-command ou invoke-expression sans succès.

Voilà comment je construit la variable:

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

C'est ce que la variable ressemble 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 

Répondre

136

Voici encore une autre façon sans Invoke-Expression mais avec deux variables (commande: chaîne   et   paramètres: tableau). Ça fonctionne bien pour moi. Supposons que 7z.exe se trouve 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 seuls les paramètres sont variables, cela ne fera

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

& 7z.exe $prm 

BTW, Invoke-Expression avec un seul paramètre fonctionne pour moi aussi, par exemple cela 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 le chemin avec un tableau de paramètres car il est plus facile de composer par programme que de construire une expression pour Invoke-Expression.

+0

C'est génial. Il commence à se réunir maintenant. Au lieu de 'c: \ temp \ avec espace \ test1.zip' puis-je utiliser une variable $? Ai-je besoin de placer "" ou ""? – Travis

+0

+1 pour la technique de tableau, c'est ma façon préférée de le faire. –

+0

Splatting semble fonctionner de la même façon: & $ cmd @prm Mais je suis curieux de savoir pourquoi est-ce – C2H5OH

22

essayez d'appeler votre commande avec invoke-expression.

invoke-expression $cmd1 

Voici un exemple de travail sur ma machine:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt" 
invoke-expression $cmd 
+0

Me dit 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'une cmdlet, d'une fonction, d'un fichier de script ou d'un programme utilisable. Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et réessayez. At: line: 14 char: 1 + & <<<< $ cmd1 – Travis

+0

@Travis: Oups. l'esperluette fonctionne s'il n'y a pas d'args. J'ai mis à jour le poste avec une solution pour votre commande. – kbrimington

+0

J'ai essayé invoke-expression avant et cela n'a pas fonctionné. Il crache l'erreur: Constante numérique incorrecte: 7. At: ligne: 1 char: 2 + 7z <<<< .exe un -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. – Travis

Questions connexes