HOWTO · PowerShell

Wie man ein Array, eine Hashtabelle und ein Dictionary in PowerShell erstellt

Erfahren Sie in dieser umfassenden Anleitung, wie Sie Arrays, Hashtabellen und geordnete Dictionaries in PowerShell erstellen und verwenden. Verstehen Sie die wichtigsten Unterschiede, wie Sie auf Elemente zugreifen, sie hinzufügen und entfernen, und wann Sie welche Datenstruktur verwenden. Enthält praktische Beispiele, reale Anwendungsfälle und einen FAQ-Bereich, der Ihnen hilft, PowerShell-Skripte und Datenmanipulation effizient zu meistern. Perfekt für Anfänger und fortgeschrittene Benutzer, die Automatisierung und Datenorganisation in PowerShell verbessern möchten.

Auf dieser Seite

Wählen Sie ein Array (@()) für eine Folge von Werten, eine Hashtabelle (@{}) für die Suche nach Schlüssel-Wert-Paaren und ein geordnetes Dictionary ([ordered]@{}), wenn die Reihenfolge, in der die Schlüssel hinzugefügt wurden, erhalten bleiben muss. Die folgenden Beispiele sind eigenständige PowerShell-Ausschnitte. Für diese Beispiele liegen keine Laufzeitbeobachtungen vor, daher wird keine Ausgabe behauptet.

Arrays in PowerShell erstellen

Ein Array speichert mehrere Werte in einer Variablen. Die Indizes von PowerShell-Arrays beginnen bei null, und -1 verweist auf das letzte Element. @() sammelt Ergebnisse ausdrücklich als Array, auch wenn ein Befehl einen einzelnen Wert zurückgibt. Führen Sie dieses Beispiel aus:

$items = @('apple', 'banana', 'cherry')
$items[0]
$items[-1]
$items += 'date'
$items = @($items | Where-Object { $_ -ne 'banana' })
$items -join ', '

Das Beispiel liest den ersten und den letzten Wert, hängt einen Wert an und weist dann ein gefiltertes Array zu, das banana ausschließt. PowerShell-Arrays haben eine feste Größe; += erstellt ein resultierendes Array und weist es zurück, sodass wiederholtes Anhängen an ein großes Array wiederholtes Kopieren erfordern kann. Für häufiges Hinzufügen und Entfernen kann eine veränderbare Sammlung wie System.Collections.Generic.List[object] besser geeignet sein. Um den Typ eines Arrays zu prüfen, verwenden Sie $items.GetType().FullName; @() erzeugt für diese String-Werte ein Object[].

Mit Hashtabellen in PowerShell arbeiten

Eine PowerShell-Hashtabelle ordnet Schlüssel Werten zu. Erstellen Sie eine mit @{}, lesen Sie einen Eintrag mit der Klammernotation, weisen Sie einen Schlüssel zu, um einen Eintrag hinzuzufügen oder zu ersetzen, und rufen Sie .Remove() auf, um einen zu löschen. Klammern funktionieren zuverlässig für beliebige Schlüsselnamen; die Punktnotation ist bequem, wenn ein Schlüssel ein einfacher, eigenschaftsähnlicher Name ist, kann aber mit eingebauten Membern wie Count kollidieren.

$inventory = @{ Fruit = 'Apple'; Color = 'Red'; Count = 5 }
$inventory['Color']
$inventory['Shape'] = 'Round'
$inventory.Remove('Color')
$inventory.GetEnumerator() | Sort-Object Name | ForEach-Object {
    "{0}={1}" -f $_.Name, $_.Value
}

Die letzte Pipeline sortiert die ausgegebenen Einträge zur Anzeige nach Schlüssel. Sie sortiert die ursprüngliche Hashtabelle nicht um und ersetzt sie nicht. PowerShell-Hashtabellenschlüssel sind standardmäßig nicht groß-/kleinschreibungsempfindlich; verwenden Sie eine andere Sammlung, wenn die Semantik des Schlüsselvergleichs abweichen muss.

Geordnete Dictionaries in PowerShell erstellen

Das Literal [ordered] erstellt ein geordnetes Dictionary und behält die Reihenfolge bei, in der die Einträge eingefügt wurden. Greifen Sie auf Einträge mit Schlüsseln zu und aktualisieren Sie sie genauso wie in einer Hashtabelle. Die Einfügereihenfolge unterscheidet sich von der alphabetischen Sortierung: Die ursprüngliche Reihenfolge bleibt die Einfügesequenz, es sei denn, Sie sortieren ausdrücklich ein separates Ergebnis.

$settings = [ordered]@{ Name = 'Delft'; Region = 'South Holland'; Active = $true }
$settings['Region']
$settings['Timezone'] = 'Europe/Amsterdam'
$settings.GetEnumerator() | ForEach-Object {
    "{0}={1}" -f $_.Key, $_.Value
}

