PowerShell中的多个参数集

时间:2014-12-12 21:55:34

标签: powershell parameters set powershell-v2.0 powershell-v3.0

是否可以使用多个集合使两组参数互相排斥,但包含其他两组参数?例如,假设我有四个参数:

param(
    $param1,
    $param2,
    $param3,
    $param4,
)

Param1和2彼此独占,但可以调用3或4。类似地,param3和4彼此排斥,但是可以调用1或2。这些是可以一起调用的正常参数集:

./MyScript.ps1 -param1 -param3
./MyScript.ps1 -param1 -param4
./MyScript.ps1 -param2 -param3
./MyScript.ps1 -param2 -param4

不应同时调用这些:

./MyScript.ps1 -param1 -param2
./MyScript.ps1 -param1 -param3 -param4
./MyScript.ps1 -param2 -param3 -param4
./MyScript.ps1 -param3 -param1 -param2
./MyScript.ps1 -param4 -param1 -param2
./MyScript.ps1 -param3 -param4

我已经尝试过一些东西,但是所有这些东西似乎都会产生奇怪的输出,并且仍然允许我打电话给我认为是非法的"参数集。以下是我设置参数集的示例:

[Parameter(ParameterSetName="onethree",Mandatory=$true,HelpMessage="a or b")]
[Parameter(ParameterSetName="onefour",Mandatory=$true,HelpMessage="a or b")]
[ValidateSet("a","b")]
[string]$one,
[Parameter(ParameterSetName="twothree",Mandatory=$true)]
[Parameter(ParameterSetName="twofour",Mandatory=$true)]
[switch]$two,
[Parameter(ParameterSetName="onethree")]
[Parameter(ParameterSetName="twothree")]
[string[]]$PropertyClass,
[Parameter(ParameterSetName="onefour")]
[Parameter(ParameterSetName="twofour")]
[string[]]$PropertyName

脚本执行,但它没有正确完成(如果我用$ 2调用它,它会尝试用$ 1做一些事情并导致脚本失败)。如果我查看可能的参数,我就不会看到$ 2;但如果我输入-t并点击[标签],它会自动填充到-two。可能导致这种情况的任何想法?是否有可能做我正在寻找的事情?

1 个答案:

答案 0 :(得分:3)

使用Get-Help

查看参数集的最佳方法是使用Get-Help My-Function。我使用给定的Test-Sets块创建了一个名为param()的函数,这是Get-Help的输出:

SYNTAX
    Test-Sets -one <string> {a | b} [-PropertyName <string[]>]  [<CommonParameters>]

    Test-Sets -one <string> {a | b} [-PropertyClass <string[]>]  [<CommonParameters>]

    Test-Sets -two [-PropertyName <string[]>]  [<CommonParameters>]

    Test-Sets -two [-PropertyClass <string[]>]  [<CommonParameters>]

这似乎满足了您的要求,除非您总是需要2个参数,在这种情况下,我认为您唯一需要做的就是在其2个参数中强制要求$PropertyClass$PropertyName集。

如果我在这里遗漏了一些内容,请澄清并将失败的命令包含在@mike z请求中。