5

我正在编写一个具有多个可能参数的自定义 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,但不能同时指定两者。

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

  • 富 -param1_A -param2_A
  • 富 -param1_B -param2_A
  • 富 -param1_A -param2_B
  • 富 -param1_B -param2_B

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

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

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

如果有帮助,我有可以转换$param1_A$param1_B$param2_A的实用函数$param2_B

4

4 回答 4

9

好的,我设法使用参数集。我之前不明白的是,我可以[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
于 2013-11-12T12:31:48.217 回答
3

你需要参数集

这是来自技术网页面的示例:

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
          )

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

于 2013-11-12T12:18:09.257 回答
1

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

(-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)都应该是可选的(强制 = 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 参数,它甚至都不起作用。

有什么建议可以实现我的目标吗?

于 2018-01-05T12:40:45.373 回答
0

Steve B 的答案是我一直在寻找的,但是由于代码示例的抽象性质(param1/2 A/B/C/D),尝试实现它令人困惑。一旦我理解了这个概念,给变量和参数集起有意义的名字真的帮助我理解了发生了什么。所以我想我会分享一个更具体的例子,以防它帮助别人。

假设您想点餐。您可以选择百事可乐或可乐作为饮料(互斥选择#1)。您可以选择汉堡配薯条或主菜沙拉(互斥选择#2)。为此,我会说给定的值只是食物的整数大小,但这无关紧要。

param (
    [Parameter(Position=0,Mandatory=$true,ParameterSetName="Pepsi-BurgerFries")]
    [Parameter(Position=0,Mandatory=$true,ParameterSetName="Pepsi-Salad")]
    [int]$Pepsi,

    [Parameter(Position=0,Mandatory=$true,ParameterSetName="Coke-BurgerFries")]
    [Parameter(Position=0,Mandatory=$true,ParameterSetName="Coke-Salad")]
    [int]$Coke,

    [Parameter(Mandatory=$true,ParameterSetName="Pepsi-BurgerFries")]
    [Parameter(Mandatory=$true,ParameterSetName="Coke-BurgerFries")]
    [int]$Burger,

    [Parameter(Mandatory=$true,ParameterSetName="Pepsi-BurgerFries")]
    [Parameter(Mandatory=$true,ParameterSetName="Coke-BurgerFries")]
    [int]$Fries,

    [Parameter(Mandatory=$true,ParameterSetName="Pepsi-Salad")]
    [Parameter(Mandatory=$true,ParameterSetName="Coke-Salad")]
    [int]$Salad
)
于 2020-03-06T18:08:55.657 回答