Deseja executar Invoke-Expression
com parâmetros que podem variar dependendo da entrada
Tendo um problema com $MyArgs
a 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árioInvoke-Expression
, ele pode lidar com parâmetros vinculados sem restringir tudo. - A
$PSBoundParameters
variá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-Expression
invocaçã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