다음을 통해 공유


about_Enum

간단한 설명

이 문은 enum 열거형을 선언합니다. 열거형은 열거자 목록이라는 명명된 레이블 집합으로 구성된 고유 형식입니다.

자세한 설명

문을 enum 사용하면 강력한 형식의 레이블 집합을 만들 수 있습니다. 구문 분석하거나 맞춤법 오류를 검사하지 않고도 코드에서 해당 열거형을 사용할 수 있습니다.

열거형은 내부적으로 시작 값이 0인 정수 값 형식으로 표시됩니다. 기본적으로 PowerShell 열거형은 System.Int32([int])를 기본 형식으로 사용합니다. 기본적으로 PowerShell은 목록의 첫 번째 레이블에 값 0을 할당합니다. 기본적으로 PowerShell은 연속 정수로 나머지 레이블을 할당합니다.

정의에서 레이블에 정수 값을 제공할 수 있습니다. 값이 할당되지 않은 레이블은 다음 정수 값을 사용합니다.

구문

열거형은 다음 구문을 사용합니다.

정수 열거형 정의 구문

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

특정 기본 형식 열거형 정의 구문

[[<attribute>]...] enum <enum-name> : <underlying-type-name> {
    <label> [= <int-value>]
    ...
}

플래그 열거형 정의 구문

[[<attribute>]...] [Flag()] enum <enum-name>[ : <underlying-type-name>] {
    <label 0> [= 1]
    <label 1> [= 2]
    <label 2> [= 4]
    <label 3> [= 8]
    ...
    ...
}

열거형 액세스 구문

[<enum-name>]::<label>

예제

예제 1 - 최소 열거형

다음 코드 블록은 세 개의 레이블을 사용하여 MarkdownUnorderedListCharacter 열거형을 정의합니다. 레이블에 명시적 값을 할당하지 않습니다.

enum MarkdownUnorderedListCharacter {
    Asterisk
    Dash
    Plus
}

다음 코드 블록은 열거형 형식으로 캐스팅할 때 정수 값과 문자열 값이 모두 동작하는 방식을 보여 있습니다.

$ValuesToConvert = @(0, 'Asterisk', 1, 'Dash', 2, 'Plus')
foreach ($Value in $ValuesToConvert) {
    [MarkdownUnorderedListCharacter]$EnumValue = $Value

    [pscustomobject]@{
        AssignedValue = $Value
        Enumeration   = $EnumValue
        AreEqual      = $Value -eq $EnumValue
    }
}
AssignedValue Enumeration AreEqual
------------- ----------- --------
            0    Asterisk     True
     Asterisk    Asterisk     True
            1        Dash     True
         Dash        Dash     True
            2        Plus     True
         Plus        Plus     True

열거형 값과 같은 정수 캐스팅은 해당 열거형을 반환합니다. 열거형의 레이블과 동일한 문자열을 캐스팅하면 해당 열거형이 반환됩니다.

예제 2 - 명시적 및 동의어 열거형 값

다음 예제에서는 미디어 파일과 상관 관계가 있는 개체의 열거형을 보여줍니다. 정의는 명시적 값을 , video의 기본 값musicpicture할당합니다. 명시적 할당 바로 다음 레이블은 다음 정수 값을 가져옵니다. 동일한 값을 다른 레이블에 할당하여 동의어를 만들 수 있습니다. , , 또는 , 또는 jpgmpegmpgjpeg, 에 대해 ogg생성된 값을 참조하세요. moggoga

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
ogg
ogg
ogg
picture
jpg
jpg
png
video
mpg
mpg
avi
m4v

참고 항목

GetEnumNames() 같은 GetEnumValues() 결과를 반환하는 것 같습니다. 명명된 값의 목록입니다. 그러나 내부적으로 GetEnumValues() 값을 열거한 다음, 값을 이름으로 매핑합니다. 목록을 주의 깊게 읽으면 ogg, mogg oga및 출력에 GetEnumNames()표시되지만 출력 GetEnumValues() 은 표시됩니다ogg. , 및 mpgmpegjpeg에도 jpg동일한 일이 발생합니다. 동의어 값에 대해 PowerShell이 반환하는 이름은 결정적이지 않습니다.

메서드를 GetEnumName() 사용하여 특정 값과 연결된 이름을 가져올 수 있습니다. 값과 연결된 이름이 여러 명 있는 경우 메서드는 첫 번째 정의된 이름을 반환합니다.

