about_Hash_Tables

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0

トピック

about_Hash_Tables

概要

Windows PowerShell® のハッシュ テーブルの作成、使用、並べ替え方法について説明します。

詳細説明

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

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

Windows PowerShell 3.0 以降では、[ordered] 属性を使用して、Windows PowerShell に順序付けされたディクショナリ (System.Collections.Specialized.OrderedDictionary) を作成できます。

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

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

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

構文

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

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

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

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

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

ハッシュ テーブルの作成

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

- アット マーク (@) でハッシュ テーブルを開始します。

- ハッシュ テーブルを中かっこ ({}) で囲みます。

- ハッシュ テーブルの内容として 1 つまたは複数のキーと値のペアを入力します。

- 等号 (=) を使用して、各キーと値を区別します。

- セミコロン (;) または改行を使用して、キーと値のペアを区切ります。

- スペースが含まれているキーは、引用符で囲む必要があります。値は、有効な Windows PowerShell 式である必要があります。文字列は、スペースが含まれていない場合でも、引用符で囲む必要があります。

- ハッシュ テーブルを管理するには、変数に保存します。

- 変数に順序付けされたハッシュ テーブルを代入する場合は、"@" 記号の前に [ordered] 属性を配置します。変数名の前に配置すると、コマンドが失敗します。

$hash の値で空のハッシュ テーブルを作成するには、次のように入力します。

          $hash = @{}

ハッシュ テーブルを作成するときに、キーと値を追加することもできます。たとえば、次のステートメントはキーが 3 つあるハッシュ テーブルを作成します。

          $hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

順序付けられたディクショナリの作成

OrderedDictiory 型のオブジェクトを追加して、順序付けられたディクショナリを作成できますが、順序付けられたディクショナリを作成する最も簡単な方法は、[Ordered] 属性を使用することです。

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

この属性は、"@" 記号の直前に配置します。

          $hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

ハッシュ テーブルを使用する場合と同じ方法で、順序付けられたディクショナリを使用できます。いずれか一方の型を、ハッシュ テーブルまたはディクショナリ (iDictionary) を取得するパラメーターの値として使用できます。

[ordered] 属性を使用して、ハッシュ テーブルを変換またはキャストすることはできません。変数名の前に順序付けられた属性を配置すると、コマンドは次のようなエラー メッセージで失敗します。

        PS C:\> [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
    To correct the expression, move the [ordered] attribute.     
        PS C:\> $hash = [ordered]@{}

順序付けられたディクショナリをハッシュ テーブルにキャストできますが、変数をクリアして新しい値を入力しても、順序付けされた属性を回復することはできません。順序を再確立するには、変数を削除してから再作成します。

        PS C:\> [hashtable]$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
        PS C:\ps-test> $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

ハッシュ テーブルには、ハッシュ テーブル内のキーと値のペアの数を示す Count プロパティがあります。

          C:\PS> $hash.count
          3

ハッシュ テーブルは配列ではないため、インデックスとして整数を使用することはできませんが、キー名を使用してハッシュ テーブルにインデックスを付けることができます。キーが文字列値の場合は、キー名を引用符で囲みます。

たとえば、次のように入力します。

          C:\PS> $hash["Number"]
          1

キーと値の追加と削除

キーと値をハッシュ テーブルに追加するには、次のコマンド形式を使用します。

          $hash["<key>"] = "<value>"

たとえば、キーを "Time"、値を "Now" としてハッシュ テーブルに追加するには、次のステートメント形式を使用します。

          $hash["Time"] = "Now"

System.Collections.Hashtable オブジェクトの Add メソッドを使用して、ハッシュ テーブルにキーと値を追加することもできます。Add メソッドの構文は次のとおりです。

          Add(Key, Value)

たとえば、キーを "Time"、値を "Now" としてハッシュ テーブルに追加するには、次のステートメント形式を使用します。

          $hash = $hash.Add("Time", "Now")

また、加算演算子 (+) を使用して既存のハッシュ テーブルにハッシュ テーブルを追加して、ハッシュ テーブルにキーと値を追加できます。たとえば、次のステートメントは $hash 変数のハッシュ テーブルにキー "Time"、値 "Now" を追加します。

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

Windows PowerShell では、Contains、Clear、Clone、CopyTo など、Hashtable オブジェクトのすべてのプロパティとメソッドを使用できます。Hashtable オブジェクトの詳細については、MSDN の「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 オブジェクトにすることもできます。次のステートメントは、キーが文字列 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

ハッシュ テーブルからのオブジェクトの作成

Windows PowerShell 3.0 以降では、プロパティとプロパティ値のハッシュ テーブルからオブジェクトを作成できます。

構文は次のとおりです。

        [<class-name>]@{<property-name>=<property-value>;<property-name>=<property-value>}

このメソッドは、null コンストラクター (パラメーターを持たないコンストラクター) があるクラスに対してのみ機能します。オブジェクト プロパティは、パブリックかつ設定可能である必要があります。

詳細については、「about_Object_Creation」を参照してください。

ConvertFrom-StringData

ConvertFrom-StringData コマンドレットは、キーと値のペアの文字列またはヒア文字列をハッシュ テーブルに変換します。ConvertFrom-StringData コマンドレットはスクリプトの Data セクションで安全に使用できます。また、Import-LocalizedData コマンドレットと共に使用して、現在のユーザーのユーザー インターフェイス (UI) カルチャにユーザー メッセージを表示できます。

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

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

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

          C:\PS> $string = @"
          Msg1 = Type "Windows".
          Msg2 = She said, "Hello, World."
          Msg3 = Enter an alias (or "nickname").
          "@

このコマンドは、ConvertFrom-StringData コマンドレットを使用して、ヒア文字列をハッシュ テーブルに変換します。

        C:\PS> ConvertFrom-StringData $string

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

ヒア文字列の詳細については、「about_Quoting_Rules」を参照してください。

関連項目

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

MSDN の「System.Collections.Hashtable」