Einsteigerleitfaden zur Verwendung von PowerShell-Hashtabellen

Beim ersten Mal auf Hashtabellen stoßen, könnte man sich fragen, was sie sind und welche entscheidende Rolle sie in Skripten oder Befehlen spielen. Keine Sorge! Dieses Tutorial hilft Ihnen dabei, mit PowerShell-Hashtabellen zu beginnen.

Kurz gesagt ermöglichen Hashtabellen das Speichern und Manipulieren von Daten mithilfe von Schlüssel-Wert-Paaren, die schnell und effizient abgerufen werden können. In diesem Tutorial lernen Sie die Grundlagen von Hashtabellen und wie Sie sie in Ihren PowerShell-Skripten und Befehlen verwenden können.

Lesen Sie weiter und erweitern Sie Ihre Fähigkeiten mit PowerShell-Hashtabellen!

Voraussetzungen

Dieses Tutorial wird in einer praktischen Demonstration durchgeführt. Stellen Sie sicher, dass Sie ein System mit installiertem und konfiguriertem PowerShell v5+ haben, um mitzumachen. Dieses Tutorial verwendet Windows 10 mit PowerShell 7, aber andere Versionen von PowerShell und Windows werden ebenfalls funktionieren.

Erstellen einer PowerShell-Hashtabelle

Das Abrufen bestimmter Daten kann sich irgendwann in eine „Nadel im Heuhaufen“-Situation verwandeln. Mit Hashtabellen können Sie jedoch schnell nach bestimmten Elementen in einer umfangreichen Datensammlung suchen.

In PowerShell sind Hashtabellen flexible Datenstrukturen, die auf vielfältige Weise verwendet werden, z. B. zum Speichern von Konfigurationsdaten, zum Übergeben von Argumenten an Cmdlets und zum Speichern von Daten in einem Skript.

Um zu sehen, wie eine PowerShell-Hashtabelle funktioniert, müssen Sie zuerst eine erstellen, wie folgt:

1. Öffnen Sie eine PowerShell-Sitzung und führen Sie den folgenden Befehl aus, der keine Ausgabe erzeugt, sondern eine Variable namens name deklariert, um auf eine leere Hashtable zu verweisen.

Wie Sie unten sehen können, werden Hashtables in PowerShell ähnlich wie Arrays definiert, indem das @-Symbol verwendet wird.

$name = @{}

2. Führen Sie als nächstes den unten stehenden Befehl aus, um den Typ der Variablen name zu überprüfen (GetType()).

$name.GetType()

Der Typ der Variablen name ist Hashtable, wie unten gezeigt. Diese Information bestätigt, dass Ihre Hashtable erfolgreich erstellt wurde.

Verifying the newly-created hashtable

3. Nachdem Sie Ihre Hashtable überprüft haben, führen Sie den folgenden Code aus, um zu überprüfen, ob die Hashtable leer ist oder nicht.

Der folgende Code bestimmt, ob die Count-Eigenschaft gleich (-eq) 0 ist, und gibt eine entsprechende Nachricht aus.

# Vergleichen Sie, ob der Wert der Count-Eigenschaft gleich (-eq) 0 ist
if ($name.Count -eq 0) {
	# Wenn ja, geben Sie die folgende Nachricht aus.
  Write-Output "The hashtable is empty."
} else {
	# Andernfalls geben Sie stattdessen die folgende Nachricht aus.
  Write-Output "The hashtable is not empty."
}

Unten sehen Sie, dass die Hashtable leer ist, da Sie sie gerade erstellt haben, und es keine Schlüssel-Wert-Paare darin definiert sind.

Checking if the hashtable is empty or not

Hinzufügen von Elementen zu einer PowerShell-Hashtable

Sie haben gerade eine praktisch leere PowerShell-Hashtable erstellt, die nur nützlich sein kann, wenn Sie Elemente hinzufügen. Wie? Indem Sie Schlüssel-Wert-Paare zur Hashtable hinzufügen.

Ähnlich wie bei einem Array verwendet eine PowerShell-Hashtable statt Ganzzahlen als Indizes Schlüssel (die jeden Datentyp haben können), um die Werte zu identifizieren. Diese Funktion ermöglicht ein schnelles Einfügen, Abrufen und Löschen von Elementen aus der Hashtable, da der Schlüssel den entsprechenden Wert schnell lokalisiert.

Im Folgenden finden Sie die Syntax zum Hinzufügen eines Schlüssel-Wert-Paares zu einer PowerShell-Hashtable, wobei:

  • $hashtable – Der Name der Hashtable.
  • $key – Der Name des Schlüssels, der unempfindlich gegen Groß- und Kleinschreibung ist. Zum Beispiel würden „Vorname“ und „vorname“ als derselbe Schlüssel in einer Hashtable betrachtet werden
  • $value – Der Wert, der mit dem Schlüssel assoziiert werden soll.
