PowerShell枚举参数未阻止多参数传入,如何限制仅传单个参数?
问题原因
PowerShell处理枚举类型参数时,会尝试将传入的数组转换为枚举的按位组合值,这取决于枚举成员的默认数值分配:
- 默认情况下,枚举成员的数值从0开始递增:
one=0、two=1、three=2 - 传入
one, two时,实际计算0 -bor 1 = 1,对应枚举成员two,因此能成功转换并输出two - 传入
one, three时,计算0 -bor 2 = 2,对应枚举成员three,同样能完成转换 - 而
two, three的组合值是1 -bor 2 = 3,这个数值在Test枚举中没有对应成员,因此触发转换错误
解决方法:限制参数仅接受单个值
要阻止传入多个参数,只需在参数上添加[ValidateCount(1, 1)]属性,强制参数只能接收1个输入值:
enum Test {one; two; three} function Test-Enum { [CmdletBinding()] param ( [ValidateCount(1, 1)] [Test]$number ) $number }
此时再传入多个参数会直接抛出参数计数错误,符合预期:
Test-Enum -number one, two # 报错信息:无法处理参数“number”,因为参数的计数超出了范围。应为 1,实际提供了 2。
另外,也可以显式声明枚举为非标志类型(默认即为非标志,但更清晰),不过这无法阻止数组传入,仅能明确不允许按位组合:
[Flags(false)] enum Test {one; two; three}
最直接有效的方式还是使用[ValidateCount(1,1)]限制参数数量。
内容的提问来源于stack exchange,提问作者Lieven Keersmaekers
相关产品推荐
相关产品推荐

