与Powershell的双重互斥参数

问题描述 投票:5回答:3

我正在编写一个具有多个可能参数的自定义PowerShell函数。

function foo {
    param(
        [Parameter(Mandatory=$true)]
        [string]$param1_A,
        [Parameter(Mandatory=$true)]
        [int]$param1_B,

        [Parameter(Mandatory=$true)]
        [string]$param2_A,
        [Parameter(Mandatory=$true)]
        [int]$param2_B
    )

}

我基本上有两组互斥参数。我可以指定$param1_A$param1_B,但不能同时指定两者。我也可以指定$param2_A$param2_B,但不能同时指定。

总而言之,这是一个可能的调用表:

  • foo -param1_A -param2_A
  • foo -param1_B -param2_A
  • foo -param1_A -param2_B
  • foo -param1_B -param2_B

在所有情况下,至少有一个参数是强制性的。

如何声明我的参数以强制执行此要求?

我试过使用不同的参数集,但我没有成功,因为我没有找到一种方法来描述至少一个参数的概念。

如果它可以帮助,我有实用功能,可以将$param1_A转换为$param1_B$param2_A转换为$param2_B

powershell
3个回答
8
投票

好的,我设法使用参数集。之前我不理解的是,我可以在同一个参数上声明多个[Parameter]属性。所以正如mjolinor建议的那样,我实际上可以使用参数集。

这是我的功能的更新代码:

function foo {
    param(
        [Parameter(Mandatory=$true, ParameterSetName='A')]
        [Parameter(Mandatory=$true, ParameterSetName='C')]
        [string]$param1_A,
        [Parameter(Mandatory=$true, ParameterSetName='B')]
        [Parameter(Mandatory=$true, ParameterSetName='D')]
        [int]$param1_B,

        [Parameter(Mandatory=$true, ParameterSetName='A')]
        [Parameter(Mandatory=$true, ParameterSetName='B')]
        [string]$param2_A,
        [Parameter(Mandatory=$true, ParameterSetName='C')]
        [Parameter(Mandatory=$true, ParameterSetName='D')]
        [int]$param2_B
    )

     $PSCmdlet.ParameterSetName
}

Foo -param1_A 1 -param2_A "1"
Foo -param1_B 1 -param2_A "1"
Foo -param1_A 1 -param2_B "1"
Foo -param1_B 1 -param2_B "1"

将输出:

A
B
C
D

3
投票

你需要parametersets

以下是technet页面的示例:

Param
          (
            [parameter(Mandatory=$true,
                      ParameterSetName="Computer")]
            [String[]]
            $ComputerName,

            [parameter(Mandatory=$true,
                      ParameterSetName="User")]
            [String[]]
            $UserName

            [parameter(Mandatory=$false, ParameterSetName="Computer")]
            [parameter(Mandatory=$true, ParameterSetName="User")]
            [Switch]
            $Summary
          )

在您的示例中,您需要四个参数集,并且可以将其中一个参数集指定为默认参数集。


1
投票

标记为解决方案的帖子很好,并且相对方便,因为您有2组相互参数。在这种情况下,您有2x2 = 4个参数集。让我们假设您没有2组而是3组2个参数。这导致2x2x2 = 8个必要的ParameterSets。这意味着每个参数至少有8行 - > 6x8 = 48行仅用于声明部分。没有提到为每个参数正确分配正确的ParameterSets的浓度。对于像这样的简单语法,不存在更好的方法:

(-a | -b)( - c | -d)( - e | -f)......

编辑:这里澄清了我想要实现的内容:

Param(
    [string]$a1="some value to create a2",

    [PsObject]$a2,

    [string]$b1="some value to create a2",

    [PsObject]$b2,

    [string]$c1="some value to create a2",

    [PsObject]$c2,
)

对于我的功能,应该提供(a1或a2)和(b1或b2)和(c1或c2)。因为a2,b2和c3可以通过默认值a1,b1和c1创建,所有带有n2的参数(其中n = a或b或c)应该是可选的(Mandatory = false)。因为我有n1的默认值(其中n = a或b或c),它们也不是强制性的。

回到我原来的问题:我可以为参数输入可能性的每个排列构建ParameterSets。这将导致我有很多不同的参数工作。

例:

Param(
    [Parameter(Position=0)]
    [Parameter(ParameterSetName="a1b1c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b1c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b2c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b2c2", Mandatory=$false)]
    [string]$a1="some value to create a2",

    [Parameter(Position=0)]
    [Parameter(ParameterSetName="a2b1c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b1c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b2c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b2c2", Mandatory=$false)]
    [PsObject]$a2,

    [Parameter(Position=1)]
    [Parameter(ParameterSetName="a1b1c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b1c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b1c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b1c2", Mandatory=$false)]
    [string]$b1="some value to create a2",

    [Parameter(Position=1)]
    [Parameter(ParameterSetName="a1b2c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b2c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b2c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b2c2", Mandatory=$false)]
    [PsObject]$b2,

    [Parameter(Position=2)]
    [Parameter(ParameterSetName="a1b1c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b2c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b1c1", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b2c1", Mandatory=$false)]
    [string]$c1="some value to create a2",

    [Parameter(Position=2)]
    [Parameter(ParameterSetName="a1b1c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a1b2c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b1c2", Mandatory=$false)]
    [Parameter(ParameterSetName="a2b2c2", Mandatory=$false)]
    [PsObject]$c2,
)

你可以很容易地看到它与第一篇文章相比有多复杂和多长。然而,由于所有Mandatory = false参数,它甚至不起作用。

有任何建议来实现我的目标吗?

© www.soinside.com 2019 - 2024. All rights reserved.