powershell отправка нескольким параметр к внешней команде

Я пытаюсь управлять внешним exe из powershell сценария.

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

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

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

Таким образом, как Вы посылаете 4 параметра в exe?

14
задан falkaholic 26 January 2010 в 01:56
поделиться

2 ответа

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

$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

... Shothand:

& "C:\Program Files\someapp\somecmd.exe" "filename1", "-someswitch", "C:\documents and settings\user\desktop\some other file.txt", "-yetanotherswitch"
22
ответ дан 1 December 2019 в 07:51
поделиться

В простых случаях передача аргументов на родной EXE так просто, как и использование встроенного команды:

PS> ipconfig /allcompartments /all

Вы можете столкнуться с проблемами, когда вы указываете полный путь к EXE, и этот путь содержит пробелы. Например, если PowerShell видит это:

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

интерпретирует команду «C: \ Program» и «файлы \ 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 Community Extensions , называется 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 $ (пользователь) интерпретируется и оценивается PowerShell и приводит к тому, что в пустой строке. Вы можете исправить эту проблему и хорошее количество подобных проблем, используя отдельные кавычки вместо двойных qoutes, если вам действительно не нужна 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>

, если все остальное не удалось, используйте здесь string и Start, например:

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, вам нужно будет префиксировать начальный процесс, например, настолько - Microsoft.PowerShell.management \ START-PLACE для использования встроенного командлета PowerShell.

12
ответ дан 1 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: