about_Hash_Tables

업데이트 날짜: 2014년 5월

적용 대상: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

항목

about_Hash_Tables

간단한 설명

Windows PowerShell®에서 해시 테이블을 만들고 사용하고 정렬하는 방법에 대해 설명합니다.

자세한 설명

사전 또는 결합형 배열이라고도 하는 해시 테이블은 하나 이상의 키/값 쌍을 저장하는 압축 데이터 구조입니다. 예를 들어 해시 테이블에는 일련의 IP 주소 및 컴퓨터 이름이 포함될 수 있습니다. 여기서 IP 주소는 키이고 컴퓨터 이름은 값이거나 그 반대로 사용됩니다.

Windows PowerShell에서 각 해시 테이블은 Hashtable(System.Collections.Hashtable) 개체입니다. Windows PowerShell에서 Hashtable 개체의 속성 및 메서드를 사용할 수 있습니다.

Windows PowerShell 3.0부터 [ordered] 특성을 사용하여 Windows PowerShell에서 순서가 지정된 사전(System.Collections.Specialized.OrderedDictionary)을 만들 수 있습니다.

키가 항상 사전을 나열한 순서대로 표시된다는 점에서 순서가 지정된 사전은 해시 테이블과 다릅니다. 해시 테이블에서 키의 순서는 정해져 있지 않습니다.

또한 해시 테이블의 키 및 값은 .NET 개체입니다. 대부분 문자열 또는 정수이지만 개체 형식일 수 있습니다. 키 값이 또 다른 해시 테이블인 중첩된 해시 테이블을 만들 수도 있습니다.

해시 테이블은 데이터를 찾고 검색하는 데 매우 효율적이므로 자주 사용됩니다. 해시 테이블을 사용하여 목록을 저장하고 Windows PowerShell에서 계산된 속성을 만듭니다. 또한 Windows PowerShell에는 문자열을 해시 테이블로 변환하는 ConvertFrom-StringData cmdlet이 있습니다.

구문

해시 테이블의 구문은 다음과 같습니다.

          @{ <name> = <value>; [<name> = <value> ] ...}

순서가 지정된 사전의 구문은 다음과 같습니다.

          [ordered]@{ <name> = <value>; [<name> = <value> ] ...}

[ordered] 특성은 Windows PowerShell 3.0에 도입되었습니다.

해시 테이블 만들기

해시 테이블을 만들려면 다음 지침을 따르세요.

- 해시 테이블을 at 기호(@)로 시작합니다.

- 해시 테이블을 중괄호({})로 묶습니다.

- 해시 테이블의 콘텐츠로 하나 이상의 키/값 쌍을 입력합니다.

- 등호(=)를 사용하여 각 키를 해당 값과 구분합니다.

- 세미콜론(;) 또는 줄 바꿈을 사용하여 키/값 쌍을 구분합니다.

- 공백이 포함된 키는 따옴표로 묶어야 합니다. 값은 유효한 Windows PowerShell 식이어야 합니다. 공백이 없더라도 문자열은 따옴표 안에 표시되어야 합니다.

- 해시 테이블을 관리하려면 해시 테이블을 변수에 저장합니다.

- 순서가 지정된 해시 테이블을 변수에 할당할 때 [ordered] 특성을 "@" 기호 앞에 배치합니다. 변수 이름 앞에 배치하면 명령이 실패합니다.

$hash 값에서 빈 해시 테이블을 만들려면 다음을 입력합니다.

          $hash = @{}

해시 테이블을 만들 때 해시 테이블에 키와 값을 추가할 수도 있습니다. 예를 들어 다음 문은 키 3개가 포함된 해시 테이블을 만듭니다.

          $hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

순서가 지정된 사전 만들기

OrderedDictiory 형식의 개체를 추가하여 순서가 지정된 사전을 만들 수 있지만 순서가 지정된 사전을 만드는 가장 쉬운 방법은 [Ordered] 특성을 사용하는 것입니다.

[ordered] 특성은 Windows PowerShell 3.0에 도입되었습니다.

특성을 "@" 기호 바로 앞에 배치합니다.

          $hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

해시 테이블을 사용하는 것과 같은 방법으로 순서가 지정된 사전을 사용할 수 있습니다. 각 형식은 해시 테이블이나 사전(iDictionary)을 사용하는 매개 변수의 값으로 사용될 수 있습니다.

해시 테이블을 변환하거나 캐스트하는 데는 [ordered] 특성을 사용할 수 없습니다. 순서가 지정된 특성을 변수 이름 앞에 배치하면 명령이 실패하고 다음 오류 메시지가 표시됩니다.

        PS C:\> [ordered]$hash = @{}
        At line:1 char:1
        + [ordered]$hash = @{}
        + ~~~~~~~~~~~~~~
        The ordered attribute can be specified only on a hash literal node.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
    To correct the expression, move the [ordered] attribute.     
        PS C:\> $hash = [ordered]@{}

