为什么参数绑定在没有参数的情况下成功,当有一个参数集但是失败时有两个?

时间:2017-04-30 01:00:16

标签: powershell parameterbinding

我有两个功能。第一个有一个参数集,第二个有两个参数集如下:

function OneSet{
    [CmdletBinding()]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A')]$A )
    process { $PSCmdlet.ParameterSetName }
}

function TwoSets{
    [CmdletBinding()]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A',Mandatory = $true)]$A,
            [parameter(ParameterSetName = 'B',Mandatory = $true)]$B  )
    process { $PSCmdlet.ParameterSetName }
}

调用不带参数的第一个会导致'__AllParameterSets'绑定:

C:\> OneSet
__AllParameterSets

调用不带参数的第二个引发异常:

C:\> TwoSets
TwoSets : Parameter set cannot be resolved using the specified named parameters.
+ TwoSets
+ ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [TwoSets], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,TwoSets

我不明白为什么第二种情况比第一种情况更模糊。为什么PowerShell不使用“TwoSets”参数集绑定到__AllParameterSets

是否有(简洁的)方法来拥有多个参数集,并且仍能够在没有参数的情况下调用该函数?

修改:添加了Mandatory关键字,以更准确地表示我的困境。

2 个答案:

答案 0 :(得分:2)

这是因为PowerShell无法确定您尝试使用哪个参数集。您可以告诉它在CmdletBinding属性中默认为什么。

function TwoSets{
    [CmdletBinding(DefaultParameterSetName='A')]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A')]$A,
            [parameter(ParameterSetName = 'B')]$B  )
    process { $PSCmdlet.ParameterSetName }
}

答案 1 :(得分:0)

  

我不明白为什么第二种情况比第一种情况更模糊。为什么PowerShell不使用“__AllParameterSets”参数集绑定到TwoSets?

当只有一个用户命名的参数集时,PowerShell似乎使用__AllParameterSets参数集作为默认值。另一方面,当有多个用户命名的参数集时,除非您指定参数,否则PowerShell似乎不会将任何参数设置为默认值。

  

是否有(简洁的)方法来拥有多个参数集,并且仍能够在没有参数的情况下调用该函数?

您可以告诉PowerShell使用__AllParameterSets作为默认值,如下所示:

function TwoSets{
    [CmdletBinding(DefaultParameterSetName = '__AllParameterSets')]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A', Mandatory = $true)]$A,
            [parameter(ParameterSetName = 'B', Mandatory = $true)]$B  )
    process { $PSCmdlet.ParameterSetName }
}

然后在没有参数的情况下调用-A-B会导致绑定到三个参数集中的每一个,如下所示:

PS C:\> TwoSets
__AllParameterSets

PS C:\> TwoSets -A 'a'
A

PS C:\> TwoSets -B 'b'
B