为什么只有一个参数集时参数绑定在没有参数的情况下成功,而有两个参数绑定却失败了?
Why does parameter binding succeed with no arguments when there is one parameter set but fails with two?
我有两个功能。第一个有一个参数集,第二个有两个参数集如下:
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 不使用“__AllParameterSets
”参数集绑定到 TwoSets
?
是否有一种(简洁的)方法来拥有多个参数集并且仍然能够调用不带参数的函数?
编辑:添加了 Mandatory
关键字以更准确地表示我的困境。
这是因为 PowerShell 无法确定您要使用的参数集。您可以在 CmdletBinding 属性中告诉它默认值。
function TwoSets{
[CmdletBinding(DefaultParameterSetName='A')]
param ( $NoSet,
[parameter(ParameterSetName = 'A')]$A,
[parameter(ParameterSetName = 'B')]$B )
process { $PSCmdlet.ParameterSetName }
}
编辑:我认为 None
可以替代 __AllParameterSets
以实现 "creating a parameter set with no mandatory parameters at all" 的目标。有关详细信息,请参阅 PowerShell/PowerShell#11237, #12619, and #11143
I don't see why the second case is any more ambiguous than the first. Why doesn't PowerShell bind to TwoSets using the "__AllParameterSets
" parameter set?
当只有一个用户命名的参数集时,PowerShell 似乎使用 __AllParameterSets
参数集作为默认值。另一方面,当有多个用户命名的参数集时,PowerShell 似乎不会将任何参数集视为默认值,除非您指定它。
Is there a (terse) way to have multiple parameter sets and still be able to call the function with no arguments?
您可以告诉 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
我有两个功能。第一个有一个参数集,第二个有两个参数集如下:
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 不使用“__AllParameterSets
”参数集绑定到 TwoSets
?
是否有一种(简洁的)方法来拥有多个参数集并且仍然能够调用不带参数的函数?
编辑:添加了 Mandatory
关键字以更准确地表示我的困境。
这是因为 PowerShell 无法确定您要使用的参数集。您可以在 CmdletBinding 属性中告诉它默认值。
function TwoSets{
[CmdletBinding(DefaultParameterSetName='A')]
param ( $NoSet,
[parameter(ParameterSetName = 'A')]$A,
[parameter(ParameterSetName = 'B')]$B )
process { $PSCmdlet.ParameterSetName }
}
编辑:我认为 None
可以替代 __AllParameterSets
以实现 "creating a parameter set with no mandatory parameters at all" 的目标。有关详细信息,请参阅 PowerShell/PowerShell#11237, #12619, and #11143
I don't see why the second case is any more ambiguous than the first. Why doesn't PowerShell bind to TwoSets using the "
__AllParameterSets
" parameter set?
当只有一个用户命名的参数集时,PowerShell 似乎使用 __AllParameterSets
参数集作为默认值。另一方面,当有多个用户命名的参数集时,PowerShell 似乎不会将任何参数集视为默认值,除非您指定它。
Is there a (terse) way to have multiple parameter sets and still be able to call the function with no arguments?
您可以告诉 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