PowerShell-Arrays, ArrayLists & Collections: bewährte Methoden

Oftentimes, wenn Sie PowerShell-Skripte schreiben, benötigen Sie eine Möglichkeit, eine Gruppe von Elementen zu speichern. Eine häufige Methode, dies zu erreichen, ist die Verwendung eines Arrays oder eines spezifischen Typs, der als ArrayList bezeichnet wird. Aber was ist überhaupt ein Array? Ein Array ist eine Datenstruktur, die entwickelt wurde, um eine Sammlung von Elementen zu speichern. Dies kann sowohl gleiche als auch unterschiedliche Arten von Elementen umfassen.

Arrays werden in vielen verschiedenen Programmiersprachen verwendet, und PowerShell macht da keine Ausnahme. Es gibt viele Möglichkeiten, Arrays zu erstellen, zu manipulieren und zu optimieren. In diesem Artikel erfahren Sie mehr über ArrayLists, Arrays und Collections sowie bewährte Methoden bei ihrer Anwendung mit PowerShell.

Voraussetzungen/Anforderungen

Da Sie nur mit der PowerShell-Sprache selbst arbeiten, gibt es keine Umgebungsanforderungen. Sie benötigen lediglich einen Windows-PC mit PowerShell. Genauer gesagt:

  • Windows PowerShell 3 oder höher
  • .NET Framework 4.5 oder höher

Möchten Sie mehr Tipps wie diesen erhalten? Besuchen Sie meinen persönlichen PowerShell-Blog unter: https://nkasco.com/FriendsOfATA

Arrays erstellen mit PowerShell

Es gibt viele verschiedene Möglichkeiten, Arrays mit PowerShell zu erstellen. Nehmen wir an, Sie haben eine Liste von Namen, die Sie auf irgendeine Weise verarbeiten müssen, wie unten gezeigt.

John
Susie
Jim
Johnny
Carrie

Arrays über kommagetrennte Elemente erstellen

Die einfachste Möglichkeit, ein Array zu erstellen, besteht darin, bekannte Eingaben kommagetrennt einer Variablen zuzuweisen, wie unten gezeigt.

$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"

Wenn Sie die GetType()-Methode verwenden, die für alle Objekte in PowerShell verfügbar ist, sehen Sie, dass Sie erfolgreich ein Array erstellt haben, wie durch die BaseType-Eigenschaft unten angezeigt wird.

PS51> $BasicArray.GetType()

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     Object[]                                 System.Array

Durch Verwendung des Sub-Ausdrucksoperators

Sie können auch Arrays in PowerShell mit dem Sub-Ausdrucksoperator erstellen. Dieses Konzept wird häufig verwendet, wenn Sie nicht wissen, wie viele Elemente zu Ihrem Array hinzugefügt werden. Das Ergebnis kann null oder viele Elemente enthalten, wenn es erstellt wird.

Beachten Sie unten, dass ein Array namens $MyArray mit null Elementen erstellt wurde.

#Erstellen Sie ein leeres Array mit dem Sub-Ausdrucksoperator
PS51> $MyArray = @()
PS51> $MyArray.count
0

Verwendung des Bereichsoperators

Arrays sind nicht nur auf das Speichern von Zeichenfolgen beschränkt, wie oben gezeigt. Sie können auch Arrays mit anderen Objekttypen wie Ganzzahlen erstellen.

Wenn Sie ein Array von Ganzzahlen in aufsteigender Reihenfolge benötigen, können Sie eine Abkürzung verwenden und den Bereichsoperator .. nutzen. Unten sehen Sie ein Array, das mit den Ganzzahlen 2 bis 5 mit nur einer Codezeile erstellt wurde.

PS51> $NumberedArray = 2..5
PS51> $NumberedArray
2
3
4
5

Erstellen von PowerShell ArrayList-Sammlungen

Die Verwendung einer PowerShell ArrayList ist ebenfalls eine Möglichkeit, eine Liste von Elementen mit PowerShell zu speichern. Die ArrayList-Klasse gehört zum System.Collections-Namespace in .NET. Durch das Erstellen eines neuen Objekts dieses Typs können Sie dann Objekte in einer ArrayList speichern.

Unten sehen Sie, dass Sie explizit ein ArrayList-Objekt erstellen müssen, indem Sie das New-Object-Cmdlet verwenden oder ein Standardarray in ein ArrayList-Objekt umwandeln.