[MediaTypes].GetEnumName(15)
ogg

다음 예제에서는 각 이름을 해당 값에 매핑하는 방법을 보여줍니다.

[MediaTypes].GetEnumNames() | ForEach-Object {
  [pscustomobject]@{
    Name = $_
    Value = [int]([MediaTypes]::$_)
  }
}
Name    Value
----    -----
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

구문을 사용하여 레이블로 단일 열거형 값을 지정할 수 있습니다 [<enum-name>]::<label>.

[MediaTypes]::png
[MediaTypes]::png -eq 22
png
True

예제 3 - 플래그로 열거

다음 코드 블록은 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

메서드를 사용하여 특정 플래그가 HasFlag() 설정되었는지 여부를 테스트할 수도 있습니다. 이 예제에서는 값$file1에서 디바이스숨겨진 특성을 테스트합니다.

PS > $file1.HasFlag([FileAttributes]::Device)
True

PS > $file1.HasFlag([FileAttributes]::Hidden)
False

예제 4 - 매개 변수로 열거

다음 예제에서 함수 ConvertTo-LineEndingRegex 는 EndOfLine 형식으로 InputObject 매개 변수를 정의합니다.

enum EndOfLine {
    CR   = 1
    LF   = 2
    CRLF = 3
}

function ConvertTo-LineEndingRegex {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline)]
        [EndOfLine[]]$InputObject
    )

    process {
        switch ($InputObject) {
            CR   {  '\r'  }
            LF   {  '\n'  }
            CRLF { '\r\n' }
        }
    }
}

[EndOfLine]::CR | ConvertTo-LineEndingRegex

'CRLF' | ConvertTo-LineEndingRegex

ConvertTo-LineEndingRegex 2
\r

\r\n

\n

예제에서 첫 번째 문 호출 ConvertTo-LineEndingRegex 은 에 대한 CR열거형 값을 전달합니다. 두 번째 문은 LineEnding으로 캐스팅되는 문자열 'CRLF'전달합니다. 세 번째 문은 레이블에 매핑되는 매개 변수의 LF 값을 2 지정합니다.

PowerShell 프롬프트에 다음 텍스트를 입력하여 인수 완성 옵션을 볼 수 있습니다.

ConvertTo-LineEndingRegex -InputObject <Tab>

매개 변수에 잘못된 레이블 이름 또는 숫자 값을 지정하면 함수에서 오류가 발생합니다.

ConvertTo-LineEndingRegex -InputObject 0
ConvertTo-LineEndingRegex: Cannot process argument transformation on
parameter 'InputObject'. Cannot convert value "0" to type "EndOfLine" due
to enumeration values that are not valid. Specify one of the following
enumeration values and try again. The possible enumeration values are
"CR,LF,CRLF".

예제 5 - 특정 기본 형식의 열거형

PowerShell 6.2부터 특정 기본 형식으로 열거형을 정의할 수 있습니다. 이 예제에서는 열거형에 유효한 기본 형식을 보여 줌

첫 번째 코드 블록은 두 변수를 배열로 초기화합니다. $EnumTypes 는 동적으로 만든 형식을 저장할 빈 배열입니다. $IntegralTypes 는 열거형에 유효한 기본 형식을 포함하는 배열입니다.

$EnumTypes     = @()
$IntegralTypes = @(
    'byte', 'sbyte', 'short', 'ushort', 'int', 'uint', 'long', 'ulong'
)

다음 코드 블록은 열거형 정의를 동적으로 만드는 데 사용할 템플릿을 정의합니다. {0} 서식 자리 표시자를 정수 형식 이름으로 바꾸면 템플릿은 다음과 같은 scriptblock을 만듭니다.

  1. 와 같이 byteEnum명명된 <type>Enum열거형을 정의합니다. 정의된 열거형은 지정된 정수 계열 형식을 기본 값 형식으로 사용합니다.

    열거형은 정수 계열 형식의 Min 최소값으로 설정된 값으로 정의됩니다. 정수 계열 형식의 Max 최대값으로 설정된 값을 정의합니다.

  2. 새로 정의된 형식을 반환합니다.

$DefinitionTemplate = @"
enum {0}Enum : {0} {{
    Min = [{0}]::MinValue
    Max = [{0}]::MaxValue
}}

