我的函数有两组参数(A、B(,其中组内只能使用一个参数(A1或A2、B1或B2(,两个参数都可以使用,或者只能使用一组参数。为了演示,我有以下代码。
Function Test-1{
Param(
[Parameter(ParameterSetName="A1B1")]
[Parameter(ParameterSetName="A1B2")]
[switch]$A1,
[Parameter(ParameterSetName="A2B1")]
[Parameter(ParameterSetName="A2B2")]
[switch]$A2,
[Parameter(ParameterSetName="A1B1")]
[Parameter(ParameterSetName="A2B1")]
[switch]$B1,
[Parameter(ParameterSetName="A1B2")]
[Parameter(ParameterSetName="A2B2")]
[switch]$B2
)
Write-Output "OK"
}
允许:
Test-1 -A1
Test-1 -A2
Test-1 -B1
Test-1 -B2
Test-1 -A1 -B1
Test-1 -A1 -B2
Test-1 -A2 -B2
Test-1 -A2 -B1
不允许:
Test-1 -A1 -A2
Test-1 -B1 -B2
Test-1 -A1 -B1 -B2
Test-1 -A2 -B1 -B2
Test-1 -A1 -A2 -B1
Test-1 -A1 -A2 -B2
Test-1 -A1 -A2 -B1 -B2
这项工作:
Test-1 -A1 -B1
Test-1 -A1 -B2
Test-1 -A2 -B2
Test-1 -A2 -B1
这失败了";不能使用指定的命名参数":
Test-1 -A1
Test-1 -A2
Test-1 -B1
Test-1 -B2
我该如何实现我的目标?
这是可以做到的,但当参数组合的数量增加时,显然会变得更加复杂:
Function Test-1{
Param(
[Parameter(Mandatory=$True, ParameterSetName="A1B1")]
[Parameter(Mandatory=$True, ParameterSetName="A1B2")]
[Parameter(Mandatory=$True, ParameterSetName="A1")]
[switch]$A1,
[Parameter(Mandatory=$True, ParameterSetName="A2B1")]
[Parameter(Mandatory=$True, ParameterSetName="A2B2")]
[Parameter(Mandatory=$True, ParameterSetName="A2")]
[switch]$A2,
[Parameter(Mandatory=$True, ParameterSetName="A1B1")]
[Parameter(Mandatory=$True, ParameterSetName="A2B1")]
[Parameter(Mandatory=$True, ParameterSetName="B1")]
[switch]$B1,
[Parameter(Mandatory=$True, ParameterSetName="A1B2")]
[Parameter(Mandatory=$True, ParameterSetName="A2B2")]
[Parameter(Mandatory=$True, ParameterSetName="B2")]
[switch]$B2
)
Write-Output "OK - $($PsCmdlet.ParameterSetName)"
}
我为单个参数添加了单独的集合,因为如果没有它们,powershell在仅使用-A1参数时无法解析A1B1和A1B2集合。Mandatory
子句也是需要的,因为它仍然不知道-A1是指A1集,还是指带有可选B1/B2参数的A1B1/A1B2集之一。
现在,所有场景都按预期工作。输出中的$PsCmdlet.ParameterSetName
对于初始测试是有用的。