about_Hash_Tables
Kurze Beschreibung
Beschreibt, wie Hashtabellen in PowerShell erstellt, verwendet und sortiert werden.
Lange Beschreibung
Eine Hashtabelle, auch als Wörterbuch oder assoziatives Array bezeichnet, ist eine kompakte Datenstruktur, die mindestens ein Schlüssel-Wert-Paar speichert. 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 umgekehrt.
In PowerShell ist jede Hashtabelle ein Hashtable[System.Collections.Hashtable]
Objekt. Sie können die Eigenschaften und Methoden von Hashtable Objekten in PowerShell verwenden.
Ab PowerShell 3.0 können Sie das [ordered]
-Attribut verwenden, um ein [System.Collections.Specialized.OrderedDictionary]
Objekt in PowerShell zu erstellen.
Sortierte Wörterbücher unterscheiden sich von Hashtabellen darin, dass die Schlüssel immer in der Reihenfolge angezeigt werden, in der Sie sie auflisten. Die Reihenfolge der Schlüssel in einer Hashtabelle wird nicht bestimmt.
Die Schlüssel und der Wert in Hashtabellen sind ebenfalls .NET-Objekte. Es handelt sich meist um Zeichenfolgen oder ganze Zahlen, aber sie können einen beliebigen Objekttyp aufweisen. Sie können auch geschachtelte Hashtabellen erstellen, in denen der Wert eines Schlüssels eine andere Hashtabelle ist.
Hashtables werden häufig verwendet, da sie effizient zum Suchen und Abrufen von Daten sind. Sie können Hashtabellen verwenden, um Listen zu speichern und berechnete Eigenschaften in PowerShell zu erstellen. Und PowerShell verfügt über ein Cmdlet, ConvertFrom-StringData
das Zeichenfolgen in eine Hashtabelle konvertiert.
Syntax
Die Syntax einer Hashtabelle lautet wie folgt:
@{ <name> = <value>; [<name> = <value> ] ...}
Die Syntax eines geordneten Wörterbuchs lautet wie folgt:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Der [ordered]
Typbeschleuniger wurde in PowerShell 3.0 eingeführt.
Erstellen von Hashtabellen
Befolgen Sie die folgenden Richtlinien, um eine Hashtabelle zu erstellen:
- Beginnen Sie die Hashtabelle mit einem At-Zeichen (
@
). - Schließen Sie die Hashtabelle in Klammern (
{}
) ein. - Geben Sie mindestens ein Schlüssel-Wert-Paar für den Inhalt der Hashtabelle ein.
- Verwenden Sie ein Gleichheitszeichen (
=
), um jeden Schlüssel von seinem Wert zu trennen. - Verwenden Sie ein Semikolon (
;
) oder einen Zeilenumbruch, um die Schlüssel-Wert-Paare zu trennen. - Schlüssel, die Leerzeichen enthalten, müssen in Anführungszeichen eingeschlossen werden. Werte müssen gültige PowerShell-Ausdrücke sein. Zeichenfolgen müssen in Anführungszeichen angezeigt werden, auch wenn sie keine Leerzeichen enthalten.
- Um die Hashtabelle zu verwalten, speichern Sie sie in einer Variablen.
- Wenn Sie einer Variablen eine geordnete Hashtabelle zuweisen, platzieren Sie den
[ordered]
Typ vor dem@
Symbol. Wenn Sie sie vor dem Variablennamen platzieren, schlägt der Befehl fehl.
Geben Sie Folgendes ein, um eine leere Hashtabelle im Wert von $hash zu erstellen:
$hash = @{}
Sie können auch Schlüssel und Werte zu einer Hashtabelle hinzufügen, wenn Sie sie erstellen. Die folgende Anweisung erstellt beispielsweise eine Hashtabelle mit drei Schlüsseln.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
Erstellen von geordneten Wörterbüchern
Sie können ein geordnetes Wörterbuch erstellen, indem Sie ein Objekt des OrderedDictionary Typs hinzufügen, aber die einfachste Möglichkeit, ein geordnetes Wörterbuch zu erstellen, besteht darin, das [ordered]
-Attribut zu verwenden.
Das [ordered]
Attribut wird in PowerShell 3.0 eingeführt.
Platzieren Sie das Attribut direkt vor dem Symbol "@".
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Sie können geordnete Wörterbücher auf die gleiche Weise wie Hashtabellen verwenden. Jeder Typ kann als Wert von Parametern verwendet werden, die eine Hashtabelle oder ein Wörterbuch (iDictionary) annehmen.
Sie können das [ordered]
-Attribut nicht zum Konvertieren oder Umwandeln einer Hashtabelle verwenden. Wenn Sie das geordnete Attribut vor dem Variablennamen platzieren, schlägt der Befehl mit der folgenden Fehlermeldung fehl.
[ordered]$hash = @{}
ParserError:
Line |
1 | [ordered]$hash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
Um den Ausdruck zu korrigieren, verschieben Sie das Attribut [ordered].
$hash = [ordered]@{}
Sie können ein geordnetes Wörterbuch in eine Hashtabelle umwandeln, aber sie können das geordnete Attribut nicht wiederherstellen, auch wenn Sie die Variable löschen und neue Werte eingeben. Um die Reihenfolge wiederhergestellt zu können, müssen Sie die Variable entfernen und neu erstellen.
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Anzeigen von Hashtabellen
Geben Sie den Variablennamen ein, um eine Hashtabelle anzuzeigen, die in einer Variablen gespeichert ist. Standardmäßig wird eine Hashtabelle als Tabelle mit einer Spalte für Schlüssel und einer für Werte angezeigt.
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
Hashtabellen verfügen über Schlüssel - und Werteeigenschaften . Verwenden Sie Punktnotation, um alle Tasten oder alle Werte anzuzeigen.
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
Jeder Schlüsselname ist auch eine Eigenschaft der Hashtabelle, und sein Wert ist der Wert der Schlüsselnameneigenschaft. Verwenden Sie das folgende Format, um die Eigenschaftswerte anzuzeigen.
$hashtable.<key>
<value>
Beispiel:
$hash.Number
1
$hash.Color
Blue
hashtables verfügen über eine Count-Eigenschaft , die die Anzahl der Schlüssel-Wert-Paare in der Hashtabelle angibt.
$hash.count
3
Hashtabellentabellen sind keine Arrays, sodass Sie keine ganze Zahl als Index in der Hashtabelle verwenden können, aber Sie können einen Schlüsselnamen zum Indizieren in die Hashtabelle verwenden. Wenn der Schlüssel ein Zeichenfolgenwert ist, schließen Sie den Schlüsselnamen in Anführungszeichen ein.
Beispiel:
$hash["Number"]
1
Behandeln von Kollisionen mit Eigenschaftennamen
Wenn der Schlüsselname mit einem der Eigenschaftennamen des HashTable-Typs kollidiert, können Sie das systeminterne Elementpsbase verwenden, um auf diese Eigenschaften zuzugreifen. Wenn der Schlüsselname beispielsweise lautet keys
und Sie die Auflistung der HashTable-Schlüssel zurückgeben möchten, verwenden Sie die folgende Syntax:
$hashtable.psbase.Keys
Dies gilt für andere Typen, die die System.Collections.IDictionary -Schnittstelle implementieren, z. B OrderedDictionary. .
Durchlaufen von Schlüsseln und Werten
Sie können die Schlüssel in einer Hashtabelle durchlaufen, um die Werte auf verschiedene Arten zu verarbeiten. Jedes der Beispiele in diesem Abschnitt weist die gleiche Ausgabe auf. Sie durchlaufen die $hash
hier definierte Variable:
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Hinweis
In diesen Beispielen wird als geordnetes Wörterbuch definiert, um sicherzustellen, $hash
dass die Ausgabe immer in der gleichen Reihenfolge erfolgt. Diese Beispiele funktionieren für normale Hashtabellen genauso, aber die Reihenfolge der Ausgabe ist nicht vorhersagbar.
Jedes Beispiel gibt eine Nachricht für jeden Schlüssel und seinen Wert zurück:
The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue
In diesem Beispiel wird ein foreach-Block verwendet, um die Schlüssel zu durchlaufen.
foreach ($Key in $hash.Keys) {
"The value of '$Key' is: $($hash[$Key])"
}
In diesem Beispiel wird ForEach-Object
verwendet, um die Schlüssel zu durchlaufen.
$hash.Keys | ForEach-Object {
"The value of '$_' is: $($hash[$_])"
}
In diesem Beispiel wird die GetEnumerator-Methode verwendet, um jedes Schlüssel-Wert-Paar durch die Pipeline an zu ForEach-Object
senden.
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
In diesem Beispiel werden die Methoden GetEnumerator und ForEach verwendet, um jedes Schlüssel-Wert-Paar zu durchlaufen.
$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})
Hinzufügen und Entfernen von Schlüsseln und Werten
Verwenden Sie das folgende Befehlsformat, um einer Hashtabelle Schlüssel und Werte hinzuzufügen.
$hash["<key>"] = "<value>"
Verwenden Sie beispielsweise das folgende Anweisungsformat, um der Hashtabelle einen "Time"-Schlüssel mit dem Wert "Now" hinzuzufügen.
$hash["Time"] = "Now"
Sie können einer Hashtabelle auch Mithilfe der Add
-Methode des System.Collections.Hashtable -Objekts Schlüssel und Werte hinzufügen. Die Add
Methode weist die folgende Syntax auf:
Add(Key, Value)
Um beispielsweise einen Time
Schlüssel mit dem Wert von Now
zur Hashtabelle hinzuzufügen, verwenden Sie das folgende Anweisungsformat.
$hash.Add("Time", "Now")
Außerdem können Sie einer Hashtabelle mithilfe des Additionsoperators (+
) Schlüssel und Werte hinzufügen, um einer vorhandenen Hashtabelle eine Hashtabelle hinzuzufügen. Die folgende Anweisung fügt beispielsweise einen Time
Schlüssel mit dem Wert von Now
zur Hashtabelle in der $hash
Variablen hinzu.
$hash = $hash + @{Time="Now"}
Sie können auch Werte hinzufügen, die in Variablen gespeichert sind.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
Sie können keinen Subtraktionsoperator verwenden, um ein Schlüssel-Wert-Paar aus einer Hashtabelle zu entfernen, aber Sie können die Remove-Methode des Hashtable -Objekts verwenden. Die Remove-Methode verwendet den Schlüssel als Wert.
Die Remove
Methode weist die folgende Syntax auf:
Remove(Key)
Geben Sie beispielsweise Folgendes ein, um das Time=Now
Schlüssel-Wert-Paar aus der Hashtabelle im Wert der $hash
Variablen zu entfernen:
$hash.Remove("Time")
Sie können alle Eigenschaften und Methoden von Hashtable -Objekten in PowerShell verwenden, einschließlich Contains
, Clear
, Clone
und CopyTo
. Weitere Informationen zu Hashtable -Objekten finden Sie unter System.Collections.Hashtable.
Objekttypen in HashTables
Die Schlüssel und Werte in einer Hashtabelle können einen beliebigen .NET-Objekttyp aufweisen, und eine einzelne Hashtabelle kann Schlüssel und Werte mehrerer Typen aufweisen.
Die folgende Anweisung erstellt eine Hashtabelle aus Prozessnamenzeichenfolgen und Prozessobjektwerten und speichert sie in der $p
Variablen.
$p = @{"PowerShell" = (Get-Process PowerShell);
"Notepad" = (Get-Process notepad)}
Sie können die Hashtabelle in $p
anzeigen und die Schlüsselnameneigenschaften verwenden, um die Werte anzuzeigen.
$p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
$p.PowerShell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
441 24 54196 54012 571 5.10 1788 PowerShell
$p.keys | foreach {$p.$_.handles}
441
251
Bei den Schlüsseln in einer Hashtabelle kann es sich auch um einen beliebigen .NET-Typ handeln. Die folgende Anweisung fügt der Hashtabelle in der $p
Variablen ein Schlüssel-Wert-Paar hinzu. Der Schlüssel ist ein Service-Objekt , das den WinRM-Dienst darstellt, und der Wert ist der aktuelle Status des Diensts.
$p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}
Sie können das neue Schlüssel-Wert-Paar mit den gleichen Methoden anzeigen und darauf zugreifen, die Sie für andere Paare in der Hashtabelle verwenden.
$p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
$p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
$p.keys | foreach {$_.name}
winrm
Die Schlüssel und Werte in einer Hashtabelle können auch Objekte sein Hashtable . Die folgende Anweisung fügt der Hashtabelle in der $p
Variablen, in der der Schlüssel eine Zeichenfolge ist, Hash2 und der Wert eine Hashtabelle mit drei Schlüssel-Wert-Paaren hinzu.
$p = $p + @{"Hash2"= @{a=1; b=2; c=3}}
Sie können die neuen Werte mit den gleichen Methoden anzeigen und auf sie zugreifen.
$p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
Hash2 {a, b, c}
$p.Hash2
Name Value
---- -----
a 1
b 2
c 3
$p.Hash2.b
2
Sortieren von Schlüsseln und Werten
Die Elemente in einer Hashtabelle sind intrinsisch ungeordnet. Die Schlüssel-Wert-Paare werden möglicherweise bei jeder Anzeige in einer anderen Reihenfolge angezeigt.
Obwohl Sie eine Hashtabelle nicht sortieren können, können Sie die GetEnumerator-Methode von Hashtabellen verwenden, um die Schlüssel und Werte aufzulisten, und dann das Sort-Object
Cmdlet verwenden, um die enumerierten Werte für die Anzeige zu sortieren.
Mit den folgenden Befehlen werden beispielsweise die Schlüssel und Werte in der Hashtabelle in der $p
Variablen aufgelistet und dann in alphabetischer Reihenfolge sortiert.
$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 dieselbe Prozedur, um die Hashwerte in absteigender Reihenfolge zu sortieren.
$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 PowerShell 3.0 können Sie ein Objekt aus einer Hashtabelle von Eigenschaften und Eigenschaftswerten erstellen.
Die Syntax lautet wie folgt:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Diese Methode funktioniert nur für Klassen, die über einen Konstruktor ohne Parameter verfügen. Die Objekteigenschaften müssen öffentlich und festlegbar sein.
Weitere Informationen finden Sie unter about_Object_Creation.
ConvertFrom-StringData
Das ConvertFrom-StringData
Cmdlet konvertiert eine Zeichenfolge oder eine here-Zeichenfolge von Schlüssel-Wert-Paaren in eine Hashtabelle. Sie können das ConvertFrom-StringData
Cmdlet sicher im Abschnitt Daten eines Skripts verwenden, und Sie können es mit dem Import-LocalizedData
Cmdlet verwenden, um Benutzernachrichten in der Benutzeroberflächenkultur (UI) des aktuellen Benutzers anzuzeigen.
Hier sind Zeichenfolgen besonders nützlich, wenn die Werte in der Hashtabelle Anführungszeichen enthalten. Weitere Informationen zu hier-Zeichenfolgen finden Sie unter about_Quoting_Rules.
Das folgende Beispiel zeigt, wie Sie eine here-Zeichenfolge der Benutzernachrichten im vorherigen Beispiel erstellen und verwenden ConvertFrom-StringData
, um sie aus einer Zeichenfolge in eine Hashtabelle zu konvertieren.
Der folgende Befehl erstellt eine here-Zeichenfolge der Schlüssel-Wert-Paare und speichert sie dann in der $string
Variablen.
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Dieser Befehl verwendet das ConvertFrom-StringData
Cmdlet, um die here-string in eine Hashtabelle zu konvertieren.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Weitere Informationen zu hier-Zeichenfolgen finden Sie unter about_Quoting_Rules.