Im einfachen Fall Argumente zu einer nativen exe vorbei ist so einfach wie einen integrierten Befehl mit:
PS> ipconfig /allcompartments /all
Sie können Probleme auftreten, wenn Sie einen vollständigen Pfad zu einer EXE angeben und dieser Pfad Leerzeichen enthält. dies zum Beispiel, wenn Powershell sieht:
PS> C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe -k .\pubpriv.snk
Er interpretiert den Befehl "C: \ Program" zu sein und "Files \ Microsoft" als ersten Parameter „SDKs \ Windows \ v7.0 \ Bin \ sn. exe“als zweiten Parameter usw. die einfache Lösung ist es, den Weg in eine Zeichenfolge setzen den Aufruf Operator &
verwenden, um den durch den Pfad zB mit dem Namen Befehl aufrufen:
PS> & 'C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe' -k .\pubpriv.snk
der nächste Bereich, den wir Probleme mit ist, wenn die Argumente komplex sind und/oder Zeichen verwenden, die PowerShell speziell interpretiert, zB:
Das funktioniert nicht und wir können dies debuggen, indem Sie ein Tool aus PowerShell Community Extensions namens echoargs.exe
verwenden, das Ihnen genau zeigt, wie die native EXE die Argumente von PowerShell empfängt.
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>
Beachten Sie, dass mit Arg3 $(user)
& von Powershell und die Ergebnisse in einem leeren String ausgewertet interpretiert wird. Sie können dieses Problem und eine gute Anzahl von ähnlichen Probleme beheben durch einfache Anführungszeichen statt Doppel qoutes verwenden, wenn Sie wirklich benötigen Powershell eine Variable zB zu bewerten:
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>
Wenn alle Stricke reißen, verwenden Sie einen hier String und START- Prozess wie folgt:
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>
Hinweis, wenn Sie PSCX 1.2 verwenden Sie wie so Start-Prozess voran müssen - Microsoft.PowerShell.Management\Start-Process
Cmdlets Powershell-internen Startprozess zu verwenden.
Achten Sie auf '& 'C: \ Programme \ someapp \ somecmd.exe" -arg $ allArgs' - das '-arg' ist unnötig, es sei denn, Sie wollten' -arg' selbst als Parameter an somecmd übergeben .exe. –
Ja, aus welchem Grund auch immer habe ich heute darauf hingewiesen, und bemerkte, dass die Codezeile mit dem -arg nicht einmal funktioniert! Ups/entfernt. –