You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题:

  1. 如何让参数$EnumObject接受枚举类型数组(整个枚举结构,而非单个枚举名称/值),例如执行:EnumTest -EnumObject MyCustomEnum, MyOtherCustomEnum?
    • 使用[System.Object[]]$EnumObject无效
    • 使用[System.Enum[]]$EnumObject无效,为何该方式不可行?
    • 使用[array]$EnumObject无效
  2. 传递整个枚举类型作为参数的正确方式是什么?
    • 执行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 π

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:30:42