about_Hash_Tables

Letzte Aktualisierung: Mai 2014

Betrifft: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

THEMA

about_Hash_Tables

KURZE BESCHREIBUNG

Beschreibt die Erstellung, Verwendung und Sortierung von Hashtabellen in Windows PowerShell®.

LANGE BESCHREIBUNG

Eine Hashtabelle, auch als Wörterbuch oder assoziatives Array bezeichnet, ist eine kompakte Datenstruktur, in der ein oder mehrere Schlüssel-/Wertpaare gespeichert werden. Beispielsweise kann eine Hashtabelle eine Reihe von IP-Adressen und Computernamen enthalten, wobei die IP-Adressen die Schlüssel und die Computernamen die Werte sind (oder auch umgekehrt).

In Windows PowerShell ist jede Hashtabelle ein Hashtable-Objekt (System.Collections.Hashtable). Die Eigenschaften und Methoden von Hashtable-Objekten können in Windows PowerShell verwendet werden.

Ab Windows PowerShell 3.0 können Sie das Attribut [ordered] in Windows PowerShell zur Erstellung eines sortierten Wörterbuchs (System.Collections.Specialized.OrderedDictionary) verwenden.

Sortierte Wörterbücher unterscheiden sich insofern von Hashtabellen, als dass die Schlüssel immer in der von Ihnen angegebenen Reihenfolge angezeigt werden. Die Reihenfolge der Schlüssel in einer Hashtabelle ist dagegen nicht festgelegt.

Die Schlüssel und Werte einer Hashtabelle sind gleichzeitig auch .NET-Objekte. Meist sind es Zeichenfolgen oder Ganzzahlen, sie sind aber auf keinen Objekttyp fixiert. Hashtabellen können auch verschachtelt sein, das heißt, der Wert eines Schlüssels kann wiederum eine Hashtabelle sein.

Hashtabellen werden häufig verwendet, da sie zum Suchen und Abrufen von Daten sehr effizient sind. In Windows PowerShell können Sie Hashtabellen zum Speichern von Listen und Erstellen berechneter Eigenschaften verwenden. Mit dem Cmdlet ConvertFrom-StringData können Sie Zeichenfolgen in Windows PowerShell in eine Hashtabelle konvertieren.

Syntax

Die Syntax einer Hashtabelle lautet wie folgt:

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

Die Syntax eines sortierten Wörterbuchs lautet wie folgt:

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

Das Attribut [ordered] wurde in Windows PowerShell 3.0 eingeführt.

Erstellen von Hashtabellen

Gehen Sie zur Erstellung einer Hashtabelle wie folgt vor:

– Beginnen Sie die Hashtabelle mit einem at-Zeichen (@).

– Schließen Sie die Hashtabelle in geschweifte Klammern ({}) ein.

– Geben Sie als Inhalt der Hashtabelle ein oder mehrere Schlüssel-/Wertpaare ein.

– Trennen Sie Schlüssel und Wert durch ein Gleichheitszeichen (=).

– Trennen Sie die einzelnen Schlüssel-/Wertpaare durch ein Semikolon (;) oder durch einen Zeilenumbruch.

– Schlüssel mit Leerzeichen müssen in Anführungszeichen stehen. Die Werte müssen gültige Windows PowerShell-Ausdrücke sein. Zeichenfolgen müssen in Anführungszeichen stehen, auch wenn sie keine Leerzeichen enthalten.

– Zur Verwaltung der Hashtabelle speichern Sie sie in einer Variablen.

– Wenn Sie einer Variablen eine sortierte Hashtabelle zuordnen möchten, fügen Sie das Attribut [ordered] vor dem @-Symbol ein. Wenn Sie das Attribut direkt vor dem Variablennamen einfügen, schlägt der Befehl fehl.

Zum Erstellen einer leeren Hashtabelle als Wert von $hash geben Sie Folgendes ein:

          $hash = @{}

Schlüssel und Werte können Sie einer Hashtabelle auch bei deren Erstellung hinzufügen. Die folgende Anweisung erstellt zum Beispiel eine Hashtabelle mit drei Schlüsseln.

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

Erstellen sortierter Wörterbücher

Ein sortiertes Wörterbuch können Sie durch Hinzufügen eines Objekts des Typs OrderedDictionary erstellen, am einfachsten verwenden Sie dazu aber das Attribut [Ordered].

Das Attribut [ordered] wurde in Windows PowerShell 3.0 eingeführt.

Fügen Sie das Attribut direkt vor dem @-Symbol ein.

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

Sortierte Wörterbücher verwenden Sie auf die gleiche Weise wie Hashtabellen. Beide Typen können als Wert von Parametern eingesetzt werden, die eine Hashtabelle oder ein Wörterbuch (iDictionary) akzeptieren.