$hashtable[$key] = $value

Führen Sie den folgenden Code aus, der keine Ausgabe auf der Konsole erzeugt, sondern Schlüssel-Wert-Paare deklariert und fügen Sie sie Ihrer Hashtable ($name) hinzu.

In einer Hashtable ermöglicht es der Schlüssel, eine Hashfunktion auszuführen, die den Schlüssel einer bestimmten Position in der internen Datenstruktur der Hashtable zuordnet.

? Hashtable-Werte können jeden Typ haben, wie Zahlen, Zeichenfolgen, Arrays, Objekte und andere Datentypen als Werte in einer Hashtable.

# Deklariere den Schlüssel "Vorname"
$key = "FirstName"
# Deklariere den Wert des Schlüssels
$value = "John"
# Füge den Eintrag dem Hashtable hinzu
$name[$key] = $value

# Deklariere den Schlüssel "Nachname"
$key = "LastName"
# Deklariere den Wert des Schlüssels
$value = "Doe"
# Füge den Eintrag dem Hashtable hinzu
$name[$key] = $value

Führe nun den unten stehenden Code erneut aus, um zu überprüfen, ob dein Hashtable leer ist.

if ($name.Count -eq 0) {
  Write-Output "The hashtable is empty."
} else {
  Write-Output "The hashtable is not empty."
}

Wie unten gezeigt, erhältst du eine Meldung, dass das Hashtable dieses Mal nicht leer ist.

Checking if the hashtable is empty or not

Abrufen von Elementen aus einem PowerShell-Hashtable

Angenommen, du bist zuversichtlich, dass dein Hashtable nicht leer ist. Wie erfährst du, welche Elemente in deinem Hashtable existieren? Glücklicherweise kannst du auch Elemente aus deinem Hashtable abrufen.

