1

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

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关键字以更准确地代表我的困境。

4

2 回答 2

2

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

function TwoSets{
    [CmdletBinding(DefaultParameterSetName='A')]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A')]$A,
            [parameter(ParameterSetName = 'B')]$B  )
    process { $PSCmdlet.ParameterSetName }
}
于 2017-04-30T01:47:01.803 回答
0

编辑:我认为None可以替代__AllParameterSets以实现“创建一个完全没有强制参数的参数集”的目标。有关更多详细信息,请参阅PowerShell/PowerShell#11237#12619#11143


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

__AllParameterSets当只有一个用户命名的参数集时,PowerShell 似乎将参数集用作默认值。另一方面,当有多个用户命名参数集时,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, 或-Byield 会导致绑定到三个参数集,如下所示:

PS C:\> TwoSets
__AllParameterSets

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

PS C:\> TwoSets -B 'b'
B
于 2017-04-30T03:22:53.367 回答