1

目前,我正在尝试使用 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

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

非常感谢任何帮助。

4

1 回答 1

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,但您可以省略它以使所有选项都可选,如果您指定多个,则会收到错误消息。

于 2013-05-08T12:51:18.520 回答