powershell 为什么当有一个参数集时,没有参数的参数绑定会成功,而有两个参数集的参数绑定会失败?

h4cxqtbf  于 2023-01-09  发布在  Shell
关注(0)|答案(2)|浏览(140)

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

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 }
}

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

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不使用“__AllParameterSets“参数集绑定到TwoSets
有没有一种(简洁的)方法可以在拥有多个参数集的同时仍然能够调用没有参数的函数?

fdbelqdn

fdbelqdn1#

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

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

mlnl4t2r2#

编辑:我认为可以用None来代替__AllParameterSets,以达到"创建一个根本没有强制参数的参数集"的目的,更多细节请参见PowerShell/PowerShell#11237#12619#11143
我不明白为什么第二种情况比第一种情况更模糊。为什么PowerShell不使用"__AllParameterSets"参数集绑定到TwoSet?
当只有一个用户命名的参数集时,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

相关问题