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


152

J'ai une commande que j'ai créée et stockée dans une variable dans PowerShell. Cette commande fonctionne si je fais un Write-Host et que je copie et colle dans une cmd.exefenêtre standard .

Comment exécuter cette commande depuis mon script?

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

Voici comment 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

Réponses:


208

Voici encore une autre manière sans Invoke-Expressionmais avec deux variables (commande: chaîne et paramètres: tableau). Ça fonctionne bien pour moi. Supposons qu'il se 7z.exetrouve 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, cela fonctionnera

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

& 7z.exe $prm

BTW, Invoke-Expressionavec un 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

PS Je préfère généralement la méthode avec un tableau de paramètres car il est plus facile de composer par programme que de créer une expression pour Invoke-Expression.


C'est super. Cela commence à se rassembler maintenant. Au lieu de 'c: \ temp \ with space \ test1.zip', puis-je simplement utiliser une variable $? Dois-je le placer sur "" ou ""?
Travis

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

44

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

iexest un alias pour Invoke-Expressiondonc vous pouvez faire:

iex $cmd1

Pour une liste complète: visitez https://ss64.com/ps/ pour plus d'informations Powershell.

Bonne chance...


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, fonction, fichier de script ou 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. À: ligne: 14 car: 1 + & <<<< $ cmd1
Travis

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

J'ai déjà essayé invoke-expression et cela n'a pas fonctionné. Il crache l'erreur: Constante numérique incorrecte: 7. À: ligne: 1 car: 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.
Travis

@Travis: Il se peut que 7z.exe ne soit pas sur votre chemin. Vérifiez qu'il se trouve sur le chemin et / ou essayez de donner le nom de chemin complet à l'exécutable dans votre expression.
kbrimington

1
@Travis: Je viens de confirmer sur mon propre système que 7z.exe a donné l'erreur que vous avez décrite, en tapant simplement à partir de l'invite de commande, mais avec le chemin complet vers 7z.exe (pour moi, c'était le cas 'C:\Program Files\7-zip\7z.exe', je pouvais exécuter 7z.exe.
kbrimington
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.