Как определить несколько групп взаимоисключающих параметров в PowerShell? - PullRequest
0 голосов
/ 13 марта 2019

Есть ли способ заставить 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>]

1 Ответ

4 голосов
/ 14 марта 2019

Вы можете разрешить «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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...