[{0}Enum]
"@

다음 코드 블록은 템플릿을 사용하여 현재 범위에서 scriptblock을 만들고 호출합니다. 반환된 형식 정의를 배열에 $EnumTypes 추가합니다.

foreach ($IntegralType in $IntegralTypes) {
    $Definition  = $DefinitionTemplate -f $IntegralType
    $ScriptBlock = [scriptblock]::Create($Definition)
    $EnumTypes  += . $ScriptBlock
}

마지막 코드 블록은 메서드를 사용하여 GetEnumValuesAsUnderlyingType() 값을 기본 형식으로 나열하여 열거형 형식을 반복합니다. 루프는 열거형 형식, 값 형식, 레이블 및 실제 값을 보여 주는 각 값에 대해 새 개체를 만듭니다.

foreach ($EnumType in $EnumTypes) {
    $EnumType.GetEnumValuesAsUnderlyingType() | ForEach-Object {
        [pscustomobject]@{
            EnumType  = $EnumType.FullName
            ValueType = $_.GetType().FullName
            Label     = $EnumType.GetEnumName($_)
            Value     = $_
        }
    }
}
EnumType   ValueType     Label                Value
--------   ---------     -----                -----
byteEnum   System.Byte   Min                      0
byteEnum   System.Byte   Max                    255
sbyteEnum  System.SByte  Max                    127
sbyteEnum  System.SByte  Min                   -128
shortEnum  System.Int16  Max                  32767
shortEnum  System.Int16  Min                 -32768
ushortEnum System.UInt16 Min                      0
ushortEnum System.UInt16 Max                  65535
intEnum    System.Int32  Max             2147483647
intEnum    System.Int32  Min            -2147483648
uintEnum   System.UInt32 Min                      0
uintEnum   System.UInt32 Max             4294967295
longEnum   System.Int64  Max    9223372036854775807
longEnum   System.Int64  Min   -9223372036854775808
ulongEnum  System.UInt64 Min                      0
ulongEnum  System.UInt64 Max   18446744073709551615

열거형 메서드

다음 목록에는 PowerShell의 열거에 사용할 수 있는 유용한 메서드와 사용 방법이 포함되어 있습니다.

형식

정적 메서드는 Format() 지정된 열거형 형식, 열거형 값 및 형식 문자열에 대한 형식이 지정된 문자열 출력을 반환합니다. 출력은 지정된 형식 문자열을 사용하여 값에 ToString 메서드를 호출하는 것과 같습니다.

System.Enum 기본 클래스 형식 또는 특정 열거형 형식에서 정적 메서드를 사용할 수 있습니다.

[System.Enum]::format([<enum-name>], <value>, <format-string>)
[<enum-name>]::format([<enum-name>], <value>, <format-string>)

유효한 형식 문자열은 , 또는 , X dD 또는 x, 또는 F f.gG 자세한 내용은 열거형 형식 문자열을 참조하세요.

다음 예제에서는 지원되는 각 열거형 형식 문자열을 사용하여 TaskState 열거형의 각 값을 해당 문자열 표현으로 변환합니다.

enum TaskState {
    ToDo
    Doing
    Done
}

# String format template for the statements
$Statement = "[System.Enum]::Format([TaskState], {0}, '{1}')"

foreach ($Format in @('G', 'D', 'X', 'F')) {
    $StatementToDo  = $Statement -f 0, $Format
    $StatementDoing = $Statement -f "([TaskState]'Doing')", $Format
    $StatementDone  = $Statement -f '[TaskState]::Done', $Format
    $FormattedToDo  = [System.Enum]::Format(
      [TaskState], 0, $Format
    )
    $FormattedDoing = [System.Enum]::Format(
        [TaskState], ([TaskState]'Doing'), $Format
    )
    $FormattedDone  = [System.Enum]::Format(
      [TaskState], [TaskState]::Done, $Format
    )

    "{0,-62} => {1}" -f $StatementToDo,  $FormattedToDo
    "{0,-62} => {1}" -f $StatementDoing, $FormattedDoing
    "{0,-62} => {1}" -f $StatementDone,  $FormattedDone
}
[System.Enum]::Format([TaskState], 0, 'G')                     => ToDo
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'G')  => Doing
[System.Enum]::Format([TaskState], [TaskState]::Done, 'G')     => Done
[System.Enum]::Format([TaskState], 0, 'D')                     => 0
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'D')  => 1
[System.Enum]::Format([TaskState], [TaskState]::Done, 'D')     => 2
[System.Enum]::Format([TaskState], 0, 'X')                     => 00000000
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'X')  => 00000001
[System.Enum]::Format([TaskState], [TaskState]::Done, 'X')     => 00000002
[System.Enum]::Format([TaskState], 0, 'F')                     => ToDo
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'F')  => Doing
[System.Enum]::Format([TaskState], [TaskState]::Done, 'F')     => Done

