Подтвердить что ты не робот

Динамически генерировать команду командной строки, а затем вызывать использование powershell

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

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

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

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

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

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

Я получаю сообщение об ошибке:

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

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

4b9b3361

Ответ 1

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

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

$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. Если все должно быть в строке, вы можете вызвать строку, как если бы это было нормальное выражение. Invoke-Expression также имеет псевдоним iex.

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

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

Ответ 2

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

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

&([scriptblock]::create($commandstring))