Arrays in PowerShell: anlegen, ändern, auslesen, sortieren, löschen


    Tags: ,

    Arrays in PowerShellWie fast jede moderne Script-Sprache kennt auch PowerShell den Datentyp Array. Er erfüllt auch hier die Aufgabe, zusammengehörige Werte in einer Variablen zu versammeln, wo man sie dann über einen Index ansprechen kann. Im Vergleich zu VBScript sind Operationen mit Arrays flexibler und in der Regel syntaktisch einfacher.

    Anders als in Sprachen mit starker Typisierung (etwa C oder Java) muss man eine Variable in PowerShell normalerweise nicht als Array deklarieren. Vielmehr reicht es aus, sie in der korrekten Form mit mehreren Werten zu belegen, um sie automatisch in ein Array zu verwandeln. Eine Ausnahme bilden jedoch solche Datenfelder, die durchgängig nur Daten vom gleichen Typ aufnehmen sollen.

    Verwendung von Datentypen

    Standardmäßig sieht PowerShell vor, dass alle Elemente eines Arrays vom Typ Variant sind. Daher kann man Daten beliebig nach Typ mischen und numerische Werte, Datumsangaben oder Zeichenketten in einer einzigen Variablen unterbringen. Möchte man ein Feld hingegen auf einen bestimmten Datentyp einschränken, dann kann man dies über eine Deklaration in dieser Form tun:

    [int[]] $e = 1,2,3,4,5,6,7,8,9

    Zu beachten ist hier, dass eine reine Deklaration nicht ausreicht, sondern der Variablen zusätzlich auch Werte zugewiesen werden müssen. Entsprechen diese nicht dem vorgegebenen Datentyp, dann antwortet PowerShell mit einer Fehlermeldung.

    Eine elegante Alternative bei der Zuweisung fortlaufender numerischer Werte besteht in der Verwendung des Bereichsoperators, mit dem sich obige Anweisung deutlich einfacher schreiben lässt:

    [int[]] $e = 1 .. 9

    Zuweisung von Werten zu einem Array

    Das erste Beispiel zeigt, wie die explizite Zuweisung von Werten zu einem Array generell erfolgt. Es handelt sich dabei um die vereinfachte Syntax, bei der man der Variablen nur eine Komma-getrennte Liste übergeben muss. Eine alternative Schreibweise sieht so aus:

    $farben = @("Schwarz","Weiß","Gelb","Blau")

    Normalerweise wird man sich den zusätzlichen Aufwand dieser Notation sparen. Sie hilft aber zu verstehen, warum man in PowerShell leere Arrays so anlegt:

    $farben = @()

    In vielen Fällen wird man ein Feld nicht manuell mit Werten belegen, sondern die Ausgabe eines Cmdlets in einer Variablen speichern. Ob es sich bei dessen Output um ein Array handelt, kann man so überprüfen:

    (Get-Process) -is [array]

    Wenn man nicht die gesamte Ausgabe des Befehl in der Variablen hinterlegen will, sondern nur bestimmte Eigenschaften, dann kann man diese über Select-Object ausfiltern:

    $mac = Get-NetAdapter | Select MacAddress

    Dieses Beispiel würde die Mac-Adressen aller installierten NICs in $mac speichern.

    Array um zusätzliche Elemente erweitern

    Möchte man nachträglich weitere Elemente zu einem Array hinzufügen, dann benötigt man dafür keinen Aufruf einer Methode. Vielmehr übernimmt der Operator '+' diese Aufgabe:

    $farben = $farben + "Orange"

    bzw. die kurze Fassung unter Verwendung des zusammengesetzten Zuweisungsoperators:

    $farben += "Orange"

    Auf diese Weise lassen sich auch zwei Arrays verbinden. Angenommen es existiert neben $farben noch das Array $muster mit den Werten "gepunktet", "kariert", "liniert", dann könnte man es so mit

    $farben += $muster

    an $farben anhängen.

    Inhalt von Arrays ausgeben

    Möchte man die Elemente eines Arrays anzeigen, dann muss man in den seltensten Fällen darüber iterieren. Im einfachsten Fall reicht die Eingabe des Variablennamens, wodurch PowerShell sämtliche Werte des Arrays ausgibt.

    Wie von anderen Programmiersprachen gewohnt, kann man aber auch über den Index gezielt auf einzelne Elemente zugreifen:

    $farben[0]

    gibt erwartungsgemäß "Schwarz" aus. Dabei fällt auf, dass die Zählung anders als bei diversen Basic-Implementierungen bei Null beginnt. PowerShell akzeptiert nicht nur einen einzelnen Indexwert, sondern erlaubt auch solche Konstrukte:

    $farben[1,4,7]

    Dieser Befehl würde das zweite, fünfte und achte Element des Arrays ausgeben. Hier lässt sich auch der Range-Operator einsetzen, wenn man einen zusammenhängenden Bereich anzeigen will:

    $farben[2 .. 6]

    Verwendet man für den Index negative Zahlen, so kann man von den letzten Elementen beginnend auf den Inhalt des Arrays zugreifen. Beispielsweise würde

    $farben[-1]

    das letzte Element ausgeben, -2 entsprechend das vorletzte.

    Elemente finden

    Möchte man feststellen, ob ein bestimmter Wert in einem Array enthalten ist, muss man ebenfalls nicht über alle Elemente iterieren und jedes mit dem gesuchten Wert vergleichen. Vielmehr kann man verschiedene Vergleichsoperatoren direkt auf das Array anwenden:

    $farben[2 .. 6] -contains "Blau"

    Dieser Ausdruck würde true zurückgeben. Anstelle von -contains ließe sich auch die Variante -ccontains verwenden, die Werte unter Berücksichtigung von Groß- und Kleinschreibung vergleicht. Für diesen Zweck ebenfalls nutzen lässt sich -like, das Wildcards akzeptiert und damit flexibler ist als -contains:

    $farben[2 .. 6] -like "ge*"

    Dieser Aufruf würde "Gelb" und "gepunktet" finden.

    Arrays sortieren

    Möchte man die Elemente eines Feldes in eine geordnete Reihenfolge bringen, dann geht auch dies in PowerShell ziemlich einfach. Man muss dazu nur die Ausgabe des Arrays über eine Pipe an Sort-Object übergeben:

    $farben | Sort

    Dabei kann man natürlich die erweiterten Möglichkeiten von Sort-Object einsetzen, etwa um die Sortierreihenfolge auf absteigend zu verändern oder Dubletten zu entfernen (siehe dazu: Daten sortieren in PowerShell).

    Will man die Elemente nicht nur temporär bei der Ausgabe sortieren, sondern diese Reihenfolge im Array speichern, dann muss man ihm die Elemente neu zuweisen:

    $farben = $farben | Sort

    Arrays und Elemente löschen

    So sehr sich die meisten Array-Operationen in PowerShell recht einfach gestalten, für das Entfernen einzelner Elemente oder das Löschen ganzer Felder gibt es keine überzeugende Lösung. Am einfachsten wird man ein ganzes Array los, indem man der Variable den Wert $null zuweist:

    $farben = $null

    Möchte man einzelne Elemente entfernen, dann muss man den Umweg über das Filtern und Neuzuweisen gehen:

    $farben = $farben | where {$_ -ne "Gelb"}

    In diesem Beispiel würde das Where-Object alle Elemente zurückgeben, deren Wert ungleich "Gelb" ist und diese würden dem Array $farben zugewiesen.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut

    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Ähnliche Beiträge

    Weitere Links

    4 Kommentare

    prima Übersicht, besser als in den meisten Fachbüchern.

    Hallo,
    ich habe folgendes Array, erhalte aber keine sortierte Ausgabe:

    $LISTE = @{

    "A" = "anton";
    "F" = "berta";
    "DR06" = "zzz";
    "DR07" = "rrr"
    }

    write-output $LISTE | sort-object Value

    Haben Sie Abhilfe? Danke!

    Hallo Wolfgang

    Vielen Dank für diese prima Übersicht. Ich muss mich mit Matrizen (2D-arrays) herumschlagen, finde aber wenig Infos darüber im Netz. Mit verschachtelten "for" Schleifen kann ich alles realisieren was ich möchte, denke aber, es müsste auch einfacher gehen.

    Beispielsweise eine Zeile oder Spalte auslesen:
    $a[4,2] # einzelnes Element lesen, funktioniert
    $a[0..9,2] # ganze Zeile lesen, funktioniert nicht.

    Haben Sie vielleicht einen Tipp?
    Danke im Voraus!