В простом случае передача аргументов в нативный exe так же проста, как использование встроенной команды:
PS> ipconfig /allcompartments /all
Вы можете столкнуться с проблемами, когда вы указываете полный путь к EXE, и этот путь содержит пробелы. Например, если PowerShell видит это:
PS> C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe -k .\pubpriv.snk
Она интерпретирует команду как «C: \ Program» и «Files \ Microsoft» в качестве первого параметра, «SDKs \ Windows \ v7.0 \ Bin \ sn.exe» в качестве второго параметра и т. Д. Простое решение состоит в том, чтобы поместить путь в строку, используя оператор вызова &
, чтобы вызвать команду, названную путем, например:
PS> & 'C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe' -k .\pubpriv.snk
Следующая область, с которой мы сталкиваемся, это когда аргументы являются сложными и / или используют символы, которые PowerShell интерпретирует специально, например ::
PS> sqlcmd -v user="John Doe" -Q "select '$(user)' as UserName"
Это не работает, и мы можем отладить его, используя инструмент из Расширения сообщества PowerShell , называемый echoargs.exe
, который показывает вам, как собственный EXE-файл получает аргументы из 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>
Обратите внимание, что с Arg3 $(user)
интерпретируется и оценивается PowerShell и приводит к пустой строке. Вы можете решить эту проблему и множество подобных проблем, используя одинарные кавычки вместо двойных кавычек, если вам не нужен PowerShell для оценки переменной, например ::1010
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>
Если ничего не помогает, используйте строку here и Start-Process следующим образом:
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>
Обратите внимание, что если вы используете PSCX 1.2, вам нужно добавить префикс Start-Process следующим образом - Microsoft.PowerShell.Management\Start-Process
, чтобы использовать встроенный командлет PowerShell Start-Process.