共用方式為


關於列舉

簡短描述

語句 enum 是用來宣告列舉。 列舉是一種相異類型,其中包含一組稱為列舉值清單的具名標籤。

詳細描述

語句 enum 可讓您建立強型別的標籤。 該列舉可以在程序代碼中使用,而不需要剖析或檢查拼字錯誤。

列舉在內部以整數表示,其起始值為零。 清單中的第一個標籤會指派為零值。 其餘標籤會以連續的數位指派。

在定義中,標籤可以指定任何整數值。 未指派任何值的標籤會採用下一個整數值。

語法 (基本)

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

使用範例

下列範例顯示可視為媒體檔案的物件列舉。 定義會將明確值指派給 、、 picturevideo的基礎值music。 緊接在明確指派之後的標籤會取得下一個整數值。 同義字可以藉由將相同的值指派給另一個標籤來建立;請參閱 下列項目的建構值:oggogamogg、 或 jpg、 或 mpgmpegjpeg

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 () 似乎會傳回相同的結果。 不過,在內部,PowerShell 正在將值變更為標籤。 仔細閱讀清單,您會注意到 ogamogg 會在 [取得名稱] 結果下提及,但不會在 、 jpegmpegmpg的類似輸出jpg下提及。

[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。 在此範例中,我們會測試的值中的 $file2Device 和 Archive 屬性。

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

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