powershell envoie plusieurs paramètres à une commande externe

j'essaie d'exécuter un exe externe à partir d'un script powershell.

cet exe veut 4 Paramètres.

j'ai essayé chaque combo d'invoke-item, invoke-command, & 'C:program files mycmd.exe myparam', a fait un raccourci en C: pour se débarrasser des espaces dans le chemin.

je peux le faire fonctionner avec un seul paramètre, mais pas plus. Je reçois plusieurs erreurs.

pour résumer, comment envoyer 4 Paramètres À une exe?

14
demandé sur falkaholic 2010-01-26 04:56:40

2 réponses

c'est mieux si on le montre en longhand. Une fois que vous voyez ce qui se passe, vous pouvez le raccourcir en utilisant simplement des virgules entre chaque argument.

$arg1 = "filename1"
$arg2 = "-someswitch"
$arg3 = "C:\documents and settings\user\desktop\some other file.txt"
$arg4 = "-yetanotherswitch"

$allArgs = @($arg1, $arg2, $arg3, $arg4)

& "C:\Program Files\someapp\somecmd.exe" $allArgs

... abréviation:

& "C:\Program Files\someapp\somecmd.exe" "filename1", "-someswitch", "C:\documents and settings\user\desktop\some other file.txt", "-yetanotherswitch"
21
répondu Peter Seale 2010-08-18 20:19:23

dans le cas facile, passer des arguments à un exe natif est aussi simple que d'utiliser une commande intégrée:

PS> ipconfig /allcompartments /all

vous pouvez rencontrer des problèmes lorsque vous spécifiez un chemin complet vers un EXE et que ce chemin contient des espaces. Par exemple si PowerShell voit ceci:

PS> C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe -k .\pubpriv.snk

qu'Il interprète la commande "C:\Program" et "Files\Microsoft" en tant que premier paramètre, "SDKs\Windows\v7.0\Bin\sn.exe" comme second paramètre, etc. Simple la solution est de mettre le chemin dans une chaîne en utilisant l'opérateur d'invocation & pour invoquer la commande nommée par le chemin par exemple:

PS> & 'C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe' -k .\pubpriv.snk

la prochaine zone où nous rencontrons des problèmes est lorsque les arguments sont complexes et / ou utilisent des caractères que PowerShell interprète spécialement, par exemple:

PS> sqlcmd -v user="John Doe" -Q "select '$(user)' as UserName"

cela ne fonctionne pas et nous pouvons corriger cela en utilisant un outil du Extensions de communauté de PowerShell appelé echoargs.exe qui vous montre exactement comment L'EXE natif reçoit les arguments de PowerShell.

PS> echoargs -v user="John Doe" -Q "select '$(user)' as UserName"
The term 'user' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, ...
<snip>

Arg 0 is <-v>
Arg 1 is <user=John Doe>
Arg 2 is <-Q>
Arg 3 is <select '' as UserName>

notez qu'avec Arg3 $(user) est interprété et évalué par PowerShell et résulte en une chaîne vide. Vous pouvez corriger ce problème et un bon nombre de problèmes similaires en utilisant des guillemets simples au lieu de deux qoutes à moins que vous ayez vraiment besoin de PowerShell pour évaluer une variable par exemple:

PS> echoargs -v user="John Doe" -Q 'select "$(user)" as UserName'
Arg 0 is <-v>
Arg 1 is <user=John Doe>
Arg 2 is <-Q>
Arg 3 is <select $(user) as UserName>

si tout le reste échoue, utiliser un ici la chaîne et le lancement du Processus de la sorte:

PS> Start-Process echoargs -Arg @'
>> -v user="John Doe" -Q "select '$(user)' as UserName"
>> '@ -Wait -NoNewWindow
>>
Arg 0 is <-v>
Arg 1 is <user=John Doe>
Arg 2 is <-Q>
Arg 3 is <select '$(user)' as UserName>

Remarque Si vous utilisez PSCX 1.2, vous devrez utiliser le préfixe Start-Process comme so - Microsoft.PowerShell.Management\Start-Process pour utiliser le cmdlet Start-Process de PowerShell.

12
répondu Keith Hill 2010-01-26 04:50:42