Hashtabelle vs. geordnetes Dictionary: Die wichtigsten Unterschiede

| Merkmal | Hashtabelle | Geordnetes Dictionary |
| PowerShell-Literal | @{} | [ordered]@{} |
| Datenmodell | Schlüssel ordnen Werte zu | Schlüssel ordnen Werte zu |
| Iterationsreihenfolge | Verlassen Sie sich nicht auf die Einfügereihenfolge | Bewahrt die Einfügereihenfolge |
| Eintrag lesen oder aktualisieren | $table['key'] | $dictionary['key'] |
| Am besten geeignet für | Suche nach Schlüssel, wenn die Anzeigereihenfolge unwichtig ist | Schlüssel-Wert-Daten, deren Einfügereihenfolge wichtig ist |

Eine PowerShell-Hashtabelle ist nicht dasselbe wie jeder .NET-Dictionary-Typ. System.Collections.Hashtable ist ein .NET-Typ, der vom PowerShell-Literal @{} verwendet wird, während .NET auch andere Dictionary-Implementierungen mit eigenem Ordnungs- und Vergleichsverhalten bereitstellt. Wählen Sie anhand des konkreten Typs und des Verhaltens, das Ihr Code benötigt. Gehen Sie bei keiner der beiden Sammlungen ohne Messung der tatsächlichen Arbeitslast davon aus, dass sie schneller ist.

Praktische Anwendungsfälle

Verwenden Sie ein geordnetes Dictionary für Benutzer- oder Konfigurationsfelder, wenn die Ausgabe einer gewählten Reihenfolge folgen soll. Verwenden Sie eine Hashtabelle, um Wörter nach Schlüssel zu zählen. Diese Beispiele zeigen beide Aufgaben; der Code ist eigenständig, und es wird keine Ausgabe dafür behauptet.

$user = [ordered]@{
    Name = 'John Doe'
    Email = 'johndoe@example.com'
    Role = 'Admin'
}
$user.GetEnumerator() | ForEach-Object { "{0}: {1}" -f $_.Key, $_.Value }

$text = 'apple banana apple orange apple banana'
$wordCount = @{}
$text.Split() | ForEach-Object {
    if ($wordCount.ContainsKey($_)) {
        $wordCount[$_] += 1
    } else {
        $wordCount[$_] = 1
    }
}
$wordCount.GetEnumerator() | Sort-Object Name | ForEach-Object {
    "{0}: {1}" -f $_.Name, $_.Value
}

Fazit

Verwenden Sie Arrays für geordnete Folgen, die Sie nach Position verarbeiten, Hashtabellen für die schlüsselbasierte Suche und geordnete Dictionaries, wenn die Einfügesequenz Teil der Daten ist, die Sie darstellen. Denken Sie daran, dass += bei Arrays ein neues Array zuweist, dass Filtern ein zuzuweisendes Ergebnis zurückgibt und dass das Sortieren der aufgezählten Einträge einer Hashtabelle das angezeigte Ergebnis verändert, nicht die Tabelle selbst.

Häufig gestellte Fragen (FAQ)

Was ist der Unterschied zwischen einer Hashtabelle und einem Dictionary in PowerShell?

Im alltäglichen PowerShell-Gebrauch kann „Dictionary“ eine allgemeine Schlüssel-Wert-Struktur beschreiben, und @{} erstellt eine PowerShell-Hashtabelle, die auf dem .NET-Typ System.Collections.Hashtable basiert. Die .NET-Klassenbibliothek verfügt auch über eigene Dictionary-Typen, prüfen Sie also den konkreten Typ, wenn APIs eine bestimmte Implementierung erfordern.

Wie füge ich Elemente zu einem PowerShell-Array hinzu oder entferne sie daraus?

Hängen Sie mit $array += 'newItem' an und weisen Sie das Ergebnis dann wieder der Variablen zu. Um übereinstimmende Werte zu entfernen, filtern Sie und weisen Sie das Ergebnis zu, zum Beispiel $array = @($array | Where-Object { $_ -ne 'itemToRemove' }). Diese Operationen erzeugen ein Array-Ergebnis; sie ändern die Größe des bestehenden Arrays nicht an Ort und Stelle.

Kann ich eine Hashtabelle in PowerShell sortieren?

Sortieren Sie ihre Einträge für die Anzeige mit $hash.GetEnumerator() | Sort-Object Name. Dies gibt sortierte Einträge zurück und lässt $hash unverändert. Verwenden Sie [ordered]@{}, wenn Sie die Einfügereihenfolge benötigen; sie bewahrt die Reihenfolge, in der die Einträge hinzugefügt wurden, statt die Schlüssel alphabetisch zu sortieren.