在 PowerShell 中呼叫/執行帶有未知數量參數的命令

在 PowerShell 中呼叫/執行帶有未知數量參數的命令

想要使用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

相關內容