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 = @{}
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

ハッシュテーブルの表示

変数に保存されているハッシュテーブルを表示するには、変数名を入力します。 既定では、ハッシュテーブルは、キー用に 1 列、値用に 1 列のテーブルとして表示されます。

$hash
Name                           Value
----                           -----
Shape                          Square
Color                          Blue
Number                         1

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

$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組み込みメンバーを使用してそれらのプロパティにアクセスできます。 たとえば、キー名が HashTable キーのコレクションを返す場合はkeys、次の構文を使用します。

$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"

オブジェクトのメソッドを使用して、ハッシュテーブルにキーと値をAddSystem.Collections.Hashtable追加することもできます。 この 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)

減算演算子を使用してハッシュ テーブルからキーと値のペアを削除することはできませんが、オブジェクトの Remove メソッドを Hashtable 使用できます。 Remove メソッドは、キーを値として受け取ります。

この Remove メソッドの構文は次のとおりです。

Remove(Key)

たとえば、変数の値の Time=Now ハッシュテーブルからキーと値のペアを削除するには、次のように $hash 入力します。

$hash.Remove("Time")

PowerShell のオブジェクトのすべてのプロパティとメソッドHashtableを使用できます。これにはContains、、、Clear、、 CloneCopyTo オブジェクトの 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)
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 ハッシュテーブルにキーと値のペアが追加され、値は 3 つのキーと値のペアを持つハッシュテーブルになります。

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

同じメソッドを使用して、新しい値を表示およびアクセスできます。

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Hash2                          {[b, 2], [c, 3], [a, 1]}
WinRM                          Running
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.Hash2

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

PS> $p.Hash2.b
2

キーと値の並べ替え

ハッシュテーブル内の項目は、本質的に順序付けされません。 キーと値のペアは、表示するたびに異なる順序で表示される場合があります。

ハッシュテーブルを並べ替えることはできませんが、ハッシュテーブルの GetEnumerator メソッドを使用してキーと値を列挙し、コマンドレットを Sort-Object 使用して表示用の列挙値を並べ替えることができます。

たとえば、次のコマンドは、変数のハッシュ テーブル内のキーと値を $p 列挙し、キーをアルファベット順に並べ替えます。

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

Name                           Value
----                           -----
Hash2                          {[b, 2], [c, 3], [a, 1]}
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                          {[b, 2], [c, 3], [a, 1]}
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 使用して、here-string をハッシュテーブルに変換します。

ConvertFrom-StringData $string

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

here-strings の詳細については、about_Quoting_Rulesを参照してください

関連項目