about_Hash_Tables
簡単な説明
PowerShell でハッシュテーブルを作成、使用、並べ替える方法について説明します。
詳細な説明
ハッシュテーブル (ディクショナリ配列または連想配列とも呼ばれます) は、1 つ以上のキーと値のペアを格納するコンパクトなデータ構造です。 たとえば、ハッシュ テーブルには一連の IP アドレスとコンピューター名が含まれている場合があります。ここで、IP アドレスはキー、コンピューター名は値、またはその逆です。
PowerShell では、各ハッシュテーブルは Hashtable[System.Collections.Hashtable]
オブジェクトです。 PowerShell では、 Hashtable オブジェクトのプロパティとメソッドを使用できます。
PowerShell 3.0 以降では、 [ordered]
属性を使用して PowerShell で [System.Collections.Specialized.OrderedDictionary]
オブジェクトを作成できます。
順序付けされたディクショナリは、キーが常に一覧表示される順序で表示されるという点でハッシュテーブルとは異なります。 ハッシュテーブル内のキーの順序は決定されません。
ハッシュテーブルのキーと値も .NET オブジェクトです。 ほとんどの場合、文字列または整数ですが、任意のオブジェクト型を持つことができます。 キーの値が別のハッシュテーブルである入れ子になったハッシュテーブルを作成することもできます。
Hashtableは、データの検索と取得に効率的であるため、頻繁に使用されます。 ハッシュテーブルを使用すると、リストを格納したり、PowerShell で計算プロパティを作成したりできます。 また、PowerShell には、文字列をハッシュテーブルに変換するコマンドレット ( ConvertFrom-StringData
) があります。
構文
ハッシュテーブルの構文は次のとおりです。
@{ <name> = <value>; [<name> = <value> ] ...}
順序付けられたディクショナリの構文は次のとおりです。
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
[ordered]
型アクセラレータは、PowerShell 3.0 で導入されました。
ハッシュテーブルの作成
ハッシュテーブルを作成するには、次のガイドラインに従います。
- アット マーク (
@
) でハッシュテーブルを開始します。 - ハッシュテーブルを中かっこ (
{}
) で囲みます。 - ハッシュテーブルの内容に対して 1 つ以上のキーと値のペアを入力します。
- 等号 (
=
) を使用して、各キーをその値から分離します。 - セミコロン (
;
) または改行を使用して、キーと値のペアを区切ります。 - スペースを含むキーは引用符で囲む必要があります。 値は有効な PowerShell 式である必要があります。 文字列にはスペースが含まれていない場合でも、引用符で囲む必要があります。
- ハッシュテーブルを管理するには、変数に保存します。
- 順序付けられたハッシュテーブルを変数に割り当てるときは、
@
シンボルの前に[ordered]
型を配置します。 変数名の前に配置すると、コマンドは失敗します。
$hashの値に空のハッシュテーブルを作成するには、次のように入力します。
$hash = @{}
キーと値は、作成時にハッシュテーブルに追加することもできます。 たとえば、次のステートメントは、3 つのキーを持つハッシュテーブルを作成します。
$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 = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ ~~~~~~~~~~~~~~
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
式を修正するには、[ordered] 属性を移動します。
$hash = [ordered]@{}
順序付けされたディクショナリをハッシュテーブルにキャストすることはできますが、変数をクリアして新しい値を入力した場合でも、順序付けされた属性を回復することはできません。 順序を再確立するには、変数を削除して再作成する必要があります。
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
ハッシュテーブルの表示
変数に保存されているハッシュテーブルを表示するには、変数名を入力します。 既定では、ハッシュテーブルは、キー用に 1 列、値用に 1 列のテーブルとして表示されます。
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
ハッシュテーブルには、 Keys および Values プロパティがあります。 ドット表記を使用して、すべてのキーまたはすべての値を表示します。
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
各キー名はハッシュテーブルのプロパティでもあり、その値はキー名プロパティの値です。 プロパティ値を表示するには、次の形式を使用します。
$hashtable.<key>
<value>
次に例を示します。
$hash.Number
1
$hash.Color
Blue
ハッシュテーブルには、ハッシュテーブル内のキーと値のペアの数を示す Count プロパティがあります。
$hash.count
3
ハッシュテーブルは配列ではありません。そのため、整数をハッシュテーブルのインデックスとして使用することはできませんが、キー名を使用してハッシュテーブルにインデックスを付けることができます。 キーが文字列値の場合は、キー名を引用符で囲みます。
次に例を示します。
$hash["Number"]
1
プロパティ名の競合の処理
キー名が HashTable 型のいずれかのプロパティ名と競合する場合は、 psbase intrinsic メンバー を使用してこれらのプロパティにアクセスできます。 たとえば、キー名が keys
で、 HashTable キーのコレクションを返す場合は、次の構文を使用します。
$hashtable.psbase.Keys
これは、OrderedDictionaryなど、System.Collections.IDictionary インターフェイスを実装する他の型に適用されます。
キーと値の反復処理
ハッシュテーブル内のキーを反復処理して、いくつかの方法で値を処理できます。 このセクションの各例の出力は同じです。 ここで定義されている $hash
変数を反復処理します。
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Note
これらの例では、 $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")
また、加算演算子 (+
) を使用して、キーと値をハッシュテーブルに追加して、既存のハッシュテーブルにハッシュテーブルを追加できます。 たとえば、次のステートメントでは、$hash
変数のハッシュテーブルにNow
値を持つTime
キーを追加します。
$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")
PowerShell では、Contains
、Clear
、Clone
、CopyTo
など、Hashtable オブジェクトのすべてのプロパティとメソッドを使用できます。 Hashtable オブジェクトの詳細については、「System.Collections.Hashtable」を参照してください。
HashTable のオブジェクト型
ハッシュテーブル内のキーと値には任意の .NET オブジェクト型を指定でき、1 つのハッシュテーブルには複数の型のキーと値を含めることができます。
次のステートメントは、プロセス名文字列とプロセス オブジェクト値のハッシュテーブルを作成し、 $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 サービスを表す Service オブジェクトであり、値はサービスの現在の状態です。
$p = $p + @{
(Get-Service WinRM) = ((Get-Service WinRM).Status)
}
ハッシュテーブル内の他のペアに使用するのと同じメソッドを使用して、新しいキーと値のペアを表示およびアクセスできます。
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 することもできます。 次のステートメントでは、キーが文字列 Hash2 である $p
変数のハッシュテーブルにキーと値のペアが追加され、値は 3 つのキーと値のペアを持つハッシュテーブルになります。
$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
キーと値の並べ替え
ハッシュテーブル内の項目は、本質的に順序付けされません。 キーと値のペアは、表示するたびに異なる順序で表示される場合があります。
ハッシュテーブルを並べ替えることはできませんが、ハッシュテーブルの GetEnumerator メソッドを使用してキーと値を列挙し、 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 以降では、プロパティとプロパティ値のハッシュテーブルからオブジェクトを作成できます。
構文は次のとおりです。
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
このメソッドは、パラメーターのないコンストラクターを持つクラスに対してのみ機能します。 オブジェクトのプロパティは、パブリックで設定可能である必要があります。
詳細については、「 about_Object_Creation」を参照してください。
ConvertFrom-StringData
ConvertFrom-StringData
コマンドレットは、キーと値のペアの文字列またはここの文字列をハッシュテーブルに変換します。 スクリプトの [データ] セクションで ConvertFrom-StringData
コマンドレットを安全に使用できます。また、 Import-LocalizedData
コマンドレットと共に使用して、現在のユーザーのユーザー インターフェイス (UI) カルチャにユーザー メッセージを表示できます。
この文字列は、ハッシュテーブル内の値に引用符が含まれている場合に特に便利です。 here-strings の詳細については、 about_Quoting_Rulesを参照してください。
次の例は、前の例でユーザー メッセージの文字列を作成する方法と、 ConvertFrom-StringData
を使用して文字列からハッシュテーブルに変換する方法を示しています。
次のコマンドは、キーと値のペアの here 文字列を作成し、 $string
変数に保存します。
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
このコマンドでは、 ConvertFrom-StringData
コマンドレットを使用して、この文字列をハッシュテーブルに変換します。
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
here-strings の詳細については、 about_Quoting_Rulesを参照してください。
関連項目
PowerShell