Powershell обязателен один из двух параметров

Я написал сценарий PowerShell с некоторыми параметрами, но не могу понять, как получить синтаксис вроде

script.ps1 [A | B] C [D]

script.ps1 [A | B] C E F

script.ps1 [A | B] C G

Цель:

  • A или B или оба пройдены
  • C всегда обязателен
  • если никакой другой параметр не передан, используйте первый набор параметров -> D не является обязательным
  • если передан E, F является обязательным, и наоборот (второй набор параметров)
  • G передается (третий набор параметров)

Мой сценарий выглядит так

[CmdLetbinding(DefaultParameterSetName='ParamSet1')]
Param(
    [Parameter(Mandatory=$true)][String]$A,
    [Parameter(Mandatory=$false)][System.Net.IPAddress[]]$B,

    [Parameter(Mandatory=$true)][String]$C,

    [Parameter(Mandatory=$false, ParameterSetName="ParamSet1")][Int32]$D=120,

    [Parameter(Mandatory=$true, ParameterSetName="ParamSet2")][String]$E,
    [Parameter(Mandatory=$true, ParameterSetName="ParamSet2")][String]$F,

    [Parameter(Mandatory=$true, ParameterSetName="ParamSet3")][Switch]$G
)

Результат 'Get-Help script.ps1'

Так что параметр C - G выглядит нормально. Но я не знаю, как написать условие для A и B.

Есть ли у вас какие-либо идеи?


person Citu    schedule 02.04.2020    source источник


Ответы (1)


Используйте два набора параметров для $ A и $ B:

[CmdLetbinding(DefaultParameterSetName='ParamSet1')]
Param(
    [Parameter(Mandatory=$true,ParameterSetName='By_A')][String]$A,
    [Parameter(Mandatory=$true,ParameterSetName='By_B')][System.Net.IPAddress[]]$B,

# Rest of the Param
)
<#
 In the function's code, you can either test for whether $A and/or $B are null, or check $PSBoundParameters.ContainsKey('A'), or check $PSCmdlet.ParameterSetName to see whether it
is set to 'By_A' or 'By_B'
#>

Если вы не хотите использовать наборы параметров для A и B:

Param(
# Param block, specifying both A and B mandatory=$false
)
If($A -ne $null){
  # A is not null, like this you can check if B is null. If B is not null then you can throw an exception
}
If($B -be $null){
    # B is not null, like this you can check if A is null. If A is not null then you can throw an exception
}
person programmer365    schedule 02.04.2020
comment
Хм, я думаю, есть несколько проблем, потому что, если я использую эти ParameterSets для $ A и $ B, я больше не могу использовать $ D- $ G. Также у меня нет возможности передать $ A и $ B. Но моя цель состоит в том, чтобы скрипт вызывал хотя бы с одним из них - ›передать $ A или передать $ B или передать $ A и $ B - person Citu; 02.04.2020
comment
Хм, ладно, похоже, обходной путь, и я попробую это. Думаю, есть способ справиться с этим с помощью Param-Block. Спасибо за помощь - person Citu; 02.04.2020