In PowerShell gibt es verschiedene Datenstrukturen, die zur Speicherung und Verarbeitung von Daten verwendet werden. Jede dieser Strukturen hat ihre eigenen Vorteile und Anwendungsfälle. In diesem Artikel werden wir die Unterschiede zwischen Hashtable, Array, Object und List in PowerShell untersuchen und anhand eines identischen Beispiels erläutern, wie diese Strukturen aussehen und wofür sie verwendet werden können.

Beispiel: Angenommen, wir haben eine Sammlung von Benutzern, die jeweils einen Namen, ein Alter und eine Rolle haben. Wir möchten diese Benutzerinformationen in verschiedenen Datenstrukturen speichern und sie auf unterschiedliche Weise verarbeiten.

Hashtable (mehrdimensionaler Hashtable)

Ein Hashtable ist eine Sammlung von Schlüssel-Wert-Paaren, bei der jeder Schlüssel eindeutig ist und auf einen bestimmten Wert verweist. Hashtables eignen sich besonders für Situationen, in denen Sie Daten schnell nach einem bestimmten Schlüssel suchen oder abrufen müssen.

In diesem Beispiel ist das äußere Hashtable eine Sammlung von Benutzern, bei denen der Name des Benutzers als Schlüssel und ein inneres Hashtable mit zusätzlichen Informationen (Alter und Rolle) als Wert dient. Mit dieser Struktur können wir leicht auf die Informationen eines bestimmten Benutzers zugreifen:

> $alice = $users[‚Alice‘]
> $aliceRole = $alice[‚Role‘]

oder noch einfacher

> $aliceRole = $users[‚Alice‘][‚Role‘]

Array

Ein Array ist eine geordnete Sammlung von Werten, bei denen die Elemente durch ihre Position (Index) identifiziert werden, die bei 0 beginnt. Arrays können Werte des gleichen oder unterschiedlichen Typs enthalten und sind nützlich, wenn Sie eine Liste von Elementen verarbeiten möchten.

Hashtable in Array

In diesem Beispiel verwenden wir ein Array, um die Benutzerinformationen zu speichern. Jedes Element im Array ist ein Hashtable, das den Namen, das Alter und die Rolle des Benutzers enthält.

In diesem Beispiel verwenden wir das Cmdlet Where-Object, um das Hashtable-Element zu finden, dessen Name „Alice“ ist. Anschließend verwenden wir die Schreibweise $alice['Role'], um auf die Rolle von Alice zuzugreifen.

> $alice = $users | Where-Object { $_[‚Name‘] -eq ‚Alice‘ }
> $aliceRole = $alice[‚Role‘]

mehrdimensionales Array

In diesem Beispiel handelt es such um ein sogenanntes mehrdimensionales Array. Dies hat jedoch das Problem, dass man die Information, in welcher Spalte sich welche Information verbirgt, verloren geht.

Dementsprechend ist der Zugriff darauf auch ein anderer. Man muss wissen, in welcher Spalte sich welche Information verbirgt.
> $aliceRole = $users[0][2]

Object

Objekte erstellen, um komplexere Datenstrukturen zu repräsentieren. Detail siehe dazu hier.

benutzerdefinierte Objekte in einem Array

In diesem Beispiel verwenden wir benutzerdefinierte Objekte, um die Benutzerinformationen zu speichern. Jedes Element im Array ist ein Objekt, das die Eigenschaften Name, Alter und Rolle enthält.

In diesem Beispiel verwenden wir das Cmdlet Where-Object, um das benutzerdefinierte Objekt zu finden, dessen Name „Alice“ ist. Anschließend verwenden wir die Schreibweise $alice.Role, um auf die Rolle von Alice zuzugreifen.

> $alice = $users | Where-Object { $_.Name -eq ‚Alice‘ }
> $aliceRole = $alice.Role

mehrdimensionale Objekte

Sie können verschachtelte benutzerdefinierte Objekte verwenden, um mehrdimensionale Datenstrukturen zu erstellen. In diesem Beispiel erstellen wir ein benutzerdefiniertes Objekt, das Informationen über die User enthält:

In diesem Fall ist der Zugriff auf die einzelnen Elemente am einfachsten,

> $users.Alice.Role

List

Eine Liste ist eine geordnete Sammlung von Elementen, ähnlich wie ein Array, aber mit dem Vorteil, dass sie dynamisch ist. Das bedeutet, dass Sie Elemente zur Liste hinzufügen oder aus ihr entfernen können, ohne ihre Größe neu festlegen zu müssen. Listen eignen sich besonders für Situationen, in denen Sie die Anzahl der Elemente in der Sammlung nicht im Voraus kennen.

In diesem Beispiel verwenden wir eine Liste, um die Benutzerinformationen zu speichern. Wie im vorherigen Beispiel verwenden wir benutzerdefinierte Objekte, um die Benutzerinformationen darzustellen. In diesem Beispiel verwenden wir das Cmdlet Where-Object, um das benutzerdefinierte Objekt in der Liste zu finden, dessen Name „Alice“ ist. Anschließend verwenden wir die Schreibweise $alice.Role, um auf die Rolle von Alice zuzugreifen.

> $alice = $users | Where-Object { $_.Name -eq ‚Alice‘ }
> $aliceRole = $alice.Role

Es besteht kein Unterschied zwischen einem Array und einer Liste von Custom Objects.

Fazit

Die Wahl der richtigen Datenstruktur in PowerShell hängt von den Anforderungen Ihres spezifischen Anwendungsfalls ab. Hashtables eignen sich für schnellen Zugriff auf Elemente basierend auf Schlüsseln, Arrays sind gut für geordnete Sammlungen von Elementen, benutzerdefinierte Objekte können komplexere Datenstrukturen darstellen, und Listen bieten Flexibilität bei der Verwaltung dynamischer Sammlungen. Durch das Verständnis der Unterschiede zwischen diesen Datenstrukturen können Sie effizientere und besser lesbare PowerShell-Skripte erstellen.