目前,我正在尝试使用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
这显然不太理想。要么我希望标签完成将参数包装在引号中(或者根本不需要它们,但我想这会更难)。
非常感谢任何帮助。
答案 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,但您可以省略它以使所有这些都是可选的,如果指定多个,则会出现错误。