PowerShell参数集组



我的函数有两组参数(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对于初始测试是有用的。

最新更新