Я изо всех сил пытаюсь понять поведение наборов параметров и позиционной привязки. Вот пример функции.
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 набора параметров с позиционной привязкой и разным количеством параметров, если первый параметр имеет один и тот же тип между наборами.