2010-01-26 15 views
14

Próbuję uruchomić zewnętrzny exe ze skryptu powłoki.powershell wysyłanie wielu parametrów do zewnętrznego polecenia

Ten exe chce 4 parametry.

Próbowałem każdego combo elementu invoke, invoke-command, & "C: \ program files \ mycmd.exe myparam", wykonałem skrót w C: \, aby pozbyć się spacji na ścieżce.

Mogę sprawić, aby działał z jednym parametrem, ale nie z większą liczbą. Dostaję różne błędy.

Podsumowując, w jaki sposób wysyłasz 4 parametry do exe?

Odpowiedz

20

Najlepiej jeśli jest wyświetlany w trybie longhand. Gdy zobaczysz, co się dzieje, możesz je skrócić, używając tylko przecinków między poszczególnymi argumentami.

$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 

... skrótowym:

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

Uważaj na '& 'C: \ program files \ someapp \ somecmd.exe" -arg $ allArgs' - 'arg "nie jest konieczne, chyba że masz zamiar przekazać' -arg' jako parametr somecmd .exe. –

+0

Tak, z jakiegokolwiek powodu, o którym wspomniałem dzisiaj, i zauważyłem, że linia kodu z zawartością -arg w ogóle nie działała! Ups/removed. –

12

W łatwego przypadku, przekazując argumenty do rodzimej exe jest tak proste, jak za pomocą wbudowanego polecenia:

PS> ipconfig /allcompartments /all 

Ty możliwe, napotkasz problemy, gdy podasz pełną ścieżkę do EXE i ta ścieżka zawiera spacje. Na przykład jeśli PowerShell widzi to:

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

on interpretuje polecenia jest "C: \ Program" i "Files \ Microsoft" jako pierwszy parametr „SDK \ Windows \ v7.0 \ Bin \ sn. exe”jako drugi parametr itp prostym rozwiązaniem jest umieszczenie ścieżki w ciąg użyć operatora inwokacja & aby wywołać polecenie nazwany przez np ścieżki:

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

Kolejnym obszarem my napotkasz problemy z jest, gdy argumenty są złożone i/lub używają znaków, które PowerShell interpretuje specjalnie, np .:

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

To nie działa i możemy to debugować za pomocą narzędzia z PowerShell Community Extensions o nazwie echoargs.exe, które pokazuje dokładnie, w jaki sposób natywny EXE otrzymuje argumenty z 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> 

Należy zauważyć, że z Arg3 $(user) jest interpretowany & oceniane przez PowerShell i wyników w pustym ciągiem. Można rozwiązać ten problem i dużą liczbę podobnych problemów przy użyciu apostrofów zamiast podwójnych qoutes chyba że naprawdę musisz PowerShell ocenić zmiennej np

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> 

Jeśli wszystko inne zawiedzie, należy użyć tutaj ciąg i Start- proces taki sposób:

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> 

Uwaga, jeśli używasz PSCX 1.2 trzeba będzie poprzedzić start-Process jak tak - Microsoft.PowerShell.Management\Start-Process użyć wbudowanego apletu polecenia start-Process PowerShell jest.

+0

Hm; widząc to, zastanawiam się ponownie: czy istnieje dobry powód, aby zachować wersje cmdletów PSCX, które zawiera PowerShell v2? Get-Random wywołał mnie kilka razy z powodu całkowicie odmiennej semantyki. – Joey

+0

Nie, nie ma. Tak więc przenieśliśmy trzy cmdlety, które mają nazwy kolizji do osobnego modułu w PSCX 2.0 (Pscx.Deprecated.psd1). Dostępna jest wersja 2.0 beta do pobrania, ale ponieważ jest oparta na modułach, działa tylko na PowerShell 2.0. –

+2

Właśnie zauważyłem to: [PowerShell i polecenia zewnętrzne wykonane w prawo] (http://edgylogic.com/blog/powershell-and-external-commands-done-right/). Prawie identyczna rada. –

Powiązane problemy