如何在PowerShell中定义多组互斥参数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PowerShell中定义多组互斥参数?相关的知识,希望对你有一定的参考价值。
如果有多个(互斥参数)组,有没有办法让PowerShell强制执行互斥参数?
例如,在脚本Test.ps1
中考虑这些参数(都是可选的和非位置的):
Param(
# GROUP A (a1 and a2 are mutually exclusive)
[switch]$a1,
[switch]$a2,
# GROUP B (b1 and b2 are mutually exclusive)
[switch]$b1,
[switch]$b2
)
有没有办法强制规定A组中最多一个参数(即$a1
或$a2
)和/或B组最多一个参数(即$b1
或$b2
)?
以下调用有效:
.Test.ps1
.Test.ps1 -a1
.Test.ps1 -a2
.Test.ps1 -b1
.Test.ps1 -b2
.Test.ps1 -a1 -b1
.Test.ps1 -a1 -b2
.Test.ps1 -a2 -b1
.Test.ps1 -a2 -b2
以下调用无效:
.Test.ps1 -a1 -a2 -b1 -b2
.Test.ps1 -a1 -b1 -b2
.Test.ps1 -a2 -b1 -b2
.Test.ps1 -a1 -a2 -b1
.Test.ps1 -a1 -a2 -b2
我知道如何使用ParameterSetName
强制执行一组互斥参数,但我无法弄清楚如何强制执行多个组。甚至不确定它是否可行。请注意,真实示例比上面的示例更复杂(每个组都有多个参数,并且它们不是所有开关)。
更新:根据评论中的建议,我添加了参数集:
Param(
# GROUP A (a1 and a2 are mutually exclusive)
[Parameter(ParameterSetName="a1")]
[Parameter(ParameterSetName="b1")]
[Parameter(ParameterSetName="b2")]
[switch]$a1,
[Parameter(ParameterSetName="a2")]
[Parameter(ParameterSetName="b1")]
[Parameter(ParameterSetName="b2")]
[switch]$a2,
# GROUP B (b1 and b2 are mutually exclusive)
[Parameter(ParameterSetName="a1")]
[Parameter(ParameterSetName="a2")]
[Parameter(ParameterSetName="b1")]
[switch]$b1,
[Parameter(ParameterSetName="a1")]
[Parameter(ParameterSetName="a2")]
[Parameter(ParameterSetName="b2")]
[switch]$b2
)
这似乎不是我需要做的事情:
PS D:Scripts> Get-Help .Test.ps1 Test.ps1 [-a1] [-a2] [-b2] [<CommonParameters>] Test.ps1 [-a1] [-a2] [-b1] [<CommonParameters>] Test.ps1 [-a1] [-b1] [-b2] [<CommonParameters>] Test.ps1 [-a2] [-b1] [-b2] [<CommonParameters>]
答案
您可以通过设置“强制”来解决“ParameterSet”
function paramtest
{
<# .Synopsis #>
[CmdletBinding(DefaultParameterSetName = "default")]
Param(
# GROUP A (a1 and a2 are mutually exclusive)
[Parameter(ParameterSetName="a1")]
[Parameter(Mandatory, ParameterSetName="a1b1")]
[Parameter(Mandatory, ParameterSetName="a1b2")]
[switch]$a1,
[Parameter(ParameterSetName="a2")]
[Parameter(Mandatory, ParameterSetName="a2b1")]
[Parameter(Mandatory, ParameterSetName="a2b2")]
[switch]$a2,
# GROUP B (b1 and b2 are mutually exclusive)
[Parameter(ParameterSetName="b1")]
[Parameter(Mandatory, ParameterSetName="a1b1")]
[Parameter(Mandatory, ParameterSetName="a2b1")]
[switch]$b1,
[Parameter(ParameterSetName="b2")]
[Parameter(Mandatory, ParameterSetName="a1b2")]
[Parameter(Mandatory, ParameterSetName="a2b2")]
[switch]$b2
)
"ParameterSetName is {0}" -f $PSCmdlet.ParameterSetName
}
Get-Help
的结果如下。
PS > help paramtest | foreach syntax
paramtest [<CommonParameters>]
paramtest -a1 -b2 [<CommonParameters>]
paramtest -a1 -b1 [<CommonParameters>]
paramtest [-a1] [<CommonParameters>]
paramtest -a2 -b2 [<CommonParameters>]
paramtest -a2 -b1 [<CommonParameters>]
paramtest [-a2] [<CommonParameters>]
paramtest [-b1] [<CommonParameters>]
paramtest [-b2] [<CommonParameters>]
以上是关于如何在PowerShell中定义多组互斥参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 中运行 appCmd 以将自定义标头添加到默认网站
如何使用脚本块和参数将 powershell.exe 与 -Command 一起使用