我有两个功能。第一个有一个参数集,第二个有两个参数集如下:
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
关键字,以更准确地表示我的困境。
答案 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