Powershell: вызывать exe с параметрами из элементов в массиве? - PullRequest
3 голосов
/ 12 августа 2010

У меня есть набор команд, которые я хотел бы запустить и сделать некоторые проверки кода возврата результата, поэтому я подумал, что было бы легко поместить их в массив для выполнения.

Давайте возьмем этоодин в качестве примера:

C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section system.webServer/webdav/authoring /enabled:true /commit:apphost

Теперь, когда я помещаю его в свой массив без кавычек, он немедленно интерпретируется как команда, команда выполняется и результат записывается вмассив:

$commands = @()
$commands += C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section system.webServer/webdav/authoring /enabled:true /commit:apphost

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

PS> $commands = @()
PS> $commands += "C:\windows\system32\inetsrv\AppCmd.exe set config ""Default Web Site/"" /sectio n:system.webServer/webdav/authoring /enabled:true /commit:apphost"
PS> $commands[0]
C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /enabled:true /commit:apphost
PS> & $commands[0]
The term 'C:\windows\system32\inetsrv\AppCmd.exe set config "Default Web Site/" /section:system.webServer/webdav/authoring /enabled:true /commit:apphost' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
        At line:1 char:2
        + & <<<<  $commands[0]
            + CategoryInfo          : ObjectNotFound: (C:\windows\syst.../commit:apphost:String) [], CommandNotFoundException
            + FullyQualifiedErrorId : CommandNotFoundException

Итак, как правильно поставитьэта команда в массив, очередь или что-нибудь еще подходит, чтобы я мог выполнить ее, когда настало время?

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Когда вы используете оператор вызова &, следующая за ней строка должна называть только команду, которую нужно выполнить, а не какие-либо параметры. С тем, что вы настроили, вы можете использовать Invoke-Expression вместо, например ::

iex $command[0]

Одно предупреждение о выражении Invoke, будьте осторожны при использовании этой команды, если какой-либо ввод поступает от пользователя, так как он может использоваться для ввода нежелательных команд, например ::10000

Read-Host "Enter commit value"
Enter commit value: apphost; remove-item c:\ -r -force -ea 0 -confirm:0 #
0 голосов
/ 14 января 2014

Даже позже: я думаю этот ответ и этот другой ответ от пользователя Роман Кузьмин внимательно решит эту проблему, сохранив имя исполняемого файла в переменной и все его параметры в массиве.

0 голосов
/ 09 сентября 2011

Ну, я на год опаздываю на вечеринку, но вы также можете сделать это:

new-alias -name Monkey -value "$ env: windir \ system32 \ inetsrv \ APPCMD.exe"

...