1

我写了一个带有一些参数的powershell脚本,但我不知道如何获得类似的语法

脚本.ps1 [A|B] C [D]

script.ps1 [A|B] CEF

script.ps1 [A|B] CG

目标:

  • 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 的条件。

你有什么主意吗?

4

1 回答 1

0

对 $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
}
于 2020-04-02T07:04:26.447 回答