GetEnumName

리플렉션 메서드는 GetEnumName() 특정 열거형 값의 이름을 반환합니다. 입력 값은 정수 또는 열거형 값과 같은 열거형에 유효한 기본 형식이어야 합니다. 값과 연결된 이름이 여러 명 있는 경우 메서드는 첫 번째 정의된 이름을 반환합니다.

[<enum-name>].GetEnumName(<value>)
enum GateState {
    Unknown
    Open
    Opening
    Closing
    Closed
}

foreach ($Value in 0..4) {
    [pscustomobject]@{
      IntegerValue = $Value
      EnumName     = [GateState].GetEnumName($Value)
    }
}
IntegerValue EnumName
------------ --------
           0 Unknown
           1 Open
           2 Opening
           3 Closing
           4 Closed

GetEnumNames

리플렉션 메서드는 GetEnumNames() 모든 열거형 값의 이름을 문자열로 반환합니다. 출력에는 동의어가 포함됩니다.

[<enum-name>].GetEnumNames()
enum Season {
    Unknown
    Spring
    Summer
    Autumn
    Winter
    Fall   = 3
}

[Season].GetEnumNames()
Unknown
Spring
Summer
Fall
Autumn
Winter

GetEnumUnderlyingType

리플렉션 메서드는 GetEnumUnderlyingType() 열거형 값의 기본 형식을 반환합니다.

[<enum-name>].GetEnumUnderlyingType()
enum IntBasedEnum {
    Zero
    One
    Two
}
enum ShortBasedEnum : short {
    Zero
    One
    Two
}

foreach ($EnumType in @([IntBasedEnum], [ShortBasedEnum])) {
    [pscustomobject]@{
        EnumType = $EnumType
        ValueType = $EnumType.GetEnumUnderlyingType()
    }
}
EnumType       ValueType
--------       ---------
IntBasedEnum   System.Int32
ShortBasedEnum System.Int16

GetEnumValues

리플렉션 메서드는 GetEnumValues() 열거형에 대해 정의된 모든 값을 반환합니다.

[<enum-name>].GetEnumValues()
enum Season {
    Unknown
    Spring
    Summer
    Autumn
    Winter
    Fall   = 3
}

[Season].GetEnumValues()
Unknown
Spring
Summer
Fall
Fall
Winter

GetEnumValuesAsUnderlyingType

리플렉션 메서드는 GetEnumValuesAsUnderlyingType() 열거형에 대해 정의된 모든 값을 기본 형식으로 반환합니다.

[<enum-name>].GetEnumValuesAsUnderlyingType()
enum IntBasedEnum {
    Zero
    One
    Two
}
enum ShortBasedEnum : short {
    Zero
    One
    Two
}

foreach ($EnumType in @([IntBasedEnum], [ShortBasedEnum])) {
    [pscustomobject]@{
        EnumType = $EnumType
        ValueType = $EnumType.GetEnumValuesAsUnderlyingType()[0].GetType()
    }
}
EnumType       ValueType
--------       ---------
IntBasedEnum   System.Int32
ShortBasedEnum System.Int16

HasFlag

인스턴스 메서드는 HasFlag 플래그 열거형 값에 대해 비트 플래그가 설정되는지 여부를 결정합니다. 이 메서드를 사용하는 것은 이진 비교 및 동등성 검사를 수행하는 것보다 더 짧고 읽기 쉽습니다.

<enum-value>.HasFlag(<enum-flag-value>)

다음 예제에서는 ModuleFeatures 플래그 열거형을 정의하고 값 39 에 있는 플래그를 보여 줍니다.

[Flags()] enum ModuleFeatures {
    Commands  = 1
    Classes   = 2
    Enums     = 4
    Types     = 8
    Formats   = 16
    Variables = 32
}

$Features = [ModuleFeatures]39

