我正在努力理解参数集和位置绑定的行为。这是示例函数。
function Test-PositionBinding {
[CmdletBinding(DefaultParameterSetName = 'ParamSet2')]
param (
[Parameter(ParameterSetName='ParamSet1',Position = 0)]
[int]
$param1,
[Parameter(ParameterSetName='ParamSet1',Position = 1)]
[int]
$param2,
[Parameter(ParameterSetName='ParamSet2',Position = 0)]
[int]
$param3
)
process {
$PSCmdlet.ParameterSetName
$param1
$param2
$param3
}
}
根据帮助输出,似乎用单个 int 调用函数应该使用 paramset1,用 2 int 调用它应该使用 paramset2,这是我所期望的。
SYNTAX
Test-PositionBinding [[-param3] <int>] [<CommonParameters>]
Test-PositionBinding [[-param1] <int>] [[-param2] <int>] [<CommonParameters>]
但是,我收到以下输出。
PS C:\> Test-PositionBinding 1
ParamSet2
0
0
1
PS C:\> Test-PositionBinding 1 2
Test-PositionBinding: A positional parameter cannot be found that accepts argument '2'.
我会期待以下。
PS C:\> Test-PositionBinding 1 2
ParamSet1
1
2
0
如果我们将 param1 的类型更改为字符串,则函数按预期工作。
PS C:\> Test-PositionBinding 1
ParamSet2
0
1
PS C:\> Test-PositionBinding 'abc'
ParamSet1
abc
0
0
PS C:\> Test-PositionBinding 'abc' 2
ParamSet1
abc
2
0
我对 PS 解释参数集的方式有什么误解?
最终我的问题是,如果第一个参数在集合之间的类型相同,为什么 PS 无法区分具有位置绑定和不同参数计数的 2 个参数集。