Invocar/ejecutar comando con un número desconocido de parámetros, en PowerShell

Invocar/ejecutar comando con un número desconocido de parámetros, en PowerShell

Quiere ejecutar Invoke-Expressioncon parámetros que pueden variar según la entrada.

Tener un problema con $MyArgsla lógica. Debe contener solo los parámetros ingresados.

Entrada (ejemplo):

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

Producción:

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

Respuesta1

Usaremos tres funciones de PowerShell:

  • El operador de llamada &, invoca un comando cuyo nombre puede especificarse mediante una expresión. A diferencia de Invoke-Expression, puede manejar parámetros vinculados sin encadenar todo.
  • La $PSBoundParametersvariable es una tabla hash de los parámetros especificados para el cmdlet actual y sus valores.
  • Salpicadurases como lo contrario de $PSBoundParameters: utiliza una tabla hash como parámetros vinculados a un cmdlet.

Juntándolo todo, reemplazamos su Invoke-Expressioninvocación con esto, llamando a un cmdlet cuyo nombre es el nombre del conjunto de parámetros y pasándole todos los parámetros de la función:

& $PSCmdlet.ParameterSetName @PSBoundParameters

información relacionada