Zum Konvertieren oder Umwandeln einer Hashtabelle können Sie das Attribut [ordered] nicht verwenden. Wenn Sie das Attribut [ordered] vor dem Variablennamen einfügen, schlägt der Befehl mit der folgenden Fehlermeldung fehl.

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

Sie können ein sortiertes Wörterbuch in eine Hashtabelle umwandeln, allerdings können Sie das Attribut [ordered] danach nicht wiederherstellen, selbst wenn Sie die Variable löschen und neue Werte eingeben. Zum Wiederherstellen der Reihenfolge müssen Sie die Variable entfernen und neu erstellen.

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

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

Anzeigen von Hashtabellen

Zum Anzeigen einer Hashtabelle, die in einer Variablen gespeichert ist, geben Sie den Namen der Variablen ein. Standardmäßig wird für eine Hashtabelle eine Spalte für die Schlüssel und eine Spalte für die Werte angezeigt.

          C:\PS> $hash
        
          Name                           Value
          ----                           -----
          Shape                          Square
          Color                          Blue
          Number                         1

Hashtabellen haben Eigenschaften für die Schlüssel und die Werte. Um alle Schlüssel oder alle Werte anzuzeigen, verwenden Sie die Punktnotation.

          C:\PS> $hash.keys
          Number
          Shape
          Color
        
          C:\PS> $hash.values
          1
          Square
          Blue
         

Jeder Schlüsselname ist auch eine Eigenschaft der Hashtabelle, und sein Wert ist der Wert der Eigenschaft key-name. Die Eigenschaftswerte zeigen Sie mit dem folgenden Befehlsformat an.

          $hashtable.<key>
          <value>     

Beispiel:

          C:\PS> $hash.Number
          1

          C:\PS> $hash.Color
          Blue

Hashtabellen haben die Eigenschaft Count. Diese gibt die Anzahl der Schlüssel-/Wertpaare der Hashtabelle an.

          C:\PS> $hash.count
          3

Hashtabellen sind keine Arrays. Sie können für eine Hashtabelle daher keine Ganzzahl als Index verwenden. Allerdings können Sie die Hashtabelle mit einem Schlüsselnamen indizieren. Wenn der Schlüssel ein Zeichenfolgewert ist, müssen Sie seinen Namen in Anführungszeichen einschließen.

Beispiel:

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

Hinzufügen und Entfernen von Schlüsseln und Werten

Zum Hinzufügen von Schlüsseln und Werten zu einer Hashtabelle verwenden Sie das folgende Befehlsformat.

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

Beispiel: Zum Hinzufügen des Schlüssels "Time" mit dem Wert "Now" verwenden Sie das folgende Anweisungsformat.

          $hash["Time"] = "Now"

Auch mit der Methode Add des Objekts System.Collections.Hashtable können Sie einer Hashtabelle Schlüssel und Werte hinzufügen. Die Add-Methode hat folgende Syntax:

          Add(Key, Value)

Beispiel: Zum Hinzufügen des Schlüssels "Time" mit dem Wert "Now" verwenden Sie das folgende Anweisungsformat.

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

Mit dem Additionsoperator (+) können Sie einer Hashtabelle Schlüssel und Werte in Form einer weiteren Hashtabelle hinzufügen. Mit der folgenden Anweisung fügen Sie beispielsweise der Hashtabelle in der Variablen $hash den Schlüssel "Time" mit dem Wert "Now" hinzu.

          $hash = $hash + @{Time="Now"}

Sie können einer Hashtabelle auch in Variablen gespeicherte Werte hinzufügen.

          $t = "Today"
          $now = (Get-Date)
          
          $hash.Add($t, $now)      

Zum Entfernen eines Schlüssel-/Wertpaars aus einer Hashtabelle können Sie keinen Subtraktionsoperator verwenden, die Methode Remove des Objekts Hashtable hingegen schon. Die Remove-Methode akzeptiert den Schlüssel als Wert.

Diese Methode hat folgende Syntax:

          Remove(Key)          

Zum Entfernen des Schlüssel-/Wertpaars "Time=Now" aus der Hashtabelle geben Sie zum Beispiel Folgendes in der Variablen $hash ein:

          $hash.$Remove("Time")

In Windows PowerShell können Sie alle Eigenschaften und Methoden des Objekts Hashtable verwenden, auch Contains, Clear, Clone und CopyTo. Weitere Informationen zu Hashtable-Objekten finden Sie in der Microsoft Developer Network (MSDN)-Bibliothek unter "System.Collections.Hashtable".

Objekttypen in Hashtabellen

Die Schlüssel und Werte einer Hashtabelle können einen beliebigen .NET-Objekttyp haben, auch innerhalb der gleichen Tabelle verschiedene Typen.

