about_Enum

简短说明

enum 语句用于声明枚举。 枚举是一种非重复类型,由一组名为枚举器列表的命名标签组成。

长说明

enum 语句允许你创建强类型标签集。 该枚举可以在代码中使用,而无需分析或检查拼写错误。

枚举在内部表示为整数,起始值为零。 列表中的第一个标签分配值为零。 剩余标签分配有连续数字。

在定义中,可以为标签提供任何整数值。 未分配任何值的标签采用下一个整数值。

语法 (基本)

enum <enum-name> {
    <label> [= <int-value>]
    ...
}

用例

以下示例演示可被视为媒体文件的对象的枚举。 该定义将显式值分配给基础值musicvideo例如picture。 紧随显式赋值之后的标签将获取下一个整数值。 同义词可以通过向另一个标签分配相同的值来创建;请参阅以下项的构造值:oggogamogg、或jpgjpeg、或mpgmpeg

enum MediaTypes {
    unknown
    music = 10
    mp3
    aac
    ogg = 15
    oga = 15
    mogg = 15
    picture = 20
    jpg
    jpeg = 21
    png
    video = 40
    mpg
    mpeg = 41
    avi
    m4v
}

该方法 GetEnumNames() 返回枚举的标签列表。

[MediaTypes].GetEnumNames()
unknown
music
mp3
aac
ogg
oga
mogg
picture
jpg
jpeg
png
video
mpg
mpeg
avi
m4v

该方法 GetEnumValues() 返回枚举的值列表。

[MediaTypes].GetEnumValues()
unknown
music
mp3
aac
oga
oga
oga
picture
jpeg
jpeg
png
video
mpeg
mpeg
avi
m4v

备注

GetEnumNames() 并且 GetEnumValues() 似乎返回相同的结果;命名值的列表。 但是,在内部枚举 GetEnumValues() 值,然后将值映射到名称中。 仔细阅读列表,你会注意到oggoga并且mogg显示在输出中GetEnumNames(),但只显示oga输出GetEnumValues()。 同样的事情发生在jpgjpegmpg, 。 mpeg

该方法 GetEnumName() 可用于获取与特定值关联的名称。 如果有多个与值关联的名称,该方法将按字母顺序返回名字。

[MediaTypes].GetEnumName(15)
oga

以下示例演示如何将每个名称映射到其值。

[MediaTypes].GetEnumNames() | ForEach-Object {
  "{0,-10} {1}" -f $_,[int]([MediaTypes]::$_)
}
unknown    0
music      10
mp3        11
aac        12
ogg        15
oga        15
mogg       15
picture    20
jpg        21
jpeg       21
png        22
video      40
mpg        41
mpeg       41
avi        42
m4v        43

枚举为标志

枚举可以定义为位标志的集合。 其中,在任何给定点,枚举表示打开的一个或多个标志。

要使枚举作为标志正常工作,每个标签的幂应为两个值。

语法 (标志)

[Flags()] enum <enum-name> {
    <label 0> [= 1]
    <label 1> [= 2]
    <label 2> [= 4]
    <label 3> [= 8]
    ...
}

标志用法示例

在以下示例中,将创建 FileAttributes 枚举。

[Flags()] enum FileAttributes {
    Archive = 1
    Compressed = 2
    Device = 4
    Directory = 8
    Encrypted = 16
    Hidden = 32
}

[FileAttributes]$file1 = [FileAttributes]::Archive
[FileAttributes]$file1 +=[FileAttributes]::Compressed
[FileAttributes]$file1 +=  [FileAttributes]::Device
"file1 attributes are: $file1"

[FileAttributes]$file2 = [FileAttributes]28 ## => 16 + 8 + 4
"file2 attributes are: $file2"
file1 attributes are: Archive, Compressed, Device
file2 attributes are: Device, Directory, Encrypted

若要测试是否设置了特定值,可以使用二进制比较运算符 -band。 在此示例中,我们测试 “设备”“存档 ”属性的值 $file2

PS > ($file2 -band [FileAttributes]::Device) -eq [FileAttributes]::Device
True

PS > ($file2 -band [FileAttributes]::Archive) -eq [FileAttributes]::Archive
False