ハッシュ テーブルについて
概要
PowerShell でハッシュ テーブルを作成、使用、並べ替える方法について説明します。
詳細説明
ハッシュ テーブル (ディクショナリまたは連想配列とも呼ばれます) は、1 つ以上のキーと値のペアを格納するコンパクトなデータ構造です。 たとえば、ハッシュ テーブルには一連の IP アドレスとコンピューター名が含まれている場合があります。ここで、IP アドレスはキー、コンピューター名は値、またはその逆です。
PowerShell では、各ハッシュ テーブルは Hashtable (System.Collections.Hashtable) オブジェクトです。 PowerShell では、Hashtable オブジェクトのプロパティとメソッドを使用できます。
PowerShell 3.0 以降では、[ordered] 属性を使用して、PowerShell で順序付きディクショナリ (System.Collections.Specialized.OrderedDictionary) を作成できます。
順序付けられたディクショナリは、キーが常に一覧表示される順序で表示されるという点で、ハッシュ テーブルとは異なります。 ハッシュ テーブル内のキーの順序は決定されません。
ハッシュ テーブルのキーと値も .NET オブジェクトです。 ほとんどの場合、文字列または整数ですが、任意のオブジェクト型を持つことができます。 キーの値が別のハッシュ テーブルである入れ子になったハッシュ テーブルを作成することもできます。
ハッシュ テーブルは、データの検索と取得に非常に効率的であるため、頻繁に使用されます。 ハッシュ テーブルを使用すると、リストを格納したり、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 属性を配置すると、コマンドは失敗し、次のエラー メッセージが表示されます。
PS C:\> [ordered]$hash = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ [!INCLUDE[]()]
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordExc
eption
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
式を修正するには、[ordered] 属性を移動します。
PS C:\> $hash = [ordered]@{}
順序付けられたディクショナリをハッシュ テーブルにキャストすることはできますが、変数をクリアして新しい値を入力した場合でも、順序付けされた属性を回復することはできません。 順序を再確立するには、変数を削除して再作成する必要があります。
PS C:\> [hashtable]$hash = [ordered]@{
>> Number = 1; Shape = "Square"; Color = "Blue"}
PS C:\> $hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
ハッシュ テーブルの表示
変数に保存されているハッシュ テーブルを表示するには、変数名を入力します。 既定では、ハッシュ テーブルはテーブルとして表示され、キーには 1 列、値には 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
キー名が HashTable 型のいずれかのプロパティ名と競合する場合は、 を使用 PSBase
してこれらのプロパティにアクセスできます。 たとえば、キー名が で、Keys のコレクションを返す場合は keys
、次の構文を使用します。
$hashtable.PSBase.Keys
ハッシュ テーブルには、ハッシュ テーブル内のキーと値のペアの数を示す Count プロパティがあります。
C:\PS> $hash.count
3
ハッシュ テーブル テーブルは配列ではありません。そのため、ハッシュ テーブルのインデックスとして整数を使用することはできませんが、キー名を使用してハッシュ テーブルにインデックスを付けることができます。 キーが文字列値の場合は、キー名を引用符で囲みます。
例:
C:\PS> $hash["Number"]
1
キーと値の追加と削除
ハッシュ テーブルにキーと値を追加するには、次のコマンド形式を使用します。
$hash["<key>"] = "<value>"
たとえば、ハッシュ テーブルに値が "Now" の "Time" キーを追加するには、次のステートメント形式を使用します。
$hash["Time"] = "Now"
System.Collections.Hashtable オブジェクトの Add メソッドを使用して、ハッシュ テーブルにキーと値を追加することもできます。 Add メソッドの構文は次のとおりです。
Add(Key, Value)
たとえば、ハッシュ テーブルに値が "Now" の "Time" キーを追加するには、次のステートメント形式を使用します。
$hash.Add("Time", "Now")
また、加算演算子 (+) を使用して既存のハッシュ テーブルにハッシュ テーブルを追加することで、キーと値をハッシュ テーブルに追加できます。 たとえば、次のステートメントは、値が "Now" の "Time" キーを、$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")
PowerShell では、Contains、Clear、Clone、CopyTo など、Hashtable オブジェクトのすべてのプロパティとメソッドを使用できます。 Hashtable オブジェクトの詳細については、MSDN の「System.Collections.Hashtable」を参照してください。
HashTables のオブジェクト型
ハッシュ テーブルのキーと値には任意の .NET オブジェクト型を指定でき、1 つのハッシュ テーブルには複数の型のキーと値を含めることができます。
次のステートメントは、プロセス名文字列とプロセス オブジェクト値のハッシュ テーブルを作成し、$p変数に保存します。
$p = @{"PowerShell" = (get-process PowerShell);
"Notepad" = (get-process notepad)}
$pでハッシュ テーブルを表示し、キー名プロパティを使用して値を表示できます。
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 オブジェクトにすることもできます。 次のステートメントは、キーが文字列 Hash2 で、値が 3 つのキー/値ペアを持つハッシュ テーブルである$p変数のハッシュ テーブルにキーと値のペアを追加します。
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 コマンドレットを使用して、表示する列挙値を並べ替えることができます。
たとえば、次のコマンドは、$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
ハッシュ テーブルからのオブジェクトの作成
PowerShell 3.0 以降では、プロパティとプロパティ値のハッシュ テーブルからオブジェクトを作成できます。
構文は次のとおりです。
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
このメソッドは、null コンストラクターを持つクラス、つまりパラメーターを持たないコンストラクターに対してのみ機能します。 オブジェクトのプロパティは、パブリックおよび設定可能である必要があります。
詳細については、「 about_Object_Creation」を参照してください。
ConvertFrom-StringData
コマンドレットは ConvertFrom-StringData
、キーと値のペアの文字列またはここの文字列をハッシュ テーブルに変換します。 スクリプトの ConvertFrom-StringData
[データ] セクションでコマンドレットを安全に使用でき、コマンドレットと共 Import-LocalizedData
に使用して、現在のユーザーのユーザー インターフェイス (UI) カルチャにユーザー メッセージを表示できます。
この文字列は、ハッシュ テーブルの値に引用符が含まれている場合に特に便利です。 here-strings の詳細については、「 about_Quoting_Rules」を参照してください。
次の例では、前の例でユーザー メッセージの here-string を作成する方法と、 を使用 ConvertFrom-StringData
して文字列からハッシュ テーブルに変換する方法を示します。
次のコマンドは、キーと値のペアの here-string を作成し、それを$string変数に保存します。
C:\PS> $string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
このコマンドでは、ConvertFrom-StringData コマンドレットを使用して、here-string をハッシュ テーブルに変換します。
C:\PS> ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
here-strings の詳細については、「 about_Quoting_Rules」を参照してください。