Führe den unten stehenden Code aus, um alle Elemente aus deinem Hashtable in Schlüssel-Wert-Paaren zu erhalten und auszugeben (Write-Output), jeweils eins pro Zeile.`

# Durchläuft alle Schlüssel-Wert-Paare im Hashtable
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # Gibt alle Schlüssel-Wert-Paare im Hashtable aus, jeweils eins pro Zeile.
	Write-Output "${key}: ${value}"
}
Retrieving items from a PowerShell hashtable

Führe nun den unten stehenden Code aus, um alle Elemente in einem Hashtable abzurufen und auf die Konsole auszugeben.

? Beachten Sie, dass Sie im Laufe dieses Tutorials häufig den folgenden Code verwenden werden. Sie können das mehrfache Kopieren und Einfügen desselben Codes vermeiden, indem Sie eine Funktion erstellen, aber das fällt nicht in den Rahmen dieses Tutorials.

# Holen Sie sich ein Objekt, das zum Iterieren über die Elemente einer Sammlung verwendet werden kann.
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# Gibt einen String aus, der den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Dieses Mal können Sie Hinweise darauf sehen, welche Schlüssel und Werte unter den aufgelisteten Elementen sind.

Retrieving items from a PowerShell hashtable, indicating which are the keys and value pairs

Hashtabellen mit vordefinierten Werten erstellen

Bisher haben Sie nur leere Hashtabellen erstellt. Aber wenn Sie wissen, dass bestimmte Werte immer in Ihrer Hashtabelle benötigt werden, können Sie eine mit vordefinierten Werten erstellen.

Hashtabellen mit vordefinierten Werten können Ihnen Zeit sparen und Ihren Code effizienter machen, da Sie die Werte später nicht zur Hashtabelle hinzufügen müssen.

? Bedenken Sie, dass das Erstellen von Hashtabellen keine Ausgabe erzeugt. Aber keine Sorge. In diesem Tutorial werden Sie jede Hashtabelle nach der Erstellung überprüfen.

1. Führen Sie den folgenden Befehl aus, um eine Hashtabelle ($hashtable1) mit drei Schlüssel-Wert-Paaren zu erstellen.

$hashtable1 = @{
  "Key1" = "Value1"
  "Key2" = "Value2"
  "Key3" = "Value3"
}

2. Führen Sie anschließend den folgenden Code aus, um zu überprüfen, ob die neue Hashtabelle (hashtable1) existiert.

# Holen Sie sich ein Objekt, das zum Iterieren über die Elemente einer Sammlung verwendet werden kann.
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # Gibt einen String aus, der den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Sie werden feststellen, dass die Werte für jedes Schlüssel-Wert-Paar wie erwartet auf dem Bildschirm angezeigt werden. Diese Ausgabe bestätigt, dass die vordefinierten Werte an den entsprechenden Stellen im Hashtable gespeichert sind.

Verifying that hashtable was created successfully with predefined values

3. Führen Sie nun den folgenden Code aus, um einen Hashtable ($hashtable2) mit vordefinierten Werten mithilfe einer Schleife (oder eines Arrays) zu erstellen.

$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
  $hashtable2[$keys[$i]] = $values[$i]
}

4. Führen Sie schließlich den unten stehenden Code aus, um zu überprüfen, ob der neue Hashtable (hashtable2) erfolgreich erstellt wurde.

# Holen Sie sich ein Objekt, das zum Iterieren über die Elemente einer Sammlung verwendet werden kann.
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# Gibt einen String aus, der den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Die unten stehende Ausgabe bestätigt, dass die Schleifenmethode funktioniert, wenn ein Hashtable mit vordefinierten Werten erstellt wird. Da die Elemente jedoch zufällig aufgelistet sind, springen Sie zum nächsten Abschnitt für eine Lösung.

Verifying the new hashtable was created successfully

Erstellen einer geordneten Liste von Elementen in Hashtables

Standardmäßig werden die Elemente in einem Hashtable in keiner bestimmten Reihenfolge gespeichert. Aber was ist, wenn Sie eine geordnete Liste benötigen? Sie können auch eine geordnete Liste von Elementen in Ihren Hashtables erstellen, um Daten in einer bestimmten Reihenfolge anzuordnen.

Um eine geordnete Liste von Elementen in Ihrem Hashtable zu erstellen, verwenden Sie das [ordered]-Attribut wie folgt:

1. Führen Sie den folgenden Code aus, um eine geordnete Liste von Elementen in einer Hashtable (`$hashtable3`) zu erstellen.

$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}

2. Führen Sie anschließend den folgenden Code aus, um zu überprüfen, ob die geordnete Liste von Hashtables erfolgreich erstellt wurde.

# Holen Sie sich ein Objekt, das zum Durchlaufen der Elemente einer Sammlung verwendet werden kann.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Gibt eine Zeichenfolge aus, die den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Wie unten gezeigt, bleiben die aufgelisteten Elemente in der Reihenfolge, die Sie beim Erstellen der Hashtable definiert haben.

Einige mögliche Vorteile der Verwendung einer geordneten Hashtable sind unter anderem:

Benefits Description
Easier to read and debug The elements are displayed in a predictable order, which can be especially useful if you work with many elements of a large hashtable.
Improved performance An ordered hashtable can be more efficient when accessing elements frequently in a specific order.
Verifying that the ordered list of hashtables has been created

3. Rufen Sie schließlich Ihre geordnete Hashtable (`$hashtable3`) auf, um weiter zu bestätigen, dass Sie eine geordnete Liste von Elementen erhalten.

$hashtable3

Die untenstehende Ausgabe bestätigt, dass Sie unabhängig davon, wie Sie auf Ihre Hashtable zugreifen, weiterhin eine geordnete Liste von Elementen erhalten.

Verifying the list of items is still in an ordered format

Aktualisieren vorhandener Elemente in Hashtables

Daten ändern sich ständig und wenn Sie vorhandene Hashtables haben, ist deren Aktualisierung eine wichtige Aufgabe. Angenommen, Sie verwenden eine Hashtable, um Konfigurationswerte zu speichern. In diesem Fall müssen Sie möglicherweise den Wert eines Schlüssels aktualisieren, wenn sich die Konfiguration ändert.

Um eine PowerShell-Hashtable zu aktualisieren, verwendet der Zuweisungsoperator `=` wie folgt:

1. Führen Sie den folgenden Befehl aus, der keine Ausgabe liefert, aber den Wert des Schlüssels `Key2` in `$hashtable3` auf `NewValue2` aktualisiert.

$hashtable3["Key2"] = "NewValue2"

Führen Sie als Nächstes den folgenden Befehl aus, um eine neue Schlüssel-Wert-Paar (Key4 = NewValue4) zum Hashtable ($hashtable3) hinzuzufügen.

Das Hinzufügen eines neuen Schlüssel-Wert-Paars erzeugt keine Ausgabe wie das Aktualisieren vorhandener Listen in Hashtables, aber Sie werden die Änderungen im nächsten Schritt überprüfen.

$hashtable3.Add("Key4", "NewValue4")

3. Führen Sie den folgenden Code aus, um zu überprüfen, ob die Werte der Schlüssel in Ihrer Hashtable ($hashtable3) aktualisiert wurden.

# Holen Sie sich ein Objekt, das zum Iterieren über die Elemente einer Sammlung verwendet werden kann.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Gibt einen String aus, der den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
Verifying the key values have been updated

? In PowerShell muss jeder Schlüssel in einer Hashtable eindeutig sein. Wenn Sie versuchen, ein Schlüssel-Wert-Paar hinzuzufügen, das bereits in der Hashtable vorhanden ist, erhalten Sie einen Fehler wie den untenstehenden. Um diesen Fehler zu vermeiden, gehen Sie zum nächsten Schritt über.

Adding a key that already exists

4. Führen Sie nun den folgenden Code aus, der die Methode Contains() verwendet, um zu überprüfen, ob der Schlüssel, den Sie hinzufügen möchten, bereits in der Hashtable vorhanden ist, bevor Sie das Schlüssel-Wert-Paar hinzufügen.

# Definieren Sie die Variable, um den neuen Schlüssel zu halten
$newkey="Key5"
# Überprüfen Sie, ob $newkey bereits in der Hashtable vorhanden ist.
if (-not $hashtable3.Contains($newkey)) {
	# Wenn nicht, fügen Sie das neue Schlüssel-Wert-Paar hinzu.
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# Wenn der Schlüssel vorhanden ist, geben Sie eine Meldung aus.
	Write-Output "The key '$newkey' already exists."
}

Wenn der neue Schlüssel nicht existiert, erhalten Sie die folgende Meldung, in der steht, dass der neue Schlüssel zur Hashtable hinzugefügt wurde.

Checking if a key exists before adding it to the hashtable

Andernfalls erhalten Sie eine Nachricht, wenn der Schlüssel, den Sie bereits versuchen, bereits vorhanden ist.

Adding a key that already exists

5. Führen Sie abschließend den folgenden Code erneut aus, um alle Elemente in Ihrer Hashtable ($hashtable3) abzurufen.

# Erhalten Sie ein Objekt, das zum Durchlaufen der Elemente einer Sammlung verwendet werden kann.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Gibt einen String aus, der den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Unten sehen Sie den neu hinzugefügten Schlüssel (Key5) und andere Elemente, die Sie bisher zur Hashtable hinzugefügt haben.

Checking all items listed in a hashtable

Entfernen von Elementen aus einer Hashtable

Zu viele Elemente in einer Hashtable, insbesondere unnötige, können nur zu Verwirrung führen. Durch das Entfernen von Elementen, die nicht mehr relevant oder benötigt sind, wird Ihnen ein Gefallen getan.

Angenommen, Ihre Hashtable enthält eine Liste von Benutzern und deren Informationen. Wenn ja, entfernen Sie Benutzer aus Ihrer Hashtable, wenn sie nicht mehr aktiv sind.

Führen Sie den folgenden Code aus, um ein bestimmtes Element (Key1) aus Ihrer Hashtable ($hashtable3) zu entfernen.

$key = "Key5"
if ($hashtable3.Contains($key)) {
  $hashtable3.Remove($key)
  Write-Output "The key-value pair with the key '$key' was removed from the hashtable."
} else {
  Write-Output "The key-value pair with the key '$key' was not found in the hashtable."
}

Unten wird die Ausgabe angezeigt, die besagt, dass der Schlüssel entfernt wurde. Wenn der Schlüssel jedoch nicht vorhanden ist, erhalten Sie eine Meldung, dass der Schlüssel nicht gefunden wurde.

Removing items from a hashtable

Führen Sie nun den folgenden Code aus, um alle Elemente in Ihrer Hashtable zu überprüfen und zu überprüfen, ob die Elementlöschung erfolgreich war.

# Erhalten Sie ein Objekt, das zum Durchlaufen der Elemente einer Sammlung verwendet werden kann.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Gibt einen String aus, der den Schlüssel und den Wert jedes Elements in der Sammlung enthält.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Nachfolgend können Sie überprüfen, dass das Schlüssel-Wert-Paar mit dem Schlüssel „Key5“ nicht mehr in Ihrer Hashtabelle vorhanden ist.

Verifying item deletion is successful

Schlussfolgerung

Mit einer Schlüssel-Wert-Paar-Struktur und schnellem Zugriff ist eine PowerShell-Hashtabelle gut geeignet, um große Datenmengen in verschiedenen Szenarien zu verwalten. Und in diesem Tutorial haben Sie gelernt, wie Sie Elemente zu Hashtabellen hinzufügen, aktualisieren und entfernen können. All das verleiht Ihnen die Fähigkeiten, Hashtabellen effektiv in Ihren Skripten zu verwenden.

Warum nutzen Sie Ihre neu erworbenen Fähigkeiten nicht auf die nächste Stufe? Erwägen Sie, Hashtabellen in Ihre Skripte für fortgeschrittenere Aufgaben wie Datenmanipulation und Transformation zu integrieren. Oder experimentieren Sie mit Kombinationen von Hashtabellen mit anderen Datenstrukturen in PowerShell, wie Arrays und Objekte, um komplexere Probleme zu lösen?

Source:
https://adamtheautomator.com/powershell-hashtable/