about_Hash_Tables
간단한 설명
PowerShell에서 해시 테이블을 만들고, 사용하고, 정렬하는 방법을 설명합니다.
자세한 설명
사전 또는 결합형 배열이라고도 하는 해시 테이블은 하나 이상의 키-값 쌍을 저장하는 압축 데이터 구조입니다. 예를 들어 해시 테이블에는 일련의 IP 주소와 컴퓨터 이름이 포함될 수 있습니다. 여기서 IP 주소는 키이고 컴퓨터 이름은 값이거나 그 반대의 경우도 마찬가지입니다.
PowerShell에서 각 해시 테이블은 개체입니다 Hashtable[System.Collections.Hashtable]
. PowerShell에서 개체의 Hashtable 속성과 메서드를 사용할 수 있습니다.
PowerShell 3.0부터 이 특성을 사용하여 [ordered]
PowerShell에서 개체를 [System.Collections.Specialized.OrderedDictionary]
만들 수 있습니다.
순서가 지정된 사전은 키가 항상 나열되는 순서대로 표시된다는 점에서 해시 테이블과 다릅니다. 해시 테이블의 키 순서는 결정되지 않습니다.
해시 테이블의 키와 값도 .NET 개체입니다. 가장 자주 문자열 또는 정수이지만 모든 개체 형식을 가질 수 있습니다. 키 값이 다른 해시 테이블인 중첩된 해시 테이블을 만들 수도 있습니다.
Hashtable는 데이터를 찾고 검색하는 데 효율적이기 때문에 자주 사용됩니다. 해시 테이블을 사용하여 목록을 저장하고 PowerShell에서 계산된 속성을 만들 수 있습니다. 또한 PowerShell에는 문자열을 해시 테이블로 변환하는 cmdlet ConvertFrom-StringData
이 있습니다.
구문
해시 테이블의 구문은 다음과 같습니다.
@{ <name> = <value>; [<name> = <value> ] ...}
정렬된 사전의 구문은 다음과 같습니다.
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
[ordered]
형식 가속기는 PowerShell 3.0에서 도입되었습니다.
해시 테이블 만들기
해시 테이블을 만들려면 다음 지침을 따릅니다.
- at 기호(
@
)로 해시 테이블을 시작합니다. - 해시 테이블을 중괄호(
{}
)로 묶습니다. - 해시 테이블의 콘텐츠에 대해 하나 이상의 키-값 쌍을 입력합니다.
- 등호(
=
)를 사용하여 각 키를 해당 값과 구분합니다. - 세미콜론(
;
) 또는 줄 바꿈을 사용하여 키-값 쌍을 구분합니다. - 공백을 포함하는 키는 따옴표로 묶어야 합니다. 값은 유효한 PowerShell 식이어야 합니다. 문자열은 공백을 포함하지 않더라도 따옴표로 표시되어야 합니다.
- 해시 테이블을 관리하려면 변수에 저장합니다.
- 순서가 지정된 해시 테이블을 변수에 할당할 때 형식을
[ordered]
기호 앞에 놓습니다@
. 변수 이름 앞에 배치하면 명령이 실패합니다.
$hash 값에 빈 해시 테이블을 만들려면 다음을 입력합니다.
$hash = @{}
만들 때 해시 테이블의 키와 값을 추가할 수도 있습니다. 예를 들어 다음 문은 세 개의 키를 사용하여 해시 테이블을 만듭니다.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
정렬된 사전 만들기
형식의 OrderedDictionary 개체를 추가하여 정렬된 사전을 만들 수 있지만 정렬된 사전을 만드는 가장 쉬운 방법은 특성을 사용하는 [ordered]
것입니다.
이 [ordered]
특성은 PowerShell 3.0에서 도입되었습니다.
"@" 기호 바로 앞에 특성을 배치합니다.
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
해시 테이블을 사용하는 것과 동일한 방식으로 정렬된 사전을 사용할 수 있습니다. 두 형식 중 하나를 해시 테이블 또는 사전(iDictionary)을 사용하는 매개 변수 값으로 사용할 수 있습니다.
해시 테이블을 변환하거나 캐스팅하는 데는 특성을 사용할 [ordered]
수 없습니다. 순서가 지정된 특성을 변수 이름 앞에 배치하면 다음 오류 메시지와 함께 명령이 실패합니다.
[ordered]$hash = @{}
ParserError:
Line |
1 | [ordered]$hash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
식을 수정하려면 [ordered] 특성을 이동합니다.
$hash = [ordered]@{}
순서가 지정된 사전을 해시 테이블로 캐스팅할 수 있지만 변수를 지우고 새 값을 입력하더라도 순서가 지정된 특성을 복구할 수 없습니다. 순서를 다시 설정하려면 변수를 제거하고 다시 만들어야 합니다.
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
해시 테이블 표시
변수에 저장된 해시 테이블을 표시하려면 변수 이름을 입력합니다. 기본적으로 해시 테이블은 키에 대해 하나의 열과 값에 대한 열이 있는 테이블로 표시됩니다.
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
hashtables에는 키 및 값 속성이 있습니다. 점 표기법을 사용하여 모든 키 또는 모든 값을 표시합니다.
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
각 키 이름은 해시 테이블의 속성이기도 하며 해당 값은 키 이름 속성의 값입니다. 다음 형식을 사용하여 속성 값을 표시합니다.
$hashtable.<key>
<value>
예시:
$hash.Number
1
$hash.Color
Blue
hashtables에는 해시 테이블의 키-값 쌍 수를 나타내는 Count 속성이 있습니다.
$hash.count
3
해시 테이블은 배열이 아니므로 정수는 해시 테이블에 대한 인덱스로 사용할 수 없지만 키 이름을 사용하여 해시 테이블에 인덱싱할 수 있습니다. 키가 문자열 값인 경우 키 이름을 따옴표로 묶습니다.
예시:
$hash["Number"]
1
속성 이름 충돌 처리
키 이름이 HashTable 형식의 속성 이름 중 하나와 충돌하는 경우 psbase 내장 멤버를 사용하여 해당 속성에 액세스할 수 있습니다. 예를 들어 키 이름이 keys
고 HashTable 키의 컬렉션을 반환하려는 경우 다음 구문을 사용합니다.
$hashtable.psbase.Keys
인터페이스를 구현하는 다른 형식(예: OrderedDictionary.)에 System.Collections.IDictionary 적용됩니다.
키 및 값 반복
해시 테이블의 키를 반복하여 여러 가지 방법으로 값을 처리할 수 있습니다. 이 섹션의 각 예제에는 동일한 출력이 있습니다. 여기에 정의된 변수를 $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)"})
키 및 값 추가 및 제거
해시 테이블에 키와 값을 추가하려면 다음 명령 형식을 사용합니다.
$hash["<key>"] = "<value>"
예를 들어 해시 테이블의 값이 "Now"인 "Time" 키를 추가하려면 다음 문 형식을 사용합니다.
$hash["Time"] = "Now"
개체의 System.Collections.Hashtable 메서드를 사용하여 Add
해시 테이블의 키와 값을 추가할 수도 있습니다. 메서드 Add
의 구문은 다음과 같습니다.
Add(Key, Value)
예를 들어 해시 테이블 값 Now
이 있는 Time
키를 추가하려면 다음 문 형식을 사용합니다.
$hash.Add("Time", "Now")
또한 더하기 연산자(+
)를 사용하여 해시 테이블로 키와 값을 추가하여 기존 해시 테이블에 해시 테이블을 추가할 수 있습니다. 예를 들어 다음 문은 변수의 Now
해시 테이블 $hash
값이 있는 키를 추가 Time
합니다.
$hash = $hash + @{Time="Now"}
변수에 저장된 값을 추가할 수도 있습니다.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
빼기 연산자를 사용하여 해시 테이블에서 키-값 쌍을 제거할 수는 없지만 개체의 Hashtable Remove 메서드를 사용할 수 있습니다. Remove 메서드는 키를 해당 값으로 사용합니다.
메서드 Remove
의 구문은 다음과 같습니다.
Remove(Key)
예를 들어 변수 값의 Time=Now
해시 테이블에서 키-값 쌍을 제거하려면 다음을 $hash
입력합니다.
$hash.Remove("Time")
PowerShell에서 개체의 Hashtable 모든 속성과 메서드(예Contains
: , Clear
Clone
및 CopyTo
)를 사용할 수 있습니다. 개체에 대한 Hashtable 자세한 내용은 다음을 참조하세요 System.Collections.Hashtable.
HashTables의 개체 형식
해시 테이블의 키와 값은 모든 .NET 개체 형식을 가질 수 있으며, 단일 해시 테이블은 여러 형식의 키와 값을 가질 수 있습니다.
다음 문은 프로세스 이름 문자열의 해시 테이블을 만들고 개체 값을 처리하고 변수에 $p
저장합니다.
$p = @{
"PowerShell" = (Get-Process PowerShell)
"Notepad" = (Get-Process notepad)
}
해시 테이블을 $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
해시 테이블의 키는 모든 .NET 형식일 수 있습니다. 다음 문은 변수의 해시 파일에 키-값 쌍을 $p
추가합니다. 키는 WinRM 서비스를 나타내는 서비스 개체이며 값은 서비스의 현재 상태입니다.
$p = $p + @{
(Get-Service WinRM) = ((Get-Service WinRM).Status)
}
해시 테이블의 다른 쌍에 사용하는 것과 동일한 메서드를 사용하여 새 키-값 쌍을 표시하고 액세스할 수 있습니다.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
PS> $p.keys | ForEach-Object {$_.name}
WinRM
해시 테이블의 키와 값은 개체일 Hashtable 수도 있습니다. 다음 문은 키가 문자열인 Hash2이고 값이 세 개의 키-값 쌍이 있는 해시 테이블인 변수의 해시 파일에 $p
키-값 쌍을 추가합니다.
$p = $p + @{
"Hash2"= @{a=1; b=2; c=3}
}
동일한 메서드를 사용하여 새 값을 표시하고 액세스할 수 있습니다.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Hash2 {[a, 1], [b, 2], [c, 3]}
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
PS> $p.Hash2
Name Value
---- -----
a 1
b 2
c 3
PS> $p.Hash2.b
2
키 및 값 정렬
해시 테이블의 항목은 본질적으로 순서가 지정되지 않습니다. 키-값 쌍은 표시할 때마다 다른 순서로 나타날 수 있습니다.
해시 테이블을 정렬할 수는 없지만 해시 테이블의 GetEnumerator 메서드를 사용하여 키와 값을 열거한 다음 cmdlet을 사용하여 Sort-Object
열거된 값을 표시할 수 있습니다.
예를 들어 다음 명령은 변수의 해시 테이블에 $p
있는 키와 값을 열거한 다음, 키를 사전순으로 정렬합니다.
PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Hash2 {[a, 1], [b, 2], [c, 3]}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (pwsh)
WinRM Running
다음 명령은 동일한 절차를 사용하여 해시 값을 내림차순으로 정렬합니다.
PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {[a, 1], [b, 2], [c, 3]}
WinRM Running
해시 테이블의 개체 만들기
PowerShell 3.0부터 속성 및 속성 값의 해시 테이블로 개체를 만들 수 있습니다.
구문은 다음과 같습니다.
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
이 메서드는 매개 변수가 없는 생성자가 있는 클래스에 대해서만 작동합니다. 개체 속성은 public 및 settable이어야 합니다.
자세한 내용은 about_Object_Creation 참조하세요.
ConvertFrom-StringData
cmdlet은 ConvertFrom-StringData
문자열 또는 여기에 있는 키-값 쌍의 문자열을 해시 테이블로 변환합니다. 스크립트의 ConvertFrom-StringData
데이터 섹션에서 안전하게 cmdlet을 사용할 수 있으며 cmdlet과 함께 Import-LocalizedData
사용하여 현재 사용자의 UI(사용자 인터페이스) 문화권에 사용자 메시지를 표시할 수 있습니다.
이 문자열은 해시 테이블의 값에 따옴표가 포함될 때 특히 유용합니다. 여기 문자열에 대한 자세한 내용은 about_Quoting_Rules 참조하세요.
다음 예제에서는 이전 예제에서 사용자 메시지의 여기 문자열을 만드는 방법과 문자열에서 해시 테이블로 변환하는 데 사용하는 ConvertFrom-StringData
방법을 보여줍니다.
다음 명령은 키-값 쌍의 여기 문자열을 만든 다음 변수에 $string
저장합니다.
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
이 명령은 cmdlet을 ConvertFrom-StringData
사용하여 여기 문자열을 해시 테이블로 변환합니다.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
여기 문자열에 대한 자세한 내용은 about_Quoting_Rules 참조하세요.
참고 항목
PowerShell