Powershell отправляет несколько параметров во внешнюю команду

Я пытаюсь запустить внешний exe из powershell script.

Этот exe хочет 4 параметра.

Я пробовал каждую комбинацию invoke-item, invoke-command и 'C:\program files\mycmd.exe myparam', сделал ярлык в C: \, чтобы избавиться от пробелов в пути.

Я могу заставить его работать с одним параметром, но не с большим количеством. Я получаю различные ошибки.

Подводя итог, как вы отправляете 4 параметра в exe?

Ответ 1

Лучше всего, если он показан в длинном руке. Когда вы увидите, что происходит, вы можете сократить его, просто используя запятые между каждым аргументом.

$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

... стенография:

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

Ответ 2

В простом случае передача аргументов нативному 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- echoargs.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 для оценки переменной, например:

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.