foreach ($Feature in [ModuleFeatures].GetEnumValues()) {
    "Has flag {0,-12}: {1}" -f "'$Feature'", ($Features.HasFlag($Feature))
}
Has flag 'Commands'  : True
Has flag 'Classes'   : True
Has flag 'Enums'     : True
Has flag 'Types'     : False
Has flag 'Formats'   : False
Has flag 'Variables' : True

정의됨

정적 메서드는 IsDefined() 입력 값이 열거형에 대해 정의되고 그렇지 않으면 $false반환 $true 됩니다. 이 메서드를 사용하여 잘못된 인수 오류를 처리할 필요 없이 값이 열거형에 유효한지 확인합니다.

System.Enum 기본 클래스 형식 또는 특정 열거형 형식에서 정적 메서드를 사용할 수 있습니다.

[System.Enum]::IsDefined([<enum-name>], <value>)
[<enum-name>]::IsDefined([<enum-name>], <value>)
enum Season {
    Unknown
    Spring
    Summer
    Autumn
    Winter
    Fall   = 3
}

foreach ($Value in 0..5) {
    $IsValid   = [Season]::IsDefined([Season], $Value)
    $EnumValue = if ($IsValid) { [Season]$Value }

    [pscustomobject] @{
        InputValue = $Value
        IsValid    = $IsValid
        EnumValue  = $EnumValue
    }
}
InputValue IsValid EnumValue
---------- ------- ---------
         0    True   Unknown
         1    True    Spring
         2    True    Summer
         3    True      Fall
         4    True    Winter
         5   False

ToString

인스턴스 메서드는 ToString() 열거형 값에 대한 레이블을 반환합니다. 이 메서드는 열거형 값이 출력으로 표시되는 방식에 대한 기본 보기이기도 합니다. 필요에 따라 서식 문자열을 지정하여 값이 표시되는 방식을 제어할 수 있습니다. 서식 지정에 대한 자세한 내용은 열거형 값 서식 지정을 참조 하세요.

참고 항목

특정 값의 동의어를 정의하는 열거형의 경우 출력 ToString()에 의존하는 코드를 작성하지 마세요. 메서드는 값에 유효한 이름을 반환할 수 있습니다.

<enum-value>.ToString([<format-string>])

다음 예제에서는 음영 열거형 Gray 을 동의어로 정의합니다Grey. 그런 다음 실제 열거형 값, 열거형을 문자열로 표시하고 열거형을 정수로 표시하는 개체를 출력합니다.

enum Shade {
    White
    Grey
    Gray = 1
    Black
}

[Shade].GetEnumValues() | Foreach-Object -Process {
    [pscustomobject]@{
        EnumValue    = $_
        StringValue  = $_.ToString()
        IntegerValue = [int]$_
    }
}
numValue StringValue IntegerValue
--------- ----------- ------------
    White White                  0
     Grey Grey                   1
     Grey Grey                   1
    Black Black                  2

열거형 값 동의어

동일한 정수 값에 서로 다른 이름을 지정하는 열거형을 정의할 수 있습니다. 이렇게 하면 동일한 기본 값을 가리키는 이름을 동의어라고 합니다. 동의어가 있는 열거형을 사용하면 사용자가 동일한 값에 대해 다른 이름을 지정할 수 있습니다.

동의어를 사용하여 열거형을 정의하는 경우 특정 이름으로 변환 되는 동의어 값에 따라 달라지는 코드를 작성하지 마세요. 동의어 문자열을 열거형 값으로 변환하는 코드를 안정적으로 작성할 수 있습니다. 열거형 값 자체를 사용하는 경우 항상 열거형 값 또는 문자열이 아닌 해당 기본 형식으로 비교합니다.

다음 코드 블록은 동의어와 Gray 동의어로 Grey 셰이드 열거형을 정의합니다.

enum Shade {
    White
    Grey
    Gray = 1
    Black
}

[Shade]'Grey' -eq [Shade]::Gray
[Shade]::Grey -eq 1
[Shade]'Gray' -eq 1
True
True
True

플래그로 열거형

열거형의 일반적인 용도 중 하나는 상호 배타적인 값 집합을 나타내는 것입니다. 예를 들어 ArrivalStatus 인스턴스의 값은 Early, OnTime 또는 Late일 수 있습니다. ArrivalStatus 인스턴스의 값이 둘 이상의 열거형 상수에 반영되는 것은 의미가 없습니다.