Beachten Sie, dass in diesem Fall der BaseType ein Objekt ist, während die obigen Beispiele Arrays als BaseType haben, die von der Klasse Object erben. Letztendlich bietet PowerShell Zugriff auf das .NET-Typsystem.

PS51> $MyArrayList = New-Object -TypeName "System.Collections.ArrayList"
# Das Umwandeln eines Arrays in ein ArrayList ist auch eine mögliche Option
PS51> $MyArrayList = [System.Collections.ArrayList]@()
PS51> $MyArrayList.GetType()

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     ArrayList                                System.Object

Hinzufügen von Elementen zu einem Array

Beim Erstellen eines Arrays können Sie entweder alle Elemente zur Erstellungszeit definieren oder sie nach Bedarf hinzufügen.

Um Elemente zu einer vorhandenen Sammlung hinzuzufügen, können Sie den +=-Operator oder die Add-Methode verwenden. Beachten Sie jedoch, dass es wesentliche Unterschiede in ihrer Funktionsweise gibt.

Wenn Sie ein Standardarray mit @() erstellen, verwenden Sie den +=-Operator. Um jedoch Elemente zu einem ArrayList hinzuzufügen, verwenden Sie die Add-Methode. Diese Methoden unterscheiden sich darin, dass der +=-Operator das vorhandene Array tatsächlich zerstört und ein neues Array mit dem neuen Element erstellt.

Um dies zu demonstrieren, können Sie unten die IsFixedSize-Eigenschaft für ein Array oder ArrayList überprüfen, um zu erfahren, welches unveränderlich ist und welches nicht.

PS51> $BasicArray.IsFixedSize
True

PS51> $MyArrayList.IsFixedSize
False

Da ein einfaches Array eine Sammlung mit fester Größe ist, können Sie es nicht ändern.

Der Versuch, die Add()-Methode mit einem Array mit fester Größe zu verwenden, führt aufgrund der festen Größe zu einem Fehler. Im Folgenden finden Sie einige Beispiele, bei denen Sie erfolgreich Elemente zu einem Array hinzufügen können.

#Funktioniert NICHT
$BasicArray.Add("Nate")

#Funktioniert
$BasicArray += "Nate"
$MyArrayList.Add("Nate")
$MyArrayList += "Nate"

Entfernen von Elementen aus einem Array

Jetzt, da Sie ein besseres Verständnis dafür haben, wie man Elemente zu einem Array hinzufügt, wollen wir einige Möglichkeiten betrachten, wie Sie Elemente aus einem Array entfernen können.

Da ein grundlegendes Array fest ist, können Sie keine Elemente daraus entfernen. Stattdessen müssen Sie ein völlig neues Array erstellen. Zum Beispiel können Sie ein einzelnes Element aus einem Array entfernen, indem Sie eine bedingte Anweisung erstellen, die nur die Elemente auswählt, die Sie behalten möchten. Ein Beispiel wird unten gezeigt.

$NewBasicArray = $BasicArray -ne "Nate"

Da eine ArrayList nicht fest ist, können Sie Elemente mithilfe der Remove()-Methode daraus entfernen. Dies ist ein Szenario, in dem Ihnen die Verwendung einer ArrayList zugutekommen kann, wenn Sie häufig Elemente hinzufügen/entfernen möchten.

$MyArrayList.Remove("Nate")

Abrufen bestimmter Elemente aus einem Array oder einer ArrayList

Um bestimmte Elemente aus einem Array oder einer ArrayList abzurufen, können Sie verschiedene Methoden verwenden. Ähnlich wie bei anderen Objekten in PowerShell können Sie auf alle Elemente eines Arrays zugreifen, indem Sie einfach das Objekt aufrufen.

PS51> $BasicArray
John
Susie
Jim
Johnny
Carrie

Vielleicht müssen Sie nur das erste Element abrufen. Arrays haben immer einen Ursprung von 0, der das erste Element des Arrays darstellt. Um das erste Element eines Arrays abzurufen, geben Sie die Indexnummer in eckigen Klammern an, wie unten gezeigt.

PS51> $BasicArray[0]
John

Umgekehrt können Sie auch auf Indizes rückwärts verweisen, indem Sie einen Bindestrich (negativen Indikator) verwenden, um die letzten X Elemente des Arrays aufzurufen. Eine häufige Methode, um das letzte Element in einem Array zu finden, ist die Verwendung von -1 wie unten gezeigt.

