Freigeben über


Informationen zu Hashtabellen

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, in der ein oder mehrere Schlüssel-Wert-Paare 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 umgekehrt.

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 Attribut [ordered] verwenden, um ein geordnetes Wörterbuch (System.Collections.Specialized.OrderedDictionary) in PowerShell zu erstellen.

Geordnete 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. In den meisten Fällen handelt es sich 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.

Hashtabellen werden häufig verwendet, da sie sehr effizient zum Auffinden und Abrufen von Daten sind. Sie können Hashtabellen verwenden, um Listen zu speichern und berechnete Eigenschaften in PowerShell zu erstellen. Außerdem verfügt PowerShell über das 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 [ordered] 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 geschweifte 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.
  • Der Schlüssel, der Leerzeichen enthält, muss 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 das Attribut [ordered] vor dem Symbol "@". Wenn Sie sie 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 geordnetes Wörterbuch erstellen, indem Sie ein Objekt vom Typ OrderedDictionary hinzufügen. Die einfachste Möglichkeit zum Erstellen eines geordneten Wörterbuchs ist jedoch die Verwendung des [Ordered]-Attributs.

Das Attribut [ordered] 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 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 Attribut [ordered] 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.

PS C:\> [ordered]$hash = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ [!INCLUDE[]()]
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordExc
eption
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode

Um den Ausdruck zu korrigieren, verschieben Sie das Attribut [ordered] .To correct the expression, move the [ordered] attribute.

PS C:\> $hash = [ordered]@{}

Sie können ein sortiertes 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.

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

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

Anzeigen von Hashtabellen

Um eine Hashtabelle anzuzeigen, die in einer Variablen gespeichert ist, geben Sie den Variablennamen ein. Standardmäßig wird eine Hashtabelle als Tabelle mit einer Spalte für Schlüssel und einer für Werte angezeigt.

C:\PS> $hash

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

Hashtabellen verfügen über Schlüssel- und Werteeigenschaften. Verwenden Sie die Punktnotation, um alle Schlüssel oder alle Werte anzuzeigen.

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 Key-Name-Eigenschaft. Verwenden Sie das folgende Format, um die Eigenschaftswerte anzuzeigen.

$hashtable.<key>
<value>

Beispiel:

C:\PS> $hash.Number
1

C:\PS> $hash.Color
Blue

Wenn der Schlüsselname mit einem der Eigenschaftennamen des HashTable-Typs kollidiert, können Sie verwenden PSBase , um auf diese Eigenschaften zuzugreifen. Wenn der Schlüsselname beispielsweise lautet keys und Sie die Auflistung von Schlüsseln zurückgeben möchten, verwenden Sie die folgende Syntax:

$hashtable.PSBase.Keys

Hashtabellen verfügen über eine Count-Eigenschaft, die die Anzahl der Schlüssel-Wert-Paare in der Hashtabelle angibt.

C:\PS> $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:

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

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

Um der Hashtabelle beispielsweise einen "Time"-Schlüssel mit dem Wert "Now" hinzuzufügen, verwenden Sie das folgende Anweisungsformat.

$hash["Time"] = "Now"

Sie können einer Hashtabelle auch Schlüssel und Werte hinzufügen, indem Sie die Add-Methode des System.Collections.Hashtable-Objekts verwenden. Die Add-Methode weist die folgende Syntax auf:

Add(Key, Value)

Um der Hashtabelle beispielsweise einen "Time"-Schlüssel mit dem Wert "Now" hinzuzufügen, verwenden Sie das folgende Anweisungsformat.

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

Außerdem können Sie einer Hashtabelle Schlüssel und Werte hinzufügen, indem Sie den Additionsoperator (+) verwenden, um einer vorhandenen Hashtabelle eine Hashtabelle hinzuzufügen. Beispielsweise fügt die folgende Anweisung der Hashtabelle in der variablen $hash einen "Time"-Schlüssel mit dem Wert "Now" 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)

Um beispielsweise das Schlüssel-Wert-Paar Time=Now aus der Hashtabelle im Wert der variablen $hash zu entfernen, 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.

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

Die Schlüssel in einer Hashtabelle können auch einen beliebigen .NET-Typ aufweisen. 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 die aktuelle status des Diensts.

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

Sie können das neue Schlüssel-Wert-Paar anzeigen und darauf zugreifen, indem Sie die gleichen Methoden verwenden, die Sie für andere Paare in der Hashtabelle verwenden.

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 in einer Hashtabelle können auch Hashtable-Objekte sein. 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.

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

Sie können die neuen Werte mit den gleichen Methoden anzeigen und auf sie zugreifen.

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 in einer Hashtabelle sind systemintern 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 Cmdlet Sort-Object verwenden, um die aufgelisteten 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.

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 dieselbe Prozedur, um die Hashwerte in absteigender Reihenfolge zu sortieren.

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 PowerShell 3.0 können Sie ein Objekt aus einer Hashtabelle mit 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 mit einem NULL-Konstruktor, d. h. einem Konstruktor ohne Parameter. 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 here-strings 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.

Mit dem folgenden Befehl wird eine here-Zeichenfolge der Schlüssel-Wert-Paare erstellt und dann in der variablen $string gespeichert.

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

Dieser Befehl verwendet das Cmdlet ConvertFrom-StringData, um die here-string in eine Hashtabelle zu konvertieren.

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-strings 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