вызов 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"