PowerShell:如何让函数参数接受自定义枚举类型数组?
示例说明(仅用于演示,无实际用途)
- 函数需接受整个枚举类型/结构作为参数
- 对传入的枚举参数执行操作(本示例仅获取整数值2对应的枚举名称)
以下代码可接受单个枚举类型参数并输出预期结果:
function EnumTest { param ([System.Object]$EnumObject) BEGIN {} PROCESS { [System.Enum]::GetName($EnumObject, 2) } END {} } enum MyCustomEnum { Balloon = 1 Bicycle = 2 Cloud = 3 } enum MyOtherCustomEnum { Crayon = 1 Dog = 2 Elephant = 3 } EnumTest -EnumObject MyCustomEnum
输出:
Bicycle
问题:
- 如何让参数
$EnumObject接受枚举类型数组(整个枚举结构,而非单个枚举名称/值),例如执行:EnumTest -EnumObject MyCustomEnum, MyOtherCustomEnum?- 使用
[System.Object[]]$EnumObject无效 - 使用
[System.Enum[]]$EnumObject无效,为何该方式不可行? - 使用
[array]$EnumObject无效
- 使用
- 传递整个枚举类型作为参数的正确方式是什么?
- 执行
EnumTest -EnumObject MyCustomEnum时,似乎传递的是枚举结构名称字符串"MyCustomEnum",而非预期的完整枚举对象[MyCustomEnum]。
- 执行
解答:
问题2:传递整个枚举类型的正确方式
直接写MyCustomEnum作为参数值时,PowerShell默认会将其解析为字符串。要传递真正的枚举类型(即Type对象),需要使用类型字面量语法[MyCustomEnum],或者通过[Type]::GetType("MyCustomEnum")获取类型对象。
修改后的调用示例:
EnumTest -EnumObject [MyCustomEnum]
此时$EnumObject接收的才是真正的枚举类型对象,而非字符串。
问题1:让参数接受枚举类型数组
为什么[System.Enum[]]不可行?
[System.Enum[]]是枚举值的数组类型,指代的是枚举的实例(比如MyCustomEnum::Bicycle);而我们需要传递的是枚举本身的类型([MyCustomEnum]),它属于Type类型,因此[System.Enum[]]无法匹配输入。
正确的参数定义方式
要接受枚举类型数组,参数类型应定义为[Type[]],同时可以用[ValidateScript({ $_.IsEnum })]验证输入是否为枚举类型:
修改后的函数:
function EnumTest { param ( [Parameter(Mandatory)] [ValidateScript({ $_.IsEnum })] [Type[]]$EnumObject ) BEGIN {} PROCESS { foreach ($enumType in $EnumObject) { [System.Enum]::GetName($enumType, 2) } } END {} }
调用方式
传递多个枚举类型时,使用类型字面量语法:
EnumTest -EnumObject [MyCustomEnum], [MyOtherCustomEnum]
输出结果:
Bicycle Dog
内容的提问来源于stack exchange,提问作者Paul π
相关产品推荐
相关产品推荐

