Invoca / executa o comando com um número desconhecido de parâmetros, no PowerShell

1

Deseja executar Invoke-Expression com parâmetros que podem variar dependendo da entrada

Tendo um problema com $MyArgs logic. Deve conter apenas parâmetros inseridos

Entrada (exemplo):

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

Saída:

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

Código:

    [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
    
por igor 05.08.2018 / 16:12

1 resposta

1

Vamos usar três recursos do PowerShell:

  • O operador de chamada, & , chama um comando cujo nome pode ser especificado por uma expressão. Ao contrário de Invoke-Expression , ele pode manipular parâmetros vinculados sem restringir tudo.
  • A variável $PSBoundParameters é uma hashtable dos parâmetros especificados para o cmdlet atual e seus valores.
  • Splatting é como o contrário de $PSBoundParameters : ele usa uma hashtable como os parâmetros associados a um cmdlet.

Juntando tudo, substituímos sua invocação Invoke-Expression por essa, chamando um cmdlet cujo nome é o nome do conjunto de parâmetros e passando todos os parâmetros da função:

& $PSCmdlet.ParameterSetName @PSBoundParameters
    
por 05.08.2018 / 20:58