순서가 지정된 사전을 해시 테이블로 캐스트할 수 있지만, 변수를 지우고 새 값을 입력해도 순서가 지정된 특성을 복구할 수 없습니다. 순서를 다시 설정하려면 변수를 제거하고 다시 만들어야 합니다.

        PS C:\> [hashtable]$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
        PS C:\ps-test> $hash

        Name                           Value
        ----                           -----
        Color                          Blue
        Shape                          Square
        Number                         1

해시 테이블 표시

변수에 저장된 해시 테이블을 표시하려면 변수 이름을 입력합니다. 기본적으로 해시 테이블은 키 및 값에 대한 열이 하나씩 포함된 테이블로 표시됩니다.

          C:\PS> $hash
        
          Name                           Value
          ----                           -----
          Shape                          Square
          Color                          Blue
          Number                         1

해시 테이블에는 Keys 및 Values 속성이 있습니다. 점 표기법을 사용하여 모든 키나 모든 값을 표시합니다.

          C:\PS> $hash.keys
          Number
          Shape
          Color
        
          C:\PS> $hash.values
          1
          Square
          Blue
         

각 키 이름도 해시 테이블의 속성이고 해당 값은 key-name 속성의 값입니다. 다음 형식을 사용하여 속성 값을 표시합니다.

          $hashtable.<key>
          <value>     

예를 들면 다음과 같습니다.

          C:\PS> $hash.Number
          1

          C:\PS> $hash.Color
          Blue

해시 테이블에는 해시 테이블에서 키-값 쌍 수를 나타내는 Count 속성이 있습니다.

          C:\PS> $hash.count
          3

해시 테이블은 배열이 아니므로 해시 테이블에 대한 인덱스로 정수를 사용할 수 없지만 키 이름을 사용하여 해시 테이블로 인덱싱할 수 있습니다. 키가 문자열 값이면 키 이름을 따옴표로 묶습니다.

예를 들면 다음과 같습니다.

          C:\PS> $hash["Number"]
          1

키와 값 추가 및 제거

키와 값을 해시 테이블에 추가하려면 다음 명령 형식을 사용합니다.

          $hash["<key>"] = "<value>"

예를 들어 "Time" 키를 "Now" 값과 함께 해시 테이블에 추가하려면 다음 문 형식을 사용합니다.

          $hash["Time"] = "Now"

System.Collections.Hashtable 개체의 Add 메서드를 사용하여 키와 값을 해시 테이블에 추가할 수도 있습니다. Add 메서드의 구문은 다음과 같습니다.

          Add(Key, Value)

예를 들어 "Time" 키를 "Now" 값과 함께 해시 테이블에 추가하려면 다음 문 형식을 사용합니다.

          $hash = $hash.Add("Time", "Now")

또한 더하기 연산자(+)를 사용하여 해시 테이블을 기존 해시 테이블에 추가하는 방식으로 키와 값을 해시 테이블에 추가할 수 있습니다. 예를 들어 다음 문은 "Time" 키를 "Now" 값과 함께 $hash 변수의 해시 테이블에 추가합니다.

          $hash = $hash + @{Time="Now"}

변수에 저장된 값을 추가할 수도 있습니다.

          $t = "Today"
          $now = (Get-Date)
          
          $hash.Add($t, $now)      

키/값 쌍을 해시 테이블에서 제거하는 데는 빼기 연산자를 사용할 수 없지만 Hashtable 개체의 Remove 메서드를 사용할 수 있습니다. Remove 메서드는 키를 값으로 사용합니다.

Remove 메서드의 구문은 다음과 같습니다.

          Remove(Key)          

예를 들어 $hash 변수 값의 해시 테이블에서 Time=Now 키/값 쌍을 제거하려면 다음을 입력합니다.

          $hash.$Remove("Time")

Contains, Clear, Clone 및 CopyTo를 포함하여 Windows PowerShell에서 Hashtable 개체의 모든 속성 및 메서드를 사용할 수 있습니다. Hashtable 개체에 대한 자세한 내용은 MSDN에서 "System.Collections.Hashtable"을 참조하세요.

해시 테이블의 개체 형식

해시 테이블의 키 및 값은 .NET 개체 형식을 사용하고 단일 해시 테이블에는 여러 형식의 키 및 값이 포함될 수 있습니다.

다음 문은 프로세스 이름 문자열 및 프로세스 개체 값의 해시 테이블을 만들고 이를 $p 변수에 저장합니다.

          $p = @{"PowerShell" = (get-process PowerShell); 
          "Notepad" = (get-process notepad)}

해시 테이블을 $p에 표시하고 key-name 속성을 사용하여 값을 표시할 수 있습니다.

          C:\PS> $p

          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          C:\PS> $p.PowerShell        
      
          Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
          -------  ------    -----      ----- -----   ------     -- -----------
              441      24    54196      54012   571     5.10   1788 PowerShell
          C:\PS> $p.keys | foreach {$p.$_.handles}
          441
          251

해시 테이블의 키는 .NET 형식일 수도 있습니다. 다음 문은 $p 변수의 해시 테이블에 키/값 쌍을 추가합니다. 키는 WinRM 서비스를 나타내는 Service 개체이고 값은 서비스의 현재 상태입니다.

           C:\PS> $p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}

해시 테이블에서 다른 쌍에 사용하는 것과 같은 메서드를 사용하여 새 키/값 쌍을 표시하여 이에 액세스할 수 있습니다.

           C:\PS> $p

           Name                           Value
           ----                           -----
           PowerShell                     System.Diagnostics.Process (PowerShell)
           Notepad                        System.Diagnostics.Process (notepad)
           System.ServiceProcess.Servi... Running

       
           C:\PS> $p.keys
           PowerShell
           Notepad

           Status   Name               DisplayName
           ------   ----               -----------
           Running  winrm              Windows Remote Management (WS-Manag...

            
           C:\PS> $p.keys | foreach {$_.name}
           winrm        

해시 테이블의 키 및 값은 Hashtable 개체일 수도 있습니다. 다음 문은 $p 변수의 해시 테이블에 키/값 쌍을 추가합니다. 여기서 키는 문자열 Hash2이고 값은 키/값 쌍 3개가 포함된 해시 테이블입니다.

          C:\PS> $p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

같은 메서드를 사용하여 새 값을 표시하고 이에 액세스할 수 있습니다.

          C:\PS> $p


          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          System.ServiceProcess.Servi... Running
          Hash2                          {a, b, c}


          C:\PS> $p.Hash2

          Name                           Value
          ----                           -----
          a                              1
          b                              2
          c                              3


          C:\PS> $p.Hash2.b
          2
     

키 및 값 정렬

해시 테이블의 항목은 기본적으로 순서가 지정되지 않습니다. 키/값 쌍은 표시될 때마다 다른 순서로 표시될 수 있습니다.

해시 테이블을 정렬할 수 없지만 해시 테이블의 GetEnumerator 메서드를 사용하여 키와 값을 열거하고 Sort-Object cmdlet을 사용하여 표시할 열거된 값을 정렬할 수 있습니다.

예를 들어 다음 명령은 $p 변수의 해시 테이블에서 키와 값을 열거하고 키를 사전순으로 정렬합니다.

          C:\PS> $p.GetEnumerator() | Sort-Object -Property key

          Name                           Value
          ----                           -----
          Notepad                        System.Diagnostics.Process (notepad)
          PowerShell                     System.Diagnostics.Process (PowerShell)
          System.ServiceProcess.Servi... Running

다음 명령은 같은 절차를 사용하여 해시 테이블을 내림차순으로 정렬합니다.

          C:\PS> $p.getenumerator() | Sort-Object -Property Value -Descending

          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          System.ServiceProcess.Servi... Running

해시 테이블에서 개체 만들기

Windows PowerShell 3.0부터 속성 및 속성 값의 해시 테이블에서 개체를 만들 수 있습니다.

구문은 다음과 같습니다.

        [<class-name>]@{<property-name>=<property-value>;<property-name>=<property-value>}

이 메서드는 매개 변수가 없는 생성자인 null 생성자가 있는 클래스에서만 작동합니다. 개체 속성은 public이고 설정 가능해야 합니다.

자세한 내용은 about_Object_Creation을 참조하세요.

ConvertFrom-StringData

ConvertFrom-StringData cmdlet은 키/값 쌍의 문자열 또는 here-string을 해시 테이블로 변환합니다. 스크립트의 Data 섹션에서 ConvertFrom-StringData cmdlet을 안전하게 사용할 수 있고 이 cmdlet을 Import-LocalizedData cmdlet과 함께 사용하여 현재 사용자의 UI(사용자 인터페이스) 문화권으로 사용자 메시지를 표시할 수 있습니다.

Here-string은 특히 해시 테이블의 값에 따옴표가 포함될 때 유용합니다. here-string에 대한 자세한 내용은 about_Quoting_Rules를 참조하세요.

다음 예제에서는 이전 예제에 있는 사용자 메시지의 here-string을 만드는 방법과 ConvertFrom-StringData를 사용하여 이 here-string을 문자열에서 해시 테이블로 변환하는 방법을 보여 줍니다.

다음 명령은 키/값 상의 here-string을 만들고 이를 $string 변수에 저장합니다.

          C:\PS> $string = @"
          Msg1 = Type "Windows".
          Msg2 = She said, "Hello, World."
          Msg3 = Enter an alias (or "nickname").
          "@

이 명령은 ConvertFrom-StringData cmdlet을 사용하여 here-string을 해시 테이블로 변환합니다.

        C:\PS> ConvertFrom-StringData $string

        Name                           Value
        ----                           -----
        Msg3                           Enter an alias (or "nickname").
        Msg2                           She said, "Hello, World."
        Msg1                           Type "Windows".

here-string에 대한 자세한 내용은 about_Quoting_Rules를 참조하세요.

참고 항목

about_arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

MSDN의 "System.Collections.Hashtable"