그러나 열거형 개체의 값에는 여러 열거형 멤버가 포함될 수 있으며 각 멤버는 열거형 값의 비트 필드를 나타냅니다. FlagsAttribute사용하여 열거형이 사용자가 결합할 수 있는 플래그로 비트 필드로 구성됨을 나타낼 수 있습니다.

플래그로 열거형이 제대로 작동하려면 각 레이블의 정수 값을 2의 강력한 값으로 설정해야 합니다. 레이블 값을 지정하지 않으면 PowerShell은 값을 이전 레이블보다 높은 값으로 설정합니다.

사용자가 플래그 집합을 한 번에 쉽게 지정할 수 있도록 일반적으로 사용되는 플래그 조합에 대한 값을 정의할 수 있습니다. 값의 이름은 플래그의 결합된 이름이어야 합니다. 정수 값은 플래그 값의 합계여야 합니다.

특정 플래그가 값에 대해 설정되었는지 여부를 확인하려면 값에 HasFlag() 메서드를 사용하거나 이진 비교 연산자를 -band사용합니다.

플래그 열거형을 사용하고 플래그가 설정되었는지 여부를 확인하는 방법을 보여 주는 샘플은 예제 3을 참조하세요.

매개 변수로 열거형

열거형을 해당 형식으로 사용하는 cmdlet 매개 변수를 정의할 수 있습니다. 열거형을 매개 변수의 형식으로 지정하면 사용자는 매개 변수 값에 대한 자동 완성 및 유효성 검사를 받습니다. 인수 완성은 열거형의 유효한 레이블 목록을 제안합니다.

