about_Hash_Tables
Kurze Beschreibung
Beschreibt, wie Sie Hashtabellen in PowerShell erstellen, verwenden und sortieren.
Lange Beschreibung
Eine Hashtabelle, die auch als Wörterbuch oder assoziatives Array bezeichnet wird, ist eine kompakte Datenstruktur, die ein oder mehrere Schlüssel-/Wertpaare speichert. Beispielsweise kann eine Hashtabelle eine Reihe von IP-Adressen und Computernamen enthalten, wobei die IP-Adressen die Schlüssel sind und die Computernamen die Werte oder umgekehrt sind.
In PowerShell ist jede Hashtabelle ein Hashtable -Objekt (System.Collections.Hashtable). 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 sortiertes Wörterbuch (System.Collections.Specialized.OrderedDictionary) in PowerShell zu erstellen.
Sortierte Wörterbücher unterscheiden sich von Hashtabellen, in denen 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 auch .NET-Objekte. Sie sind am häufigsten Zeichenfolgen oder ganze Zahlen, aber sie können einen beliebigen Objekttyp haben. Sie können auch geschachtelte Hashtabellen erstellen, in denen der Wert eines Schlüssels eine andere Hashtabelle ist.
Hashtabellen werden häufig verwendet, da sie sehr effizient sind, um Daten zu finden und abzurufen. 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 sortierten Wörterbuchs lautet wie folgt:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Das Attribut [sortiert] wurde in PowerShell 3.0 eingeführt.
Erstellen von Hashtabellen
Führen Sie die folgenden Richtlinien aus, um eine Hashtabelle zu erstellen:
- Beginnen Sie mit der Hashtabelle mit einem At Sign (
@
). - Schließen Sie die Hashtabelle in Klammern (
{}
) ein. - Geben Sie ein oder mehrere Schlüssel-/Wertpaare 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-/Wertpaare 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 sortierte Hashtabelle zuweisen, platzieren Sie das [ordered]-Attribut vor dem
@
Symbol. Wenn Sie ihn vor dem Variablennamen platzieren, schlägt der Befehl fehl.
Um eine leere Hashtabelle im Wert von $hash zu erstellen, geben Sie Folgendes ein:
$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 sortiertes Wörterbuch erstellen, indem Sie ein Objekt des OrderedDictionary-Typs hinzufügen, aber die einfachste Möglichkeit zum Erstellen eines sortierten Wörterbuchs verwendet das [ordered]
Attribut.
Das [ordered]
Attribut wird in PowerShell 3.0 eingeführt.
Platzieren Sie das Attribut unmittelbar vor dem Symbol "@".
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Sie können sortierte Wörterbücher auf dieselbe Weise verwenden, wie Sie Hashtabellen verwenden. Jeder Typ kann als Wert von Parametern verwendet werden, die eine Hashtabelle oder ein Wörterbuch (iDictionary) übernehmen.
Sie können das [ordered]
Attribut nicht verwenden, um eine Hashtabelle zu konvertieren oder zu casten. Wenn Sie das sortierte 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 [ordered]-Attribut.
$hash = [ordered]@{}
Sie können ein sortiertes Wörterbuch in eine Hashtabelle umwandeln, aber Sie können das sortierte Attribut nicht wiederherstellen, auch wenn Sie die Variable löschen und neue Werte eingeben. Um die Reihenfolge erneut einzurichten, 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 wird. Standardmäßig wird eine Hashtabelle als Tabelle mit einer Spalte für Schlüssel und eine 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 Eigenschaftenwerte anzuzeigen.
$hashtable.<key>
<value>
Beispiel:
$hash.Number
1
$hash.Color
Blue
Wenn der Schlüsselname mit einem der Eigenschaftennamen des HashTable-Typs kollidiert, können Sie auf PSBase
diese Eigenschaften zugreifen. Wenn der Schlüsselname beispielsweise die Auflistung von Keys zurückgibt keys
, verwenden Sie diese Syntax:
$hashtable.PSBase.Keys
Hashtabellen verfügen über eine Count-Eigenschaft, die die Anzahl der Schlüsselwertpaare in der Hashtabelle angibt.
$hash.count
3
Hashtabellen sind keine Arrays, sodass Sie keine ganze Zahl als Index in die Hashtabelle verwenden können, sie können jedoch einen Schlüsselnamen zum Index 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
Hinzufügen und Entfernen von Schlüsseln und Werten
Verwenden Sie zum Hinzufügen von Schlüsseln und Werten zu einer Hashtabelle das folgende Befehlsformat.
$hash["<key>"] = "<value>"
Verwenden Sie beispielsweise das folgende Anweisungsformat, um eine "Time"-Taste mit einem Wert von "Now" zur Hashtabelle hinzuzufügen.
$hash["Time"] = "Now"
Sie können auch Schlüssel und Werte zu einer Hashtabelle hinzufügen, indem Sie die Add-Methode des System.Collections.Hashtable-Objekts verwenden. Die Add-Methode weist die folgende Syntax auf:
Add(Key, Value)
Verwenden Sie beispielsweise das folgende Anweisungsformat, um eine "Time"-Taste mit einem Wert von "Now" zur Hashtabelle hinzuzufügen.
$hash.Add("Time", "Now")
Außerdem können Sie Schlüssel und Werte zu einer Hashtabelle hinzufügen, indem Sie den Ergänzungsoperator (+
) verwenden, um einer vorhandenen Hashtabelle eine Hashtabelle hinzuzufügen. Die folgende Anweisung fügt beispielsweise einen Schlüssel "Time" mit einem Wert von "Now" zur Hashtabelle in der $hash-Variable 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-/Wertpaar aus einer Hashtabelle zu entfernen, sie können jedoch 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)
Wenn Sie beispielsweise das Time=Now-Schlüssel-/Wertpaar aus der Hashtabelle im Wert der $hash Variablen entfernen möchten, geben Sie folgendes ein:
$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 mit 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
Die Schlüssel in einer Hashtabelle können auch einen beliebigen .NET-Typ sein. Die folgende Anweisung fügt dem Hashtabelle in der $p
Variable ein Schlüssel-/Wertpaar hinzu. Der Schlüssel ist ein Dienstobjekt, 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-/Wertpaar anzeigen und zugreifen, indem Sie dieselben Methoden verwenden, 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 Hashtable-Objekte sein. Die folgende Anweisung fügt dem Hashtabelle in der Variable, in der $p
der Schlüssel eine Zeichenfolge, Hash2 ist und der Wert eine Hashtabelle mit drei Schlüssel-/Wertpaaren ist, hinzu.
$p = $p + @{"Hash2"= @{a=1; b=2; c=3}}
Sie können die neuen Werte mithilfe derselben Methoden anzeigen und auf die neuen Werte 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 systemintern nicht angeordnet. Die Schlüssel-/Wertpaare werden möglicherweise jedes Mal, wenn Sie sie anzeigen, 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 aufzuzählen, und verwenden Sie dann das Cmdlet Sort-Object, um die aufgezählten Werte für die Anzeige zu sortieren.
Beispielsweise werden die folgenden Befehle die Schlüssel und Werte in der Hashtabelle in der $p
Variablen aufzählen und dann die Tasten in alphabetischer Reihenfolge sortieren.
$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 die gleiche 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 Eigenschaftenwerten erstellen.
Die Syntax ist wie folgt:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Diese Methode funktioniert nur für Klassen, die einen NULL-Konstruktor haben, also einen Konstruktor, der keine Parameter enthält. Die Objekteigenschaften müssen öffentlich und festgelegt sein.
Weitere Informationen finden Sie unter about_Object_Creation.
ConvertFrom-StringData
Das ConvertFrom-StringData
Cmdlet konvertiert eine Zeichenfolge oder eine Hier-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ächeskultur 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 hier Zeichenfolge der Benutzernachrichten im vorherigen Beispiel erstellen und wie Sie sie aus ConvertFrom-StringData
einer Zeichenfolge in eine Hashtabelle konvertieren.
Der folgende Befehl erstellt eine hier Zeichenfolge der Schlüssel-/Wertpaare 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 hier-Zeichenfolge 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.