Arrays
Arrays sind Listen von Objekten. Sie werden erzeugt, indem man mehrere Werte mit Komma voneinander getrennt einer Variablen zuweist:
$Namen = 'Hans','Franz','Otto','Karl'
Gibt man das Array wieder aus, erhält man die Namen untereinander ausgegeben, da es sich bei jedem String um ein einzelnes Element des Arrays handelt.
Powershell nummeriert die Elemente eines Arrays von Null aufsteigend durch. So wird jedem Eintrag ein "Name" gegeben. Im Prinzip verhält sich ein Array also wie eine zweispaltige Tabelle, wobei in der einen Spalte der Index oder Name des Objekts gespeichert ist, während in der zweiten Spalte ein Verweis auf das eigentliche Objekt hinterlegt ist:
|
Index |
Verweis |
|
0 |
'Hans' |
|
1 |
'Franz' |
|
2 |
'Otto' |
|
3 |
'Karl' |
Um auf einen einzelnen Wert in einem Array zuzugreifen, gibt man den Index des Eintrags an.
$Namen[1]
Franz
Um die Anzahl der Elemente in einem Array zu bestimmen, kann man auf die Eigenschaften Length oder die Alias-Eigenschaft Count zurückgreifen, über die jedes Array verfügt. Count ist dabei keine eigene Eigenschaft, sondern nur ein Verweis auf Length.
$Namen.Length
> 4
$Namen[$Namen.Length-1]
> Karl
$Namen[-1] # Gibt auch Karl zurück – wir zählen Rückwärts in das Array
> Karl
Wie man im Beispiel sieht, kann man das letzte Element des Arrays ausgeben, indem man in Klammern -1 angibt. Man zählt quasi rückwärts in das Array.
Wenn man ein einzelnes Element in einer Variablen speichert, erhält man kein Array. Um Powershell zu zwingen, auch einzelne Objekte immerin einem Array zu speichern, gibt es zwei Wege:
$Dateien = Get-Childitem C:\Test # Der Ordner Test beinhaltet nur eine Datei
$Dateien.Length # Das Ergebnis ist die Größe der Datei
> 3301
$Dateien = @( Get-ChildItem C:\Test ) # @() erzwingt die Konvertierung in ein Array
$Dateien.Length
> 1
[Array]$Dateien = Get-ChildItem C:\Test # Variable Typisieren
Das Erzwingen von Arrays macht immer Sinn, wenn man mehrere Objekte zurück erwartet. Im ersten Beispiel wird z.B. auf die Dateien eines Ordners zugegriffen und danach versucht, über die Eigenschaft Length des Arrays die Anzahl der Elemente anzuzeigen. Wenn aber nur eine einzelne Datei im Ordner liegt, ist die Eigenschaft Length eine Eigenschaft des Dateiobjekts und entspricht der der Größe der Datei und nicht der Zahl 1. Durch das Konvertieren bzw. Typisieren können Sie sicher sein, dass Length immer die Menge der Elemente im Array enthält.
Statt Powershell-Arrays können auch Arraylisten aus dem .Net-Framework verwendet werden, die über mehr Methoden verfügen und u.a. das Hinzufügen von neuen Datensätzen deutlich beschleunigen. Arrays werden nämlich mit einer festen Anzahl von Elementen erstellt und können nicht erweitert werden. Zum Erweitern eines Arrays muss Powershell deshalb immer ein neues Array erstellen und das alte Array dann in das Neue kopieren.
$Namen += "Holger" # Erweitert das Namensarray, ist aber langsam.
In diesem Beispiel wird dem Namen-Array ein weiterer Wert hinzugefügt. Das klappt, ist aber langsam.
Besser geht es mit einer Arrayliste:
# konvertieren in [system.collections.arrayList]
$NamenListe = [system.collections.arrayList]$Namen # $Array umwandeln und speichern
$NamenListe.insert(2,'Dirk') # Einen Datensatz an Position 3 (Index 2) einfügen # neu anlegen
[system.collection.arrayList]$ArrayListe