
Допустим, у меня есть такая функция:
function Foo{
[CmdLetBinding()]
param(
[Parameter(Mandatory=$true,ParameterSetName="A",Position=0)]
[Parameter(Mandatory=$true,ParameterSetName="both",Position=0)]
[int]
$A,
[Parameter(Mandatory=$true,ParameterSetName="B",Position=0)]
[Parameter(Mandatory=$true,ParameterSetName="both",Position=1)]
[int]
$B
)
Write-Host $PsCmdlet.ParameterSetName
}
Я ожидаю, что этот метод будет ожидать либо A, либо B, либо и то, и другое. Никогда ничего.
Однако, если я назову это:
Foo -A 1 -B 2 # outputs "both" as expected
Foo -B 3 # error
Foo -A 4 # error
Я получаю следующую ошибку:
Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto:75 char:4
+ Foo <<<< -B 3
+ CategoryInfo : InvalidArgument: (:) [Foo], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Foo
Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto.ps1:76 char:4
+ Foo <<<< -A 4
+ CategoryInfo : InvalidArgument: (:) [Foo], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Foo
Я забеспокоился, потому что, как вы видите, я явно указываю имя параметра.
Как мне написать функцию, чтобы она работала так, как ожидается?
решение1
Тогда вы, вероятно, захотите реализовать проверку параметров в своей функции. MS говорит, что наборы параметров должны иметь один параметр, который уникален для своего набора параметров. Таким образом, каждый набор параметров должен иметь один параметр, который не принадлежит ни одному другому набору параметров, что является причиной вашей ошибки при попытке вызвать функцию только с одним параметром, она не знает, какой набор параметров назначить, потому что предоставленный параметр не является уникальным для конкретного набора параметров. Я подошел близко с
function Foof{
[CmdLetBinding(DefaultParameterSetName="None")]
param(
[Parameter(Mandatory=$false,ParameterSetName="A")]
[Parameter(Position=0)]
[int]
$A,
[Parameter(Mandatory=$false,ParameterSetName="B")]
[Parameter(Mandatory=$false,ParameterSetName="both")]
[Parameter(Position=1)]
[int]
$B,
[Parameter(Mandatory=$false,ParameterSetName="both")]
[int]
$C=$true
)
Write-Host $PsCmdlet.ParameterSetName
write-host "A=$A and B=$B and C=$C"
}
Я думал, что назначение $C
значения по умолчанию даст ожидаемое поведение, но этого не происходит, поскольку параметр должен быть явно объявлен при вызове функции.
Вы заметите, что я установил DefaultParameterSetName на "None". Это дает вам возможность быстро проверить случай, если ни один из параметров не был отправлен.
Вы можете сделать что-то вроде проверки, если $PsCmdlet.ParameterSetName -eq "None"
затем Read-Host
указать любую переменную, которую вы хотите указать, или просто вывести ошибку, которая говорит, что должна быть указана либо переменная a
, либо .b