매개 변수에 해당 형식으로 열거형이 있는 경우 다음 중 어느 것을 지정할 수 있습니다.

  • 열거형(예: [<EnumType>]::<Label>
  • 문자열로 열거형에 대한 레이블입니다.
  • 열거형의 숫자 값입니다.

열거형 형식 매개 변수의 동작을 보여 주는 샘플은 예제 4를 참조하세요.

특정 기본 형식을 사용하는 열거형

PowerShell 6.2부터 특정 기본 형식으로 열거형을 정의할 수 있습니다. 특정 기본 형식 없이 열거형을 정의하면 PowerShell은 (System.Int32)를 기본 형식으로 사용하여 열거형 [int] 을 만듭니다.

열거형의 기본 형식은 정수 숫자 형식이어야 합니다. 다음 목록에는 짧은 이름과 전체 형식 이름을 가진 유효한 형식이 포함됩니다.

  • byte - System.Byte
  • sbyte - System.SByte
  • short - System.Int16
  • ushort - System.UInt16
  • int - System.Int32
  • uint - System.UInt32
  • long - System.Int64
  • ulong - System.UInt64

열거형의 특정 기본 형식을 짧은 이름 또는 전체 형식 이름으로 정의할 수 있습니다. 다음 정의는 기능적으로 동일합니다. 기본 형식에 사용되는 이름만 다릅니다.

enum LongValueEnum : long {
    Zero
    One
    Two
}
enum LongValueEnum : System.Int64 {
    Zero
    One
    Two
}

열거형 값 서식 지정

정적 Format 메서드와 인스턴스 ToString 메서드의 오버로드를 호출하여 열거형 값을 문자열 표현으로 변환할 수 있습니다. 형식 문자열을 사용하여 열거형 값이 문자열로 표시되는 정확한 방법을 제어할 수 있습니다. 자세한 내용은 열거형 형식 문자열을 참조하세요.

다음 예제에서는 지원되는 각 열거형 형식 문자열(G또는g, D 또는 X d또는 또는 또는 F x)f을 사용하여 TaskState 열거형의 각 멤버를 해당 문자열 표현으로 변환합니다.

enum TaskState {
    ToDo
    Doing
    Done
}

[TaskState].GetEnumValues() | ForEach-Object {
    [pscustomobject]@{
        "ToString('G')" = $_.ToString('G')
        "ToString('D')" = $_.ToString('D')
        "ToString('X')" = $_.ToString('X')
        "ToString('F')" = $_.ToString('F')
    }
}
ToString('G') ToString('D') ToString('X') ToString('F')
------------- ------------- ------------- -------------
ToDo          0             00000000      ToDo
Doing         1             00000001      Doing
Done          2             00000002      Done

다음 예제에서는 플래그 열거형 값에 서식 문자열을 사용합니다.

[Flags()] enum FlagEnum {
    A = 1
    B = 2
    C = 4
}

$FlagValues = @(
    [FlagEnum]::A                                 # 1
    [FlagEnum]::B                                 # 2
    [FlagEnum]::A + [FlagEnum]::B                 # 3
    [FlagEnum]::C                                 # 4
    [FlagEnum]::C + [FlagEnum]::A                 # 5
    [FlagEnum]::C + [FlagEnum]::B                 # 6
    [FlagEnum]::C + [FlagEnum]::A + [FlagEnum]::B # 7
    [FlagEnum]::C + [FlagEnum]::C                 # 8
)

foreach ($Value in $FlagValues) {
    [pscustomobject]@{
        "ToString('G')" = $Value.ToString('G')
        "ToString('D')" = $Value.ToString('D')
        "ToString('X')" = $Value.ToString('X')
        "ToString('F')" = $Value.ToString('F')
    }
}
ToString('G') ToString('D') ToString('X') ToString('F')
------------- ------------- ------------- -------------
A             1             00000001      A
B             2             00000002      B
A, B          3             00000003      A, B
C             4             00000004      C
A, C          5             00000005      A, C
B, C          6             00000006      B, C
A, B, C       7             00000007      A, B, C
8             8             00000008      8

플래그 열거형의 G 경우 문자열 및 F 서식 문자열은 쉼표로 구분된 값에 대한 집합 플래그 목록을 표시합니다. 마지막 값은 8실제로 유효한 플래그 집합이 아니므로 플래그를 나열하지 않습니다. 하나 이상의 플래그를 복제하지 않고는 열거형 플래그를 결합하여 합계 8 를 가져올 수 없습니다.

Update-TypeData를 사용하여 확장 메서드 정의

열거형에 대한 선언에는 메서드를 정의할 수 없습니다. 열거형의 기능을 확장하려면 Update-TypeData cmdlet을 사용하여 열거형에 대한 멤버를 정의 ScriptMethod 할 수 있습니다.

다음 예제에서는 cmdlet을 Update-TypeData 사용하여 FileAttributes 플래그 열거형에 메서드 추가 GetFlags() 합니다. 값에 대해 설정된 플래그의 배열을 반환합니다.

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

$MemberDefinition = @{
    TypeName   = 'FileAttributes'
    MemberName = 'GetFlags'
    MemberType = 'ScriptMethod'
    Value      = {
        foreach ($Flag in $this.GetType().GetEnumValues()) {
          if ($this.HasFlag($Flag)) { $Flag }
        }
    }
}

Update-TypeData @MemberDefinition

$File = [FileAttributes]28

$File.GetFlags()
Device
Directory
Encrypted

형식 가속기를 사용하여 열거형 내보내기

기본적으로 PowerShell 모듈은 PowerShell에 정의된 클래스 및 열거형을 자동으로 내보내지 않습니다. 문을 호출하지 않고는 모듈 외부에서 사용자 지정 형식을 using module 사용할 수 없습니다.

그러나 모듈에서 형식 가속기를 추가하는 경우 사용자가 모듈을 가져온 후 해당 형식 가속기를 세션에서 즉시 사용할 수 있습니다.

참고 항목

세션에 형식 가속기를 추가하면 내부(공용이 아님) API가 사용됩니다. 이 API를 사용하면 충돌이 발생할 수 있습니다. 모듈을 가져올 때 이름이 같은 형식 가속기가 이미 있는 경우 아래에 설명된 패턴은 오류를 throw합니다. 또한 세션에서 모듈을 제거할 때 형식 가속기를 제거합니다.

이 패턴은 세션에서 형식을 사용할 수 있도록 합니다. VS Code에서 스크립트 파일을 작성할 때 IntelliSense 또는 완성에는 영향을 주지 않습니다. VS Code에서 사용자 지정 형식에 대한 IntelliSense 및 완성 제안을 얻으려면 스크립트 맨 위에 문을 추가 using module 해야 합니다.

다음 패턴에서는 PowerShell 클래스 및 열거형을 모듈의 형식 가속기로 등록하는 방법을 보여 줍니다. 형식 정의 후에 루트 스크립트 모듈에 코드 조각을 추가합니다. 변수에 $ExportableTypes 사용자가 모듈을 가져올 때 사용할 수 있도록 하려는 각 형식이 포함되어 있는지 확인합니다. 다른 코드는 편집할 필요가 없습니다.

# Define the types to export with type accelerators.
$ExportableTypes =@(
    [DefinedTypeName]
)
# Get the internal TypeAccelerators class to use its static methods.
$TypeAcceleratorsClass = [psobject].Assembly.GetType(
    'System.Management.Automation.TypeAccelerators'
)
# Ensure none of the types would clobber an existing type accelerator.
# If a type accelerator with the same name exists, throw an exception.
$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get
foreach ($Type in $ExportableTypes) {
    if ($Type.FullName -in $ExistingTypeAccelerators.Keys) {
        $Message = @(
            "Unable to register type accelerator '$($Type.FullName)'"
            'Accelerator already exists.'
        ) -join ' - '

        throw [System.Management.Automation.ErrorRecord]::new(
            [System.InvalidOperationException]::new($Message),
            'TypeAcceleratorAlreadyExists',
            [System.Management.Automation.ErrorCategory]::InvalidOperation,
            $Type.FullName
        )
    }
}
# Add type accelerators for every exportable type.
foreach ($Type in $ExportableTypes) {
    $TypeAcceleratorsClass::Add($Type.FullName, $Type)
}
# Remove type accelerators when the module is removed.
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
    foreach($Type in $ExportableTypes) {
        $TypeAcceleratorsClass::Remove($Type.FullName)
    }
}.GetNewClosure()

