Invocar/executar comando com um número desconhecido de parâmetros, no PowerShell

Invocar/executar comando com um número desconhecido de parâmetros, no PowerShell

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

Tendo um problema com $MyArgsa lógica. 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

Responder1

Usaremos três recursos do PowerShell:

  • O operador de chamada &invoca um comando cujo nome pode ser especificado por uma expressão. Ao contrário Invoke-Expression, ele pode lidar com parâmetros vinculados sem restringir tudo.
  • A $PSBoundParametersvariável é uma tabela hash dos parâmetros especificados para o cmdlet atual e seus valores.
  • Respingosé como o inverso de $PSBoundParameters: ele usa uma tabela hash como parâmetros vinculados a um cmdlet.

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

& $PSCmdlet.ParameterSetName @PSBoundParameters

informação relacionada