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