想要使用Invoke-Expression
根據輸入而變化的參數來執行
邏輯有問題$MyArgs
。它應該只包含輸入的參數
輸入(範例):
./foo.ps1 -Name aa -Server bb -Datastore cc
輸出:
Get-VM -Name aa -Server bb -Datastore cc
代碼:
[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
答案1
我們將使用三個 PowerShell 功能:
- 呼叫運算符
&
呼叫其名稱可由表達式指定的命令。與 不同的是Invoke-Expression
,它可以處理綁定參數,而無需對所有內容進行字串化。 - 此
$PSBoundParameters
變數是指定給目前 cmdlet 的參數及其值的雜湊表。 - 潑濺與 的相反
$PSBoundParameters
:它使用哈希表作為 cmdlet 的綁定參數。
將所有內容放在一起,我們Invoke-Expression
用此替換您的調用,調用名稱為參數集名稱的 cmdlet 並向其傳遞所有函數的參數:
& $PSCmdlet.ParameterSetName @PSBoundParameters