Quiere ejecutar Invoke-Expression
con parámetros que pueden variar según la entrada.
Tener un problema con $MyArgs
la 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 deInvoke-Expression
, puede manejar parámetros vinculados sin encadenar todo. - La
$PSBoundParameters
variable 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-Expression
invocació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