使用明確參數的 Powershell 參數集解析失敗

使用明確參數的 Powershell 參數集解析失敗

假設我有這個功能:

function Foo{
    [CmdLetBinding()]
    param(
        [Parameter(Mandatory=$true,ParameterSetName="A",Position=0)] 
        [Parameter(Mandatory=$true,ParameterSetName="both",Position=0)] 
        [int]
        $A,

        [Parameter(Mandatory=$true,ParameterSetName="B",Position=0)] 
        [Parameter(Mandatory=$true,ParameterSetName="both",Position=1)] 
        [int]
        $B
    )

    Write-Host $PsCmdlet.ParameterSetName

}

我希望這個方法能夠得到 A 或 B 或兩者。從來沒有。

但是,如果我這樣稱呼:

Foo -A 1 -B 2 # outputs "both" as expected
Foo -B 3 # error
Foo -A 4 # error

我得到的錯誤是:

Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto:75 char:4
+ Foo <<<<  -B 3
    + CategoryInfo          : InvalidArgument: (:) [Foo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Foo

Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto.ps1:76 char:4
+ Foo <<<<  -A 4
    + CategoryInfo          : InvalidArgument: (:) [Foo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Foo

我很困擾,因為正如您所看到的,我明確指定了參數的名稱。

我應該如何編寫我的函數才能按預期工作?

答案1

那麼您可能想要在您的函數中實現參數檢查。 MS 表示參數集必須有一個對其參數集來說是唯一的參數。因此,每個參數集必須有一個不屬於任何其他參數集的參數,這就是當嘗試呼叫只有一個參數的函數時出錯的原因,它不知道要分配哪個參數集b/ c 提供的參數對於特定參數集來說不是唯一的。我接近了

 function Foof{
[CmdLetBinding(DefaultParameterSetName="None")]
param(

    [Parameter(Mandatory=$false,ParameterSetName="A")]
    [Parameter(Position=0)]
    [int]
    $A,

    [Parameter(Mandatory=$false,ParameterSetName="B")]
    [Parameter(Mandatory=$false,ParameterSetName="both")]  
    [Parameter(Position=1)]
    [int]
    $B,

    [Parameter(Mandatory=$false,ParameterSetName="both")]  
    [int]
    $C=$true

)

Write-Host $PsCmdlet.ParameterSetName
write-host "A=$A and B=$B and C=$C"

}

我認為分配$C預設值會給出您預期的行為,但這並不意味著在呼叫函數時必須明確聲明參數。

您會注意到我將 DefaultParameterSetName 設為“None”。這樣做的目的是讓您快速檢查兩個參數是否都未提交的情況。

您可以執行類似檢查是否需要提供任何變數之類的$PsCmdlet.ParameterSetName -eq "None"操作Read-Host,或者只是輸出一個錯誤,指出應提供變數a或變數。b

http://technet.microsoft.com/en-us/library/hh847743.aspx

相關內容