사용자가 모듈을 가져올 때 세션의 형식 가속기에 추가된 모든 형식을 IntelliSense 및 완성에 즉시 사용할 수 있습니다. 모듈이 제거되면 형식 가속기도 마찬가지입니다.

PowerShell 모듈에서 수동으로 열거형 가져오기

Import-Module 문은 #requires 모듈에서 정의한 대로 모듈 함수, 별칭 및 변수만 가져옵니다. 열거형은 가져오지 않습니다.

모듈이 클래스 및 열거형을 정의하지만 해당 형식에 대한 형식 가속기를 추가하지 않는 경우 문을 사용하여 using module 클래스를 가져옵니다.

이 문은 스크립트 모듈 또는 이 using module 진 모듈의 루트 모듈(ModuleToProcess)에서 클래스 및 열거형을 가져옵니다. 중첩된 모듈에 정의된 클래스 또는 루트 모듈에 점 소스가 지정된 스크립트에 정의된 클래스를 일관되게 가져오지 않습니다. 루트 모듈에서 직접 모듈 외부의 사용자가 사용할 수 있도록 하려는 클래스를 정의합니다.

문에 대한 using 자세한 내용은 about_Using 참조하세요.

개발 중에 새로 변경된 코드 로드

스크립트 모듈을 개발하는 동안 코드를 변경한 다음 Force 매개 변수를 사용하여 Import-Module 모듈의 새 버전을 로드하는 것이 일반적입니다. 이는 루트 모듈의 함수 변경에 대해서만 작동합니다. Import-Module 는 중첩된 모듈을 다시 로드하지 않습니다. 또한 업데이트된 클래스를 로드할 수 있는 방법은 없습니다.

최신 버전을 실행하려면 새 세션을 시작해야 합니다. PowerShell에서 정의되고 문으로 using 가져온 클래스 및 열거형은 언로드할 수 없습니다.

또 다른 일반적인 개발 방법은 코드를 다른 파일로 분리하는 것입니다. 한 파일에 다른 모듈에 정의된 열거형을 사용하는 함수가 있는 경우 문을 사용하여 using module 함수에 필요한 열거형 정의가 있는지 확인해야 합니다.

제한 사항

  • 특성으로 PowerShell에 정의된 열거형 값을 데코레이트할 수 없습니다. 열거형을 비트 플래그 집합으로 정의하기 위한 FlagsAttribute마찬가지로 열거형 선언 자체만 데코레이트할 수 있습니다.

    해결 방법: 없음

  • 열거형 정의 내에서 메서드를 정의할 수 없으며 PowerShell은 C#과 같은 [확장 메서드] 정의를 지원하지 않습니다.

    해결 방법: Update-TypeData cmdlet을 사용하여 열거형에 대한 멤버를 정의 ScriptMethod 합니다.