如何为阵列参数获取Powershell选项卡?

时间:2013-05-08 12:23:59

标签: powershell powershell-v3.0

目前,我正在尝试使用ValidateSet属性声明:

function cmdlet {
    param(
        [Parameter(Mandatory = $True, Position = 0)]
        [ValidateSet("option_1", "option_2", "option_3")]
        [string[]] $options
    )

    ...
}

使用它,我可以制表一个单位长度参数,即

> cmdlet <TAB> -> cmdlet option_1

但是为了获得标签完整的更多选项(或者,确实正确解析),我必须用引号括起前面的参数,即

> cmdlet option_1<TAB> -> cmdlet option_1

(无法完成制表符)

> cmdlet "option_1",<TAB><TAB> -> cmdlet "option_1",option_2

(正确执行)

> cmdlet option_1,option_2<ENTER>
cmdlet : Cannot validate argument on parameter 'options'. The argument "o" does not belong to the set "option_1,option_2,option_3" specified by the ValidateSet attribute.
Supply an argument that is in the set and then try the command again.
At line:1 char:8
+ cmdlet option_1,option_2
+        ~~~~~~
    + CategoryInfo          : InvalidData: (:) [cmdlet], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,cmdlet

这显然不太理想。要么我希望标签完成将参数包装在引号中(或者根本不需要它们,但我想这会更难)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

不完全符合您的要求,但您可以使用ParameterSetName创建互斥开关的集合:

[CmdletBinding(DefaultParametersetName="Option_1")] 
param
(
    [parameter(Mandatory=$true,ParameterSetName="Option_1")]
    [switch]$Option_1,

    [parameter(Mandatory=$true,ParameterSetName="Option_2")]
    [switch]$Option_2,

    [parameter(Mandatory=$true,ParameterSetName="Option_3")]
    [switch]$Option_3
)

在示例中,我将默认值设置为Option_1,但您可以省略它以使所有这些都是可选的,如果指定多个,则会出现错误。