Динамически генерировать команду командной строки, а затем вызывать использование powershell
Используя powershell, вы можете использовать '&' для запуска другого приложения и передачи параметров.
Простой пример.
$notepad = 'notepad'
$fileName = 'HelloWorld.txt'
# This will open HelloWorld.txt
& $notepad $fileName
Это хорошо. Но что, если я хочу использовать бизнес-логику для динамического создания командной строки? Используя тот же простой пример:
$commandString = @('notepad', 'HelloWorld.txt') -join ' ';
& $commandString
Я получаю сообщение об ошибке:
Термин "блокнот HelloWorld.txt" не признается именем командлет, функция, script файл или действующая программа. Проверьте правописание от имени, или если путь был включите, убедитесь, что путь исправить и повторить попытку.
В моем реальном примере я пытаюсь динамически добавлять или удалять параметры в финальную строку командной строки. Есть ли способ, которым я могу это сделать?
Ответы
Ответ 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))