带有显式参数的 Powershell 参数集解析失败

Ste*_*e B 4 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

}
Run Code Online (Sandbox Code Playgroud)

我希望这种方法可以期待 A 或 B 或两者兼而有之。从来没有。

但是,如果我称之为:

Foo -A 1 -B 2 # outputs "both" as expected
Foo -B 3 # error
Foo -A 4 # error
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

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
Run Code Online (Sandbox Code Playgroud)

我很烦恼,因为如您所见,我明确指定了参数的名称。

我应该如何编写我的函数以按预期工作?

MDM*_*313 6

你可能想在你的函数中实现参数检查。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"

}
Run Code Online (Sandbox Code Playgroud)

我认为分配$C默认值会提供您预期的行为,但它不会 b/c 在调用函数时必须显式声明参数。

您会注意到我将 DefaultParameterSetName 设置为“无”。这样做是为了让您快速检查是否未提交任何参数。

你可以这样做检查,如果$PsCmdlet.ParameterSetName -eq "None"随后Read-Host的变数,您要提供的,或者只是输出,说任何一个变量的错误ab应提供。

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