Вызов/выполнение команды с неизвестным количеством параметров в PowerShell

Вызов/выполнение команды с неизвестным количеством параметров в PowerShell

Хотите выполнить Invoke-Expressionс параметрами, которые могут меняться в зависимости от входных данных

Возникла проблема с $MyArgsлогикой. Должен содержать только введенные параметры

Ввод (пример):

./foo.ps1 -Name aa -Server bb -Datastore cc

Выход:

Get-VM -Name aa -Server bb -Datastore cc

Код:

    [cmdletbinding(DefaultParameterSetName='Get-VM')]
    Param(
        #Common params
        [Parameter(ParameterSetName='Get-VM')]
        [Parameter(ParameterSetName='Get-Datastore')]
        [Parameter(Position = 0)]
        [String]$Name,     

        [Parameter(ParameterSetName='Get-VM')]
        [Parameter(ParameterSetName='Get-Datastore')]
        [Parameter(Position = 1)]
        [String]$Server,

        #Get-VM params
        [Parameter(ParameterSetName='Get-VM')]
        [String]$Datastore,
        [Parameter(ParameterSetName='Get-VM')]
        .
        .
        .

        #Get-Datastore params
        [Parameter(ParameterSetName='Get-Datastore')]
        [String]$Datacenter,        
        .
        .
        .
    )

Invoke-Expression -Command "$PSCmdlet.ParameterSetName $MyArgs" \\ <--- here is my problem

решение1

Мы собираемся использовать три функции PowerShell:

  • Оператор вызова, &, вызывает команду, имя которой может быть указано выражением. В отличие от Invoke-Expression, он может обрабатывать связанные параметры без стрингификации всего.
  • Переменная $PSBoundParametersпредставляет собой хеш-таблицу параметров, указанных для текущего командлета, и их значений.
  • Шлепаньеэто как бы наоборот $PSBoundParameters: он использует хеш-таблицу в качестве привязанных параметров к командлету.

Собрав все вместе, мы заменяем ваш Invoke-Expressionвызов следующим образом: вызываем командлет, имя которого совпадает с именем набора параметров, и передаем ему все параметры функции:

& $PSCmdlet.ParameterSetName @PSBoundParameters

Связанный контент