假设我有这个功能:
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