about_Hash_Tables

概要

PowerShell でハッシュテーブルを作成、使用、および並べ替える方法について説明します。

詳細説明

ハッシュテーブルは、ディクショナリまたは連想配列とも呼ばれ、1つまたは複数のキーと値のペアを格納するコンパクトなデータ構造です。 たとえば、ハッシュテーブルには、一連の IP アドレスとコンピューター名が含まれている場合があります。 IP アドレスはキー、コンピューター名は値、またはその逆です。

PowerShell では、各ハッシュテーブルは Hashtable (system.string) オブジェクトです。 PowerShell では、Hashtable オブジェクトのプロパティとメソッドを使用できます。

PowerShell 3.0 以降では、PowerShell で [ordered] 属性を使用して、順序付けされた辞書 (OrderedDictionary) を作成できます。

順序付けされたディクショナリはハッシュテーブルとは異なり、キーは常に一覧表示される順序で表示されます。 ハッシュテーブル内のキーの順序は決定されません。

ハッシュテーブルのキーと値は、.NET オブジェクトでもあります。 多くの場合、文字列または整数ですが、任意のオブジェクト型を持つことができます。 また、入れ子になったハッシュテーブルを作成することもできます。この場合、キーの値は別のハッシュテーブルになります。

ハッシュテーブルは、データの検索と取得に非常に効率的であるため、頻繁に使用されます。 ハッシュテーブルを使用して、一覧を格納したり、PowerShell で計算されたプロパティを作成したりできます。 また、PowerShell には、文字列をハッシュテーブルに変換する Convertfrom-csv Convertfrom-stringdata というコマンドレットが用意されています。

Syntax

ハッシュテーブルの構文は次のとおりです。

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

順序付けられたディクショナリの構文は次のとおりです。

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

PowerShell 3.0 では、[ordered] 属性が導入されました。

ハッシュテーブルの作成

ハッシュ テーブルを作成するには、次のガイドラインに従います。

  • アット 記号 (@) でハッシュ テーブルを開始します。
  • ハッシュ テーブルを中かっこ () で囲む {} 。
  • ハッシュ テーブルの内容に対して 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] 属性を使用してハッシュテーブルを変換またはキャストすることはできません。 順序付けされた属性を変数名の前に配置すると、コマンドは失敗し、次のエラーメッセージが表示されます。

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

ハッシュテーブルには、キーと値のプロパティがあります。 すべてのキーまたはすべての値を表示するには、ドット表記を使用します。

C:\PS> $hash.keys
Number
Shape
Color

C:\PS> $hash.values
1
Square
Blue

また、各キー名はハッシュテーブルのプロパティであり、その値はキー名プロパティの値です。 プロパティ値を表示するには、次の形式を使用します。

$hashtable.<key>
<value>

以下に例を示します。

C:\PS> $hash.Number
1

C:\PS> $hash.Color
Blue

キー名がハッシュテーブルの型のいずれかのプロパティ名と競合する場合は、を使用して PSBase これらのプロパティにアクセスできます。 たとえば、キー名がで、キーのコレクションを取得する場合は、次の 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)

たとえば、time=Now キーと値のペアをハッシュ テーブルから削除するには、$hashします。

$hash.Remove("Time")

Contains、Clear、Clone、CopyTo など、PowerShell で Hashtable オブジェクトのすべてのプロパティとメソッドを使用できます。 ハッシュテーブル オブジェクトの詳細については 、「System.Collections.Hashtable 」を参照してください

HashTable のオブジェクト型

ハッシュ テーブル内のキーと値は任意の .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 オブジェクトにすることもできます。 次のステートメントでは、キーが文字列である変数のハッシュテーブルにキーと値のペアを追加し、 $p 値は、3つのキーと値のペアを持つハッシュテーブルに Hash2 ます。

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) カルチャにユーザーメッセージを表示することもできます。

ここでは、ハッシュテーブルの値に引用符が含まれている場合に特に便利です。 ここで説明する文字列の詳細については、「 about_Quoting_Rules」を参照してください。

次の例は、前の例のユーザー メッセージの here 文字列を作成する方法と、 を使用して文字列からハッシュ テーブルに変換する方法 ConvertFrom-StringData を示しています。

次のコマンドは、キーと値のペアの here 文字列を作成し、それを文字列変数に $ 保存します。

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。

関連項目

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

System.Collections.Hashtable