다음을 통해 공유


about_Hash_Tables

간단한 설명

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

자세한 설명

사전 또는 결합 배열이라고도 하는 A hashtable는 하나 이상의 키-값 쌍을 저장하는 압축 데이터 구조입니다. 예를 들어 해시 테이블에는 일련의 IP 주소와 컴퓨터 이름이 포함될 수 있습니다. 여기서 IP 주소는 키이고 컴퓨터 이름은 값이거나 그 반대의 경우도 마찬가지입니다.

PowerShell에서 각각 hashtable 은 개체입니다 [System.Collections.Hashtable] . PowerShell에서 개체의 Hashtable 속성과 메서드를 사용할 수 있습니다.

PowerShell 3.0부터 형식 가속기를 사용하여 [ordered] PowerShell에서 개체를 [System.Collections.Specialized.OrderedDictionary] 만들 수 있습니다.

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

해시 테이블의 키와 값도 .NET 개체입니다. 가장 자주 문자열 또는 정수이지만 모든 개체 형식을 가질 수 있습니다. 키 값이 다른 hashtable중첩된 해시 테이블을 만들 수도 있습니다.

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

구문

구문 hashtable 은 다음과 같습니다.

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

정렬된 사전의 구문은 다음과 같습니다.

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

[ordered] 형식 가속기는 PowerShell 3.0에서 도입되었습니다.

만들 hashtable려면 다음 지침을 따릅니다.

  • hashtable At 기호(@)로 시작합니다.
  • 중괄호(hashtable{})를 묶습니다.
  • 의 콘텐츠에 대해 하나 이상의 키-값 쌍을 입력합니다 hashtable.
  • 등호(=)를 사용하여 각 키를 해당 값과 구분합니다.
  • 세미콜론(;) 또는 줄 바꿈을 사용하여 키-값 쌍을 구분합니다.
  • 공백을 포함하는 키는 따옴표로 묶어야 합니다. 값은 유효한 PowerShell 식이어야 합니다. 문자열은 공백을 포함하지 않더라도 따옴표로 표시되어야 합니다.
  • 관리 hashtable하려면 변수에 저장합니다.
  • 순서가 지정된 hashtable 변수를 변수에 할당할 때 기호 앞에 형식을 [ordered] 배치합니다 @ . 변수 이름 앞에 배치하면 명령이 실패합니다.

해시 테이블을 사용하는 것과 동일한 방식으로 정렬된 사전을 사용할 수 있습니다. 형식을 사용하거나 사전(iDictionary) 형식 개체를 hashtable 사용하는 매개 변수 값으로 사용할 수 있습니다.

해시 테이블 및 정렬된 사전 만들기

다음과 순서 hashtable 가 지정된 사전 예제를 고려합니다.

$hash = @{
    1       = 'one'
    2       = 'two'
    'three' = 3
}
$hash
Name                           Value
----                           -----
three                          3
2                              two
1                              one

볼 수 있듯이 키-값 쌍은 hashtable 정의된 순서대로 표시되지 않습니다.

정렬된 사전을 만드는 가장 쉬운 방법은 특성을 사용하는 [ordered] 것입니다. 기호 바로 앞에 특성을 배치합니다 @ .

$dictionary = [ordered]@{
    1       = 'one'
    2       = 'two'
    'three' = 3
}
$dictionary
Name                           Value
----                           -----
1                              one
2                              two
three                          3

해시 테이블과 달리 순서가 지정된 사전은 키-값의 순서를 유지합니다.

해시 테이블 및 정렬된 사전 변환

형식 가속기를 [ordered] 사용하여 변환하거나 캐스팅 hashtable할 수 없습니다. 순서가 지정된 특성을 변수 이름 앞에 배치하면 다음 오류 메시지와 함께 명령이 실패합니다.

[ordered]$orderedhash = @{}
ParserError:
Line |
   1 |  [ordered]$orderedhash = @{}
     |  ~~~~~~~~~~~~~~
     | The ordered attribute can be specified only on a hash literal node.

식을 수정하려면 [ordered] 특성을 이동합니다.

$orderedhash = [ordered]@{}

