1

Хотите выполнить 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 ответ1

1

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

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

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

& $PSCmdlet.ParameterSetName @PSBoundParameters

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .