Ingin mengeksekusi Invoke-Expression
dengan parameter yang dapat bervariasi tergantung pada input
Memiliki masalah dengan $MyArgs
logika. Seharusnya hanya berisi parameter yang dimasukkan
Masukan (contoh):
./foo.ps1 -Name aa -Server bb -Datastore cc
Keluaran:
Get-VM -Name aa -Server bb -Datastore cc
Kode:
[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
Command
, tetapi eksekusi akan dilakukan di localhostJawaban:
Kami akan menggunakan tiga fitur PowerShell:
&
, memanggil perintah yang namanya dapat ditentukan oleh ekspresi. Tidak seperti ituInvoke-Expression
, ia dapat menangani parameter terikat tanpa meregangkan segalanya.$PSBoundParameters
variabel adalah hashtable dari parameter yang ditentukan untuk cmdlet saat ini dan nilainya.$PSBoundParameters
: ia menggunakan hashtable sebagai parameter terikat ke cmdlet.Menyatukan semuanya, kami mengganti Anda
Invoke-Expression
doa dengan ini, memanggil cmdlet yang namanya parameter set nama dan meneruskannya semua parameter fungsi:sumber