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