PS51> $BasicArray[-1]
Carrie

Der oben erwähnte Bereichsoperator kann auch verwendet werden, um Objekte eines Arrays abzurufen, indem Sie dieselbe Methode zum Aufrufen der Elemente verwenden. Angenommen, Sie möchten die ersten vier Namen im Array $BasicArray abrufen.

Wie unten gezeigt, können Sie einen Bereich von Indizes 0-3 angeben, der die ersten vier Elemente zurückgibt.

PS51> $BasicArray[0..3]
John
Susie
Jim
Johnny

Optimierung von Arrays mit PowerShell

Jetzt, da Sie eine solide Grundlage dafür haben, wie man Arrays erstellt und manipuliert, welche Methode sollten Sie verwenden? Um das zu beantworten, schauen wir uns einige Beispiele mit dem Befehl Measure-Command an. Mit dem Befehl Measure-Command werden Sie besser verstehen, wie lange Befehle benötigen, um Elemente zu verarbeiten, während sie durch die Pipeline weitergegeben werden.

Im Allgemeinen werden Sie bei einer kleinen Sammlung von Objekten wahrscheinlich keinen großen Unterschied bemerken, wie Sie Ihre Arrays manipulieren. Wenn Sie jedoch eine große Sammlung von Objekten haben, ist es wichtig, die Unterschiede zu verstehen, um optimale Ergebnisse zu erzielen.

Wenden wir nun das an, was Sie gerade im vorherigen Abschnitt gelernt haben, über den Unterschied zwischen += und der Verwendung der Add()-Methode mit einer Schleife von 50.000 Elementen.

Erstellen Sie zunächst ein leeres Array und eine leere ArrayList wie unten gezeigt.

PS51> $MyArray = @()
PS51> $MyArrayList = [System.Collections.ArrayList]@()

Füllen Sie dann jede Sammlung mit 50.000 Elementen mithilfe des Bereichsoperators und einer foreach-Schleife wie unten gezeigt.

@(0..50000).foreach({$MyArray += $_})
@(0..50000).foreach({$MyArrayList.Add($_)})

Schließlich umgeben Sie Ihre Befehle mit einem Ausdruck und übergeben diesen Ausdruck dem Befehl Measure-Command. Durch Ausführen des Ausdrucks mit Measure-Command können Sie sehen, wie lange jeder Vorgang tatsächlich dauert.

Bedenken Sie, dass, wie Sie zuvor gelernt haben, += tatsächlich ein neues Array erstellt anstatt an ein festes anzufügen.

PS51> Measure-Command -Expression {@(0..50000).foreach({$MyArray += $_})}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 59
Milliseconds      : 58
Ticks             : 590585963
TotalDays         : 0.000683548568287037
TotalHours        : 0.0164051656388889
TotalMinutes      : 0.984309938333333
TotalSeconds      : 59.0585963
TotalMilliseconds : 59058.5963

PS51> Measure-Command -Expression {@(0..50000).foreach({$MyArrayList.Add($_)})}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 139
Ticks             : 1399989
TotalDays         : 1.62035763888889E-06
TotalHours        : 3.88885833333333E-05
TotalMinutes      : 0.002333315
TotalSeconds      : 0.1399989
TotalMilliseconds : 139.9989

Das Ergebnis? Fast 60 Sekunden im Vergleich zu 139 Millisekunden!

Wie Sie sehen können, ist es wesentlich schneller, eine ArrayList für große Sammlungen zu verwenden, anstatt ein Array mit fester Größe zu nutzen.

Obwohl dies ein einfaches Beispiel ist, betont es die Bedeutung des Verständnisses dessen, was Ihr Code während der Verarbeitung tut. Wenn es nicht richtig verstanden wird, kann dies zu einer schlechten Benutzererfahrung führen.

Wenn Sie bereits vorhandenes Skript haben, das von der Verwendung einer ArrayList anstelle eines Arrays profitieren könnte, bietet sich hier eine fantastische Möglichkeit, eine sofortige Verbesserung zu erzielen!

Weiterführende Informationen

Möchten Sie weitere Tipps wie diesen? Schauen Sie sich meinen persönlichen PowerShell-Blog unter https://nkasco.com/FriendsOfATA an.

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