Динамически генерировать команду командной строки, затем вызывать с помощью powershell - PullRequest
27 голосов
/ 07 июля 2011

Используя powershell, вы можете использовать символ '&' для запуска другого приложения и передачи параметров.

Простой пример.

$notepad = 'notepad'
$fileName = 'HelloWorld.txt'

# This will open HelloWorld.txt
& $notepad $fileName   

Это хорошо.Но что, если я хочу использовать бизнес-логику для динамического генерирования командной строки?Используя тот же простой пример:

$commandString = @('notepad', 'HelloWorld.txt') -join ' ';
& $commandString

Я получаю ошибку:

Термин «блокнот HelloWorld.txt» не распознается как имя командлета, функции, скриптафайл или работоспособная программа.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

В моем реальном примере я пытаюсь динамически добавлять или удалять параметры в окончательном варианте.строка командной строки.Есть ли способ, которым я могу пойти по этому поводу?

Ответы [ 2 ]

35 голосов
/ 07 июля 2011

Два способа сделать это:

Отделите exe от аргументов. Сделайте все ваши динамические вещи для аргументов, но вызовите exe как обычно с переменной, содержащей аргументы после:

$argument= '"D:\spaced path\HelloWorld.txt"'
$exe = 'notepad'
&$exe $argument

#or
notepad $argument

Если у вас более одного аргумента, вы должны сделать его массивом, если он будет отделен от exe-части вызова:

$arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2'
$exe = 'notepad'
&$exe $arguments

Использовать выражение-выражение. Если все должно быть в строке, вы можете вызвать строку, как если бы это было нормальное выражение. Invoke-Expression также имеет псевдоним iex.

$exp = 'notepad "D:\spaced path\HelloWorld.txt"'
Invoke-Expression $exp

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

5 голосов
/ 07 июля 2011

Если вы хотите сохранить эту логику для построения ваших строк:

$commandString = @('notepad', 'HelloWorld.txt') -join ' '

&([scriptblock]::create($commandstring))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...