вызов Invoke-выражения с параметрами в Powershell
Я написал модуль powershell на c#, который имеет кучу командлетов, таких как
добавить-VM
командлеты обращаются к API и извлекают данные обратно.
но ради единообразия с SSH CLI продукта я написал функцию под названием newtask, которая принимает "addvm" в качестве аргумента и $args.
newtask addvm -id 12345
затем я вызываю Add-VM и передаю $args в виде строки типа so
Invoke-Expression Add-VM $argstr
проблема эта надстройка-VM выдает ошибку, что она не может найти позиционный параметр, который принимает систему аргументов.Object []
не удается найти позиционный параметр, который принимает систему аргументов.Объект[]'
хотя я мог бы легко псевдоним "addvm" к "Add-VM", я пытаюсь поддерживать единообразие с SSH CLI, чтобы новые пользователи могли быстро начать использовать этот модуль.
Я решил, что достаточно отправить строку типа '- id 12345', но это не так. Ожидает ли pscmdlet получить что-то еще?
спасибо заранее.
2 ответов
эта ошибка от Invoke-Expression не Add-VM, и вам просто нужны кавычки вокруг аргумента:
Invoke-Expression "Add-VM $argstr"
это имеет недостаток принуждения всех объектов к строковому формату. Это может быть приемлемо для простых типов, таких как ints и strings, но если вы хотите пройти через более сложный объект, это не сработает. Альтернативой было бы разбить аргументы на @args
но я не думаю, что вы можете сделать это через Invoke-Expression или Invoke-Command. Вам нужно сразу вызвать командлет:
function newtask {
params([string]$command)
switch ($command) {
"addvm" { Add-VM @args }
"deletevm" { Remove-VM @args }
}
}
Я знаю, что это немного устарело, но у меня была аналогичная проблема, и сотрудник показал мне, что экранирование $argstr предотвращает преобразование объекта в строку.
Invoke-Expression "Add-VM `$argstr"