Arrays sind ein grundlegendes Merkmal von PowerShell. Sie ermöglichen es, echte Datenstrukturen (und nicht nur rohe Strings) aufzunehmen, zu verarbeiten und auszugeben. Diese Funktion unterscheidet PowerShell von anderen Skriptsprachen und macht es nützlicher.
In diesem Artikel erklären wir, was Arrays sind und wie man sie in PowerShell verwendet. Wir zeigen Ihnen zunächst, wie Sie Arrays in PowerShell erstellen und anschließend grundlegende Funktionen zur Bearbeitung dieser Arrays verwenden können. Danach erläutern wir die verschiedenen Arten von Arrays, samt ihrer nuancierten Eigenschaften.
Unser Ziel ist es, Ihnen eine gute Grundlage für die Arbeit mit Arrays in PowerShell zu vermitteln. Sobald Sie diese Grundlagen beherrschen, können Sie sich unseren Kurs über PowerShell ansehen, um mehr zu erfahren.
Arrays sind ein gängiges Feature fast aller Programmiersprachen. Sie bieten eine Datenstruktur, die als Sammlung von mehreren Datenelementen dient. Bei der Arbeit mit einem Array kann man entweder denselben Befehl verwenden, um dieselbe Funktion für jedes Element innerhalb eines Arrays auszuführen, oder man kann über einen Index auf einzelne Elemente zugreifen und diese bearbeiten.
Arrays in PowerShell können ein oder mehrere Elemente enthalten. Ein Element kann eine Zeichenfolge, eine ganze Zahl, ein Objekt oder sogar ein anderes Array sein, und ein Array kann eine beliebige Kombination dieser Elemente enthalten. Jedes dieser Elemente hat einen Index, der immer bei 0 beginnt (was manchmal zu Verwirrung führt). Das erste Element in einem Array erhält also den Index 0, das zweite wird mit 1 indexiert, und so weiter.
PowerShell-Arrays sind ein derart grundlegender Bestandteil von PowerShell, dass sie in jedem PowerShell-Tutorial behandelt werden. Solide Kenntnisse über Arrays sind für viele Aspekte der Arbeit mit PowerShell von entscheidender Bedeutung, von der Konfiguration von Office 365 bis hin zur Verwendung von PowerShell für Pentesting.
Was ein Array ist, lässt sich am einfachsten anhand eines Beispiels erläutern. Lassen Sie uns ein Array anlegen, das eine Obstschale darstellt.
Es gibt verschiedene Möglichkeiten, Arrays in Powershell zu erstellen, aber am einfachsten ist es, diesen Befehl auszuführen:
@()
Hierdurch wird ein leeres Array erstellt. Ein leeres Array ist jedoch nicht besonders nützlich. Fügen wir also ein paar Früchte zu unserem neuen Array hinzu. Diese werden als Textstrings eingegeben. Führen Sie dazu diesen Befehl aus:
$fruit = @('Apples','Oranges','Bananas')
Dadurch wird ein Array „fruit“ genannt und es werden drei Elemente hinzugefügt. Um zu sehen, ob das funktioniert hat, können Sie das Array mit diesem Befehl lesen:
PS /Users/yourname> $fruit
Es wird Folgendes zurückgegeben:
Äpfel Orangen Bananen
Wie Sie sehen können, handelt es sich bei diesem Array um eine Gruppe von einzelnen Daten. PowerShell indexiert sie automatisch auf die oben beschriebene Weise: „Apple“ wird als 0, „Oranges“ als 1 und „Bananas“ als 2 indexiert.
Nach diesem Beispiel könnte man denken, dass Arrays relativ einfache Objekte sind, und das stimmt in gewisser Weise auch. Gerade deswegen sind sie aber auch so leistungsstark und flexibel. Im weiteren Verlauf dieses Leitfadens geben wir Ihnen einen Vorgeschmack auf die Möglichkeiten mit Arrays.
In diesem Abschnitt erläutern wir die grundlegenden Möglichkeiten zum Erstellen von und Arbeiten mit Arrays in PowerShell.
Zunächst erstellen wir ein Array. Die Standardmethode hierfür ist der Befehl „@()“, aber es gibt auch andere Möglichkeiten.
Erstellen wir nun zunächst ein Array mit dem Namen „daten“ erstellen. Führen Sie dazu den Befehl aus:
$data = @()
Dieses Array ist derzeit leer, da wir keine Daten dafür angegeben haben. Um zu prüfen, wie viele Elemente sich in einem Array befinden, können wir die Funktion „count“ verwenden:
$data.count
Das wird nun 0 zurückgeben, da es keine Elemente in unserem Array gibt. Um ein Array mit Daten zu erstellen, können wir die gewünschten Daten einfach nach dem „@“ in die Klammern einfügen:
$data = @('Null','Eins','Zwei','Drei')
Wenn wir nun dieselbe count-Funktion ausführen, sehen wir, dass sich in diesem Array 4 Elemente befinden. Um diese Elemente wieder anzuzeigen, können wir einfach das Array aufrufen:
$data
Dadurch werden alle Elemente aufgelistet, die wir in das Array eingefügt haben.
Nun haben wir ein Array und wollen auch auf die Elemente darin zugreifen. Dafür gibt es mehrere Möglichkeiten. Die erste besteht darin, den Index der Elemente im Array zu verwenden. Wie bereits erwähnt beginnt der Index bei 0. Um also das erste Element in unserem Array aufzurufen, müssen wir PowerShell anweisen, das Element mit dem Index 0 aufzurufen. Das geht mit dem folgenden Befehl:
$data[0]
Dadurch wird „Null“ zurückgegeben, da das der erste String war, die wir in unser Array eingefügt haben.
Wir können diese Syntax auch erweitern, um mehrere Elemente aus demselben Array zurückzugeben, indem wir einfach mehrere Indizes in denselben Befehl einfügen. Dazu können wir beispielsweise den folgenden Befehl ausführen:
$data[0,2,3]
Es wird „Null Zwei Drei“ zurückgegeben. Die Elemente werden in der gleichen Reihenfolge zurückgegeben, in der Sie die Indizes eingegeben haben. Sie können auch eine andere Syntax verwenden, um Gruppen von Elementen aus einem Array zurückzugeben. Zum Beispiel:
$data[1..3]
Dieser Befehl gibt alle Elemente mit einem Index von 1 bis (einschließlich) 3 zurück. Und:
$data[-1]
Dieser Befehl gibt das letzte Element im Array zurück: Die negative Zahl weist PowerShell an, vom Ende des Arrays aus rückwärts zu zählen. In diesem Fall gibt der Befehl „Drei“ zurück, das letzte Element in unserem Test-Array.
Die gleiche Methode kann verwendet werden, um die Elemente in einem Array zu ändern. Um beispielsweise das Element mit dem Index 2 zu ändern (denken Sie dran, das ist das dritte Element im Array), können wir den folgenden Befehl ausführen:
$data[2] = 'Zweiter'
Dies ermöglicht den direkten Zugriff auf die Elemente innerhalb eines Arrays.
Eines der leistungsstärksten Features von PowerShell (und eigentlich von jeder Befehlszeilenschnittstelle) ist die Möglichkeit, dieselbe Aktion für alle Elemente in einem Array auszuführen. Dafür gibt es verschiedene Möglichkeiten.
Am einfachsten geht es mit einer Pipeline, also mit dem Zeichen „|“. Wenn Sie ein Array an eine Pipeline übergeben, wird jedes Element in einem Array einzeln verarbeitet. Wie in unserem Artikel über Objekt- und Data-Piping in PowerShell erläutert haben, ist dies oft die einfachste Möglichkeit, Aktionen zu iterieren.
Um beispielsweise jedem Element in unserem Array eine Beschreibung hinzuzufügen, können wir diesen Befehl verwenden:
$data | ForEach-Object {"Element: [$PSItem]"}
Mit diesem Befehl wird PowerShell angewiesen, die Elemente in $data jeweils einzeln aufzurufen und dann für jedes „Element:“ am Anfang anzufügen, gefolgt vom ursprünglichen Wert des Elements.
Es gibt verschiedene andere Möglichkeiten, Aktionen in PowerShell zu iterieren, von denen Ihnen viele wahrscheinlich bekannt vorkommen werden, wenn Sie bereits mit anderen Programmiersprachen gearbeitet haben: PowerShell bietet ForEach-Schleifen, For-Schleifen und Switch-Schleifen. Weitere Einzelheiten hierzu finden Sie in der Microsoft-Dokumentation.
Bisher haben wir mit einem Array gearbeitet, das relativ einfache Daten enthält: Strings. Arrays können jedoch auch Objekte enthalten, und für viele gängige Anwendungsfälle von PowerShell – etwa für die Konfiguration von Office 365 – müssen Sie wissen, wie man mit Objekten arbeitet. Schauen wir uns also ein paar grundlegende Befehle dafür an.
Mit der „@()“-Funktion können wir ein Array von Objekten erstellen, genauso wie mit Strings. Um beispielsweise eine Testliste mit Mitarbeitern zu erstellen, können wir den folgenden Befehl verwenden:
$data = @( [pscustomobject]@{Vorname='Kevin';Nachname='Marquette'} [pscustomobject]@{Vorname='Max'; Nachname='Mustermann'} )
Die meisten Cmdlets geben ein Array dieses Typs zurück, wenn Sie ihnen eine Variable zuweisen, mit der sie sollen.
Der Prozess, den wir oben für den Zugriff auf einzelne Elemente verwendet haben, kann auch für Arrays verwendet werden, die Objekte enthalten. Man kann zum Beispiel den folgenden Befehl ausführen:
$data[0]
Und erhält die folgende Rückgabe:
Vorname Nachname ----- ---- Kevin Marquette
Alternativ können wir auf die Eigenschaften einzelner Objekte zugreifen, indem wir innerhalb des Befehls angeben, welche Eigenschaft wir haben möchten:
$data[0].Vorname
Die Ausgabe ist „Thomas“.
Darüber hinaus können mit derselben Syntax einzelne Eigenschaften von Objekten, die in Arrays gespeichert sind, bearbeitet werden. Zum Beispiel:
$data[0].Vorname = 'Jay'
Dadurch wird die Vorname-Eigenschaft des ersten Elements in unserem Array auf „Jay“ gesetzt.
In den meisten Programmiersprachen müssten wir einen iterativen Prozess (siehe oben) verwenden, um auf alle Eigenschaften in einem Array von Objekten zuzugreifen. Das können wir natürlich auch folgendermaßen in PowerShell tun:
$data | ForEach-Object {$_.Nachname}
Dadurch wird eine Liste aller Nachname-Eigenschaften in unserem Array zurückgeben. Es ist jedoch rechenintensiv und umständlich, das jedes Mal zu schreiben, wenn Sie diese Daten sehen wollen. Stattdessen bietet PowerShell eine Abkürzung. Führen Sie diesen Befehl aus:
$data.Nachname
Und Sie erhalten die gleiche Liste. PowerShell verarbeitet, genau wie zuvor, jedes Objekt einzeln, blendet aber die Komplexität aus.
Fast alle Operatoren, die wir in PowerShell für einzelne Datenelemente verwenden, funktionieren auch mit Arrays. Einige davon funktionieren jedoch etwas anders, wenn sie so verwendet werden. Werfen wir nun einen Blick auf die gängigsten Operatoren und wie man sie in Arrays verwenden kann.
Der „-join“-Operator ist einer der am häufigsten verwendeten Befehle in PowerShell und äußerst nützlich bei der Arbeit mit Arrays. Er kann iterativ für die Elemente in einem Array verwendet werden, um sie in der Ausgabe des Arrays zusammenzuführen.
Ein Beispiel: Erstellen Sie zunächst ein einfaches Array:
$data = @(1,2,3,4)
Verwenden Sie dann „-join“, um einen Bindestrich zwischen den einzelnen Elementen einzufügen, und geben Sie das Ergebnis aus:
$data -join '-'
Es wird „1-2-3-4“ zurückgegeben. Der Operator „-join“ kann auch ohne Trennzeichen verwendet werden. In diesem Fall werden die Elemente im Array als eine Reihe nicht getrennter Werte ausgegeben.
Der Operator „-contains“ funktioniert bei Arrays in ähnlicher Weise wie bei einzelnen Datenpunkten. Sie können damit prüfen, ob ein Array einen bestimmten String enthält, und es wird ein boolescher Wert ausgegeben. Zum Beispiel:
PS> $data = @('rot','gruen','blau') PS> $data -contains 'gruen' True
In PowerShell gibt es zwei Operatoren zur Überprüfung auf Gleichheit: „-eq“ und „-ne“. Wenn Sie es jedoch gewohnt sind, diese für einzelne Werte zu benutzen, kann es verwirrend sein, wie sie mit Arrays verwendet werden. Wenn Sie z. B. „-eq“ verwenden, gibt der Operator kein boolesches „True“ aus, sondern das Objekt, das einen Treffer liefert.
Zum Beispiel:
PS> $data = @('rot','gruen','blau') PS> $data -eq 'gruen' gruen
Der Operator „-ne“ funktioniert ähnlich, gibt jedoch alle Werte aus, die nicht gleich dem angegebenen Wert sind. Also:
PS> $data = @('rot','gruen','blau') PS> $data -ne 'gruen' rot blau
Sie können jedoch eine „if()“-Anweisung verwenden, um die Ausgabe dieser Operatoren mit der erwarteten Ausgabe zu vergleichen und eine „True“- oder „False“-Ausgabe zurückzugeben.
Nach all diesen Anweisungen werden Sie sich wahrscheinlich fragen, warum wir uns nicht angeschaut haben, wie man Elemente zu einem Array hinzufügt. Das liegt daran, dass das nicht geht. Ein einmal erstelltes Array bleibt immer gleich groß. Um es zu vergrößern, müssen Sie es in ein neues Array kopieren und das Original löschen.
Das hört sich kompliziert an, aber Powershell erledigt diesen Prozess für Sie mit einigen relativ einfachen Operatoren. Es gibt zwei Möglichkeiten dafür.
PowerShell kann mit dem Operator „+“ zwei Arrays addieren, wodurch die Komplexität der tatsächlich ausgeführten Systeme ausgeblendet wird. Sie können zum Beispiel zwei Test-Arrays wie folgt erstellen:
$first = @( 'Null' 'Eins' ) $second = @( 'Zwei' 'Drei' )
Sie können sie dann mit folgenden Schritten addieren:
PS> $first + $second
Dadurch wird ein neues Array mit allen vier Werten erstellt und die Ergebnisse ausgegeben. Beachten Sie jedoch, dass dieses neue Array keinen neuen Namen erhält. Dazu müssen wir den Operator „+=“ benutzen.
Anstelle des „+“-Operators im obigen Beispiel hätten wir auch den „+=“-Operator verwenden können, der uns ein ganz neues Array liefert:
$first += 'Zwei, Drei'
Der Befehl sieht einfach aus, aber er verbirgt, was PowerShell hier tatsächlich tut. Es kopiert alle Werte aus „$first“ und erstellt ein neues Array, das die zusätzlichen Werte enthält. Anschließend wird das ursprüngliche Array gelöscht.
Dieser Prozess ist etwas problematisch, weil er relativ rechenintensiv ist. Bei kleinen Arrays werden Sie das vielleicht nicht bemerken, aber bei großen Datenmengen kann diese Methode Ihr System schnell lahmlegen. Deshalb finden Sie im Folgenden eine Lösung für dieses Problem.
Bisher haben wir uns mit Standardarrays in PowerShell befasst. Auch wenn PowerShell uns das nicht mitgeteilt hat, ist jedes Array, das wir bisher erstellt haben, vom Typ „[PSObject[]]“. Diese Art von Array kann alle Arten von Datenwerten enthalten.
Es kann jedoch vorkommen, dass Sie möchten, dass ein Array nur eine einzige Art von Daten oder Objekten aufnehmen kann. Dazu können wir ein stark typisiertes Array verwenden, das nur den angegebenen Datentyp enthalten kann.
So können wir zum Beispiel ein Array erstellen, das nur ganze Zahlen aufnehmen kann:
PS> [int[]] $zahlen = 1,2,3
Wenn Sie versuchen, einen Datenwert eines falschen Typs in ein stark typisiertes Array einzugeben, wird ein Fehlercode zurückgegeben.
Wie wir bereits erwähnt haben, kann es sehr aufwendig sein, Elemente zu Arrays hinzuzufügen. Es gibt jedoch eine andere Art von Auflistung – ArrayList – die das eleganter handhabt. Um diese Art der Auflistung zu verwenden, müssen wir jedoch das .Net-Framework aufrufen, das uns mit bestimmten Ausgaben Probleme bereiten kann.
Um eine ArrayList zu erstellen und dann Elemente hinzuzufügen, führen Sie die folgenden Schritte aus:
$meinarray = [System.Collections.ArrayList]::new() [void]$meinarray.Add('Wert')
Hier können wir den standardmäßigen .Net-Konstruktor verwenden, um eine neue ArrayList zu erstellen, und dann mit dem Operator „-Add“ Elemente hinzufügen. Der „[void]“-Operator steht da, weil diese Befehle manchmal seltsame Ausgaben liefern, die den Code durcheinanderbringen können.
Das sind die gängigsten Array-Typen in PowerShell, aber es gibt noch einige andere. Wenn Sie als PowerShell-Benutzer entwickeln, ist es sinnvoll, ArrayLists anstelle reiner Arrays zu verwenden. Sie sollten sich jedoch bewusst sein, dass dieser Array-Typ nicht von fortgeschrittenen Benutzern verwendet wird.
Stattdessen werden die meisten erfahrenen Programmierer einen allgemeinen Listentyp namens „List[]“ verwenden. Diese Art von Liste ist zwar in der Verwendung etwas komplexer, da sie direkt aus C# stammt. Sobald Sie sie gemeistert haben, bietet sie jedoch viel mehr Flexibilität als die bisher besprochenen Arrays.
Zusätzlich zu den bisher erläuterten grundlegenden Funktionen gibt es auch eine Reihe von fortschrittlichen Array-Funktionen und einige weitere Features, über die Sie sich informieren sollten, wenn Sie häufiger mit Arrays arbeiten.
Die Standardmethode zum Erstellen von Arrays oben erstellt ein Array mit einer Größe, die durch die Anzahl der darin enthaltenen Elemente bestimmt wird. Sie können jedoch ein Array mit einer bestimmten Größe erstellen, indem Sie den Konstruktor „new($size)“ verwenden.
Das geht so:
$data = [Object[]]::new(4)
Wenn Sie eine „.count“- Abfrage für dieses Array ausführen, wird „4“ zurückgegeben. Denn obwohl es keine Daten enthält, wird es den freien Platz jeweils mit 0 füllen. Das ist eigentlich sehr nützlich, wenn Sie ein neues Array mit Nullen initialisieren möchten, da ein Array mit vorab festgelegter Größe gleich komplett damit gefüllt wird.
Die Multiplikation der Objekte – und insbesondere der Strings – in einem Array ist eine Aufgabe, die die meisten Menschen beim ersten Mal verwirrt. Wir haben schon extrem komplizierte „if()“-Skripte gesehen, um dieses Ziel zu erreichen. Es gibt jedoch eine deutlich einfachere Möglichkeit:
PS> $data = @('rot','gruen','blau') PS> $data * 3
Ja, das ist richtig. Dadurch wird ein neues Array erstellt, in dem jeder Wert dreimal wiederholt wird. Sie können diesen Befehl auch als Alternative verwenden, um ein Array mit Nullen (oder einem anderen Standardwert) zu füllen, indem Sie ein Array mit dem von Ihnen gewählten Wert erstellen und diesen dann beliebig oft multiplizieren.
Wie viele andere Programmiersprachen unterstützt auch PowerShell verschachtelte Arrays. Der Standard dafür in PowerShell sind mehrdimensionale Arrays. Das einfachste Beispiel hierfür ist die Erstellung eines zweidimensionalen Arrays:
$data = @(@(1,2,3),@(4,5,6),@(7,8,9)) $data2 = @( @(1,2,3), @(4,5,6), @(7,8,9) )
Die Datenstruktur, die Sie mit diesem Befehl erstellen, ist eine klassische Matrix, mit der Sie wie in anderen Programmiersprachen arbeiten können. Um beispielsweise auf einen bestimmten Wert aus diesem Array zuzugreifen, müssen Sie zwei Dimensionen angeben.
Auf den Wert „3“ können wir z. B. folgendermaßen zugreifen:
PS> $outside = 0 PS> $inside = 2 PS> $data[$outside][$inside] 3
Mit diesem Befehl kann dann auf jeden beliebigen Wert zugegriffen werden. Sie müssen jedoch verschachtelte Klammern hinzufügen, um in die jeweilige Ebene der Matrix zu gelangen.
Für Benutzer, die zum ersten Mal mit PowerShell arbeiten, waren das jetzt vielleicht sehr viele Informationen auf einmal, aber wir haben sie sehr sorgfältig ausgewählt, damit man die Sprache einfach lernen kann. Durch die Kombination dieser verschiedenen Techniken können Sie leistungsstarke Skripte erstellen, um viele gängige – und zeitaufwendige – Arbeiten mit PowerShell zu automatisieren.
Diese Fähigkeiten werden Ihnen auch über PowerShell hinaus helfen. Viele der gängigsten Sprachen für die Cybersicherheitsverwaltung, beispielsweise NetCat und Nmap, verwenden viele der gleichen Prinzipien wie PowerShell. Dementsprechend können Sie sehr gut lernen, wie Sie Ihre Systeme im Allgemeinen sichern, indem Sie PowerShell zur Verbesserung Ihrer Cybersicherheit verwenden.