순서가 지정된 사전을 A hashtable로 캐스팅할 수 있지만 멤버의 순서를 보장할 수는 없습니다.

[hashtable]$newhash = [ordered]@{
    Number = 1
    Shape = "Square"
    Color = "Blue"
}
$newhash
Name                           Value
----                           -----
Color                          Blue
Shape                          Square
Number                         1

Hashtable 및 사전 속성

해시 테이블 및 정렬된 사전은 여러 속성을 공유합니다. 이전 예제에 $hash 정의된 변수 및 $dictionary 변수를 고려합니다.

$hash | Get-Member -MemberType Properties, ParameterizedProperty
   TypeName: System.Collections.Hashtable

Name           MemberType            Definition
----           ----------            ----------
Item           ParameterizedProperty System.Object Item(System.Object key) {get;set;}
Count          Property              int Count {get;}
IsFixedSize    Property              bool IsFixedSize {get;}
IsReadOnly     Property              bool IsReadOnly {get;}
IsSynchronized Property              bool IsSynchronized {get;}
Keys           Property              System.Collections.ICollection Keys {get;}
SyncRoot       Property              System.Object SyncRoot {get;}
Values         Property              System.Collections.ICollection Values {get;}
$dictionary | Get-Member -MemberType Properties, ParameterizedProperty
   TypeName: System.Collections.Specialized.OrderedDictionary

Name           MemberType            Definition
----           ----------            ----------
Item           ParameterizedProperty System.Object Item(int index) {get;set;},
                                     System.Object Item(System.Object key) {get;set;}
Count          Property              int Count {get;}
IsFixedSize    Property              bool IsFixedSize {get;}
IsReadOnly     Property              bool IsReadOnly {get;}
IsSynchronized Property              bool IsSynchronized {get;}
Keys           Property              System.Collections.ICollection Keys {get;}
SyncRoot       Property              System.Object SyncRoot {get;}
Values         Property              System.Collections.ICollection Values {get;}

가장 자주 사용되는 속성은 Count, Keys, ValuesItem입니다.

  • 개체의 키-값 쌍 수를 나타내는 Count 속성입니다.

  • Keys 속성은 또는 사전에 있는 hashtable 키 이름의 컬렉션입니다.

    PS> $hash.Keys
    three
    2
    1
    
    PS> $dictionary.Keys
    1
    2
    three
    
  • Values 속성은 또는 사전에 있는 hashtable 값의 컬렉션입니다.

    PS> $hash.Values
    3
    two
    one
    
    PS> $dictionary.Values
    one
    two
    3
    
  • Item 속성은 지정한 항목의 값을 반환하는 매개 변수가 있는 속성입니다. 해시 테이블은 매개 변수가 있는 속성에 대한 매개 변수로 키를 사용하고 사전은 기본적으로 인덱스를 사용합니다. 이러한 차이는 각 형식의 값에 액세스하는 방법에 영향을 줍니다.

값 액세스

멤버 표기법 또는 배열 인덱스 표기법과 같은 두 가지 일반적인 방법으로 한 사전의 값 hashtable 에 액세스할 수 있습니다.

  • 멤버 표기법 - 키 이름을 개체의 멤버 속성으로 사용하여 값에 액세스할 수 있습니다. 예시:

    PS> $hash.1
    one
    
    PS> $dictionary.2
    two
    
  • 배열 인덱스 표기법 - 인덱스 표기법을 사용하여 값에 액세스할 수 있습니다. PowerShell은 해당 표기법을 개체의 Item 매개 변수가 있는 속성에 대한 호출로 변환합니다.

    해시 테이블과 함께 인덱스 표기법을 사용하는 경우 대괄호 안의 값은 키 이름입니다. 키가 문자열 값인 경우 키 이름을 따옴표로 묶습니다. 예시:

    PS> $hash['three']
    3
    
    PS> $hash[2]
    2
    

    이 예제에서 키 값은 값 2 컬렉션의 인덱스가 아닙니다. 키-값 쌍의 키 값입니다. 값 컬렉션으로 인덱싱하여 이를 증명할 수 있습니다.

    PS> ([array]$hash.Values)[2]
    one
    

    사전에서 인덱스 표기법을 사용하는 경우 대괄호 안의 값은 해당 형식에 따라 해석됩니다. 값이 정수이면 값 컬렉션의 인덱스로 처리됩니다. 값이 정수가 아니면 키 이름으로 처리됩니다. 예시:

    PS> $dictionary[1]
    two
    PS> ([array]$dictionary.Values)[1]
    two
    PS> $dictionary[[object]1]
    one
    PS> $dictionary['three']
    3
    

    이 예제에서 배열 값 [1] 은 매개 변수가 있는 속성 오버로드를 사용하여 값 컬렉션에 대한 Item(int index) 인덱스입니다. 배열 값 [[object]1] 은 인덱스가 아니라 오버로드를 사용하는 키 값입니다 Item(System.Object key) .

    참고 항목

    키 값이 정수인 경우 이 동작은 혼동될 수 있습니다. 가능하면 사전에서 정수 키 값을 사용하지 않아야 합니다.

속성 이름 충돌 처리

키 이름이 형식의 HashTable 속성 이름 중 하나와 충돌하는 경우 psbase 내장 멤버를 사용하여 해당 속성에 액세스할 수 있습니다. 예를 들어 키 이름이고 keys 키 컬렉션을 HashTable 반환하려는 경우 다음 구문을 사용합니다.

$hashtable.psbase.Keys

이 요구 사항은 인터페이스를 구현하는 다른 형식(예: OrderedDictionary.)에 System.Collections.IDictionary 적용됩니다.

키 및 값 반복

여러 가지 방법으로 값을 처리하기 위해 키를 hashtable 반복할 수 있습니다. 이 섹션의 각 예제에는 동일한 출력이 있습니다. 여기에 정의된 변수를 $hash 반복합니다.

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

참고 항목

이러한 예제 $hash 에서는 출력이 항상 동일한 순서로 표시되도록 순서가 지정된 사전으로 정의됩니다. 이러한 예제는 표준 해시 테이블에서 동일하게 작동하지만 출력 순서는 예측할 수 없습니다.

각 예제는 모든 키와 해당 값에 대한 메시지를 반환합니다.

The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue

이 예제에서는 foreach 블록을 사용하여 키를 반복합니다.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

이 예제에서는 키를 반복하는 데 사용합니다 ForEach-Object .

$hash.Keys | ForEach-Object {
    "The value of '$_' is: $($hash[$_])"
}

이 예제에서는 메서드를 GetEnumerator() 사용하여 파이프라인을 통해 각 키-값 쌍을 ForEach-Object보냅니다.

$hash.GetEnumerator() | ForEach-Object {
    "The value of '$($_.Key)' is: $($_.Value)"
}

이 예제에서는 GetEnumerator()ForEach() 메서드를 사용하여 각 키-값 쌍을 반복합니다.

$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})

키 및 값 추가 및 제거

일반적으로 만들 hashtable 때 정의에 키-값 쌍을 포함합니다. 그러나 언제든지 키-값 쌍을 hashtable 추가하고 제거할 수 있습니다. 다음 예제에서는 빈 hashtable을 만듭니다.

$hash = @{}

배열 표기법을 사용하여 키-값 쌍을 추가할 수 있습니다. 예를 들어 다음 예제에서는 값 Now hashtable이 있는 Time 키를 추가합니다.

$hash["Time"] = "Now"

개체의 System.Collections.Hashtable 메서드를 hashtable 사용하여 Add() 키와 값을 추가할 수도 있습니다. 메서드 Add() 의 구문은 다음과 같습니다.

Add(Key, Value)

예를 들어 값 Now hashtable이 있는 Time 키를 추가하려면 다음 문 형식을 사용합니다.

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

또한 추가 연산자(+)를 사용하여 키와 값을 hashtable 추가하여 기존hashtable에 추가할 hashtable 수 있습니다. 예를 들어 다음 문은 변수의 Now hashtable $hash 값이 있는 키를 추가합니다.Time

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

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

$t = "Today"
$now = (Get-Date)

$hash.Add($t, $now)

빼기 연산자를 사용하여 해시 테이블에서 키-값 쌍을 제거할 수는 없지만 개체의 hashtable 메서드를 Remove() 사용할 수 있습니다. 메서드 Remove 의 구문은 다음과 같습니다.

$object.Remove(<key>)

다음 예제에서는 키-값 쌍을 Time 제거 $hash합니다.

$hash.Remove("Time")

HashTables의 개체 형식

하나의 hashtable 키와 값은 모든 .NET 개체 형식을 가질 수 있으며 단일 hashtable 키와 여러 형식의 값을 가질 수 있습니다.

다음 문은 프로세스 이름 문자열 및 프로세스 개체 값을 만들어 hashtable 변수에 $p 저장합니다.

$p = @{
    "PowerShell" = (Get-Process PowerShell)
    "Notepad" = (Get-Process notepad)
}

입력을 hashtable $p 표시하고 키 이름 속성을 사용하여 값을 표시할 수 있습니다.

PS> $p

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

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

PS> $p.keys | ForEach-Object {$p.$_.handles}
441
251

의 hashtable 키는 모든 .NET 형식일 수 있습니다. 다음 문은 변수의 키-값 쌍을 hashtable $p 추가합니다. 키는 WinRM 서비스를 나타내는 서비스 개체이며 값은 서비스의 현재 상태입니다.

$p = $p + @{
    (Get-Service WinRM) = ((Get-Service WinRM).Status)
}

의 다른 쌍에 사용하는 것과 동일한 메서드를 사용하여 새 키-값 쌍을 표시하고 액세스할 수 있습니다 hashtable.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (powershell)
Notepad                        System.Diagnostics.Process (Notepad)
WinRM                          Running

PS> $p.keys
PowerShell
Notepad

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

PS> $p.keys | ForEach-Object {$_.name}
WinRM

또한 개체의 키와 값이 hashtable 될 Hashtable 수 있습니다. 다음 문은 키가 문자열인 Hash2인 변수에 키-값 쌍 hashtable $p 을 추가하고 값은 hashtable 세 개의 키-값 쌍을 사용합니다.

$p = $p + @{
    "Hash2"= @{a=1; b=2; c=3}
}

동일한 메서드를 사용하여 새 값을 표시하고 액세스할 수 있습니다.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (powershell)
Notepad                        System.Diagnostics.Process (Notepad)
WinRM                          Running
Hash2                          {c, b, a}

PS> $p.Hash2

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

PS> $p.Hash2.b
2

키 및 값 정렬

내 hashtable 의 항목은 본질적으로 순서가 지정되지 않습니다. 키-값 쌍은 표시할 때마다 다른 순서로 나타날 수 있습니다.

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

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

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

Name                           Value
----                           -----
Hash2                          {c, b, a}
Notepad                        System.Diagnostics.Process (Notepad)
PowerShell                     System.Diagnostics.Process (powershell)
WinRM                          Running

다음 명령은 동일한 절차를 사용하여 해시 값을 내림차순으로 정렬합니다.

PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (powershell)
Notepad                        System.Diagnostics.Process (Notepad)
Hash2                          {c, b, a}
WinRM                          Running

해시 테이블의 개체 만들기

PowerShell 3.0부터 속성 및 속성 값에서 개체를 hashtable 만들 수 있습니다.

구문은 다음과 같습니다.

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

이 메서드는 매개 변수가 없는 생성자가 있는 클래스에 대해서만 작동합니다. 개체 속성은 public 및 settable이어야 합니다.

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

ConvertFrom-StringData

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

이 문자열은 포함 따옴표의 값이 hashtable 있을 때 특히 유용합니다. 여기 문자열에 대한 자세한 내용은 about_Quoting_Rules 참조하세요.

다음 예제에서는 이전 예제에서 사용자 메시지의 여기 문자열을 만드는 방법과 문자열에서 문자열로 hashtable변환하는 데 사용하는 ConvertFrom-StringData 방법을 보여줍니다.

다음 명령은 키-값 쌍의 여기 문자열을 만든 다음 변수에 $string 저장합니다.

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

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

ConvertFrom-StringData $string

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

여기 문자열에 대한 자세한 내용은 about_Quoting_Rules 참조하세요.

참고 항목