Die folgende Anweisung erstellt eine Hashtabelle aus den Zeichenfolgen von Prozessnamen und den Werten der Prozessobjekte und speichert sie in der Variablen $p.

          $p = @{"PowerShell" = (get-process PowerShell); 
          "Notepad" = (get-process notepad)}

Sie können die Hashtabelle in $p anzeigen und die key-name-Eigenschaften zum Anzeigen der Werte verwenden.

          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

Auch die Schlüssel einer Hashtabelle können einen beliebigen .NET-Typ haben. Die folgende Anweisung fügt der Hashtabelle in der Variablen $p ein Schlüssel-/Wertpaar hinzu. Der Schlüssel ist ein Serviceobjekt, das den Dienst WinRM darstellt, und der Wert ist der aktuelle Status des Diensts.

           C:\PS> $p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}

Das Anzeigen und der Zugriff auf das neue Schlüssel-/Wertpaar erfolgt auf die gleiche Weise wie bei anderen Paaren der Hashtabelle.

           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        

Die Schlüssel und Werte einer Hashtabelle können wiederum Hashtable-Objekte sein. Die folgende Anweisung fügt der Hashtabelle in der Variablen $p ein Schlüssel-/Wertpaar hinzu, in dem der Schlüssel die Zeichenfolge "Hash2" ist und der Wert eine Hashtabelle mit drei Schlüssel-/Wertpaaren.

          C:\PS> $p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

Das Anzeigen und der Zugriff auf die neuen Werte erfolgt mit den gleichen Methoden.

          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
     

Sortieren von Schlüsseln und Werten

Die Elemente einer Hashtabelle sind intrinsisch unsortiert. Bei jeder Anzeige können die Schlüssel-/Wertpaare in einer anderen Reihenfolge angezeigt werden.

Auch wenn sich eine Hashtabelle nicht sortieren lässt, können Sie die GetEnumerator-Methode für Hashtabellen verwenden, um die Schlüssel und Werte durchzuzählen, und die solchermaßen nummerierten Werte dann mit dem Cmdlet Sort-Object für die Anzeige sortieren.

Beispielsweise nummerieren die folgenden Befehle die Schlüssel und Werte der Hashtabelle in der Variablen $p und sortieren die Schlüssel dann in alphabetischer Reihenfolge.

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

          Name                           Value
          ----                           -----
          Notepad                        System.Diagnostics.Process (notepad)
          PowerShell                     System.Diagnostics.Process (PowerShell)
          System.ServiceProcess.Servi... Running

Der folgende Befehl verwendet das gleiche Verfahren zum Sortieren der Hashwerte in absteigender Reihenfolge.

          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

Erstellen von Objekten aus Hashtabellen

Ab Windows PowerShell 3.0 können Sie ein Objekt auch aus einer Hashtabelle mit Eigenschaftsnamen und -werten erstellen.

Die Syntax lautet wie folgt:

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

Diese Methode funktioniert nur bei Klassen mit einem Null-Konstruktor, d. h. einem Konstruktor, der keine Parameter enthält. Die Objekteigenschaften müssen öffentlich und einstellbar sein.

Weitere Informationen finden Sie unter "about_Object_Creation".

ConvertFrom-StringData

Das Cmdlet ConvertFrom-StringData konvertiert eine Zeichenfolge bzw. eine here-Zeichenfolge aus Schlüssel-/Wertpaaren in eine Hashtabelle. Das Cmdlet ConvertFrom-StringData können Sie ohne Bedenken im Abschnitt Data eines Skripts verwenden. In Verbindung mit dem Cmdlet Import-LocalizedData können Sie mit diesem Cmdlet Meldungen für die Benutzer in der UI-Kultur des aktuellen Benutzers anzeigen.

Here-Zeichenfolgen sind besonders praktisch, wenn die Werte der Hashtabelle Anführungszeichen enthalten. (Weitere Informationen zu here-Zeichenfolgen finden Sie unter "about_Quoting_Rules".)

Das folgende Beispiel zeigt, wie Sie aus den Benutzermeldungen des vorherigen Beispiels eine here-Zeichenfolge erstellen und die Meldungen dieser Zeichenfolge mit dem Cmdlet ConvertFrom-StringData in eine Hashtabelle konvertieren.

Der folgende Befehl erstellt aus den Schlüssel-/Wertpaaren eine here-Zeichenfolge und speichert diese in der Variablen $string.

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

Der folgende Befehl konvertiert die here-Zeichenfolge mit dem Cmdlet ConvertFrom-StringData in eine Hashtabelle.

        C:\PS> ConvertFrom-StringData $string

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

Weitere Informationen zu here-Zeichenfolgen finden Sie unter "about_Quoting_Rules".

SIEHE AUCH

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

"System.Collections.Hashtable" in der MSDN-Bibliothek