2010-01-26 15 views
14

Ich versuche, eine externe exe von einem Powershell-Skript ausführen.Powershell Senden mehrerer Parameter an einen externen Befehl

Diese exe will 4 Parameter.

Ich habe versucht, jede Kombination von Invoke-Element, Invoke-Befehl, & 'C: \ Programme \ Mycmd.exe Myparam', eine Verknüpfung in C: \ gemacht, um die Leerzeichen im Pfad loszuwerden.

Ich kann es mit einem Parameter arbeiten, aber nicht mit mehr. Ich bekomme verschiedene Fehler.

Zusammenfassend, wie senden Sie 4 Parameter an eine EXE?

Antwort

20

Es ist am besten, wenn es in Longhand gezeigt wird. Sobald Sie sehen, was vor sich geht, können Sie es abkürzen, indem Sie nur Kommas zwischen den einzelnen Argumenten verwenden.

$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 

... Stenografie:

& "C:\Program Files\someapp\somecmd.exe" "filename1", "-someswitch", "C:\documents and settings\user\desktop\some other file.txt", "-yetanotherswitch" 
+3

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. –

+0

Ja, aus welchem ​​Grund auch immer habe ich heute darauf hingewiesen, und bemerkte, dass die Codezeile mit dem -arg nicht einmal funktioniert! Ups/entfernt. –

12

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.

+0

Hm; Wenn ich das sehe, frage ich mich: Gibt es einen guten Grund, die PSCX-Versionen von Cmdlets beizubehalten, die PowerShell v2 enthält? Get-Random hat mich aufgrund seiner komplett anderen Semantik ein paar Mal gestolpert. – Joey

+0

Nein, gibt es nicht. Daher haben wir die drei Cmdlets mit Namenskollisionen in ein separates Modul in PSCX 2.0 (Pscx.Deprecated.psd1) verschoben. Es gibt eine Betaversion 2.0, die zum Download verfügbar ist, aber weil sie modulbasiert ist, funktioniert sie nur auf PowerShell 2.0. –

+2

Ich habe es gerade bemerkt: [PowerShell und externe Befehle richtig gemacht] (http://edgylogic.com/blog/powershell-and-external-commands-done-right/). Fast identischer Rat. –

Verwandte Themen