如何在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 无法返回正确的退出代码

如何在 XSD 中定义互斥属性?

如何在 PowerShell 中运行 appCmd 以将自定义标头添加到默认网站

如何使用脚本块和参数将 powershell.exe 与 -Command 一起使用

如何使用 Python 中的参数运行 PowerShell 脚本

如何在 PowerShell 中要求命令行参数(不是参数)?