Informationen zu Arrays
Kurze Beschreibung
Beschreibt Arrays, bei denen es sich um Datenstrukturen handelt, die zum Speichern von Auflistungen von Elementen konzipiert sind.
Lange Beschreibung
Ein Array ist eine Datenstruktur, die zum Speichern einer Auflistung von Elementen konzipiert ist. Bei den Elementen kann es sich um denselben Typ oder um unterschiedliche Typen handeln.
Ab Windows PowerShell 3.0 weist eine Auflistung von null oder einem Objekt einige Eigenschaften von Arrays auf.
Erstellen und Initialisieren eines Arrays
Um ein Array zu erstellen und zu initialisieren, weisen Sie einer Variablen mehrere Werte zu. Die im Array gespeicherten Werte werden durch ein Komma getrennt und vom Variablennamen durch den Zuweisungsoperator (=) getrennt.
Geben Sie beispielsweise folgendes ein, um ein Array mit dem Namen $A zu erstellen, das die sieben numerischen Werte (int) 22, 5, 10, 8, 12, 9 und 80 enthält:
$A = 22,5,10,8,12,9,80
Sie können auch ein Array erstellen und initialisieren, indem Sie den Bereichsoperator (..) verwenden. Geben Sie beispielsweise Folgendes ein, um ein Array mit dem Namen "$B" zu erstellen und zu initialisieren, das die Werte 5 bis 8 enthält:
$B = 5..8
Daher enthält $B vier Werte: 5, 6, 7 und 8.
Wenn kein Datentyp angegeben wird, erstellt PowerShell jedes Array als Objektarray (Typ: System.Object[]). Verwenden Sie die GetType()-Methode, um den Datentyp eines Arrays zu bestimmen. Geben Sie beispielsweise Folgendes ein, um den Datentyp des $a Arrays zu bestimmen:
$a.GetType()
Um ein stark typisiertes Array zu erstellen, also ein Array, das nur Werte eines bestimmten Typs enthalten kann, wandeln Sie die Variable als Arraytyp um, z. B. string[], long[], oder int32[]. Um ein Array umzuschichten, stellen Sie dem Variablennamen einen Arraytyp voran, der in Klammern eingeschlossen ist. Um beispielsweise ein ganzzahliges 32-Bit-Array namens $ia mit vier ganzen Zahlen (1500, 2230, 3350 und 4000) zu erstellen, geben Sie Folgendes ein:
[int32[]]$ia = 1500,2230,3350,4000
Daher kann das $ia Array nur ganze Zahlen enthalten.
Sie können Arrays erstellen, die in einen beliebigen unterstützten Typ im Microsoft .NET Framework umgewandelt werden. Die Objekte, die Get-Process abrufen, um Prozesse darzustellen, sind beispielsweise vom Typ System.Diagnostics.Process. Geben Sie den folgenden Befehl ein, um ein stark typisiertes Array von Prozessobjekten zu erstellen:
[Diagnostics.Process[]]$zz = Get-Process
Der Arrayunterausdruckoperator
Der Arrayunterausdruckoperator erstellt ein Array, auch wenn es null oder ein Objekt enthält.
Die Syntax des Arrayoperators lautet wie folgt:
@( ... )
Sie können den Arrayoperator verwenden, um ein Array mit null oder einem Objekt zu erstellen. Beispiel:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
Der Arrayoperator ist besonders nützlich in Skripts, wenn Sie Objekte abrufen, aber nicht wissen, wie viele Objekte Sie erhalten. Beispiel:
$p = @(Get-Process Notepad)
Weitere Informationen zum Arrayunterausdruckoperator finden Sie unter about_Operators.
Zugreifen auf und Verwenden von Arrayelementen
Lesen eines Arrays
Sie können auf ein Array verweisen, indem Sie dessen Variablennamen verwenden. Geben Sie den Arraynamen ein, um alle Elemente im Array anzuzeigen. Angenommen, es handelt sich um $a
ein Array, das ganze Zahlen 0, 1, 2 bis 9 enthält; Eingabe:
$a
0
1
2
3
4
5
6
7
8
9
Sie können auf die Elemente in einem Array verweisen, indem Sie einen Index verwenden, der bei Position 0 beginnt. Schließen Sie die Indexnummer in Klammern ein. Geben Sie beispielsweise Folgendes ein, um das erste Element im $a
Array anzuzeigen:
$a[0]
0
Geben Sie Folgendes ein, um das $a
dritte Element im Array anzuzeigen:
$a[2]
2
Sie können einen Teil des Arrays mithilfe eines Bereichsoperators für den Index abrufen. Um beispielsweise die zweiten bis fünften Elemente des Arrays abzurufen, geben Sie Folgendes ein:
$a[1..4]
1
2
3
4
Anzahl negativer Zahlen vom Ende des Arrays. Beispielsweise bezieht sich "-1" auf das letzte Element des Arrays. Geben Sie folgendes ein, um die letzten drei Elemente des Arrays in aufsteigender Reihenfolge des Indexes anzuzeigen:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Wenn Sie negative Indizes in absteigender Reihenfolge eingeben, ändert sich Ihre Ausgabe.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Seien Sie jedoch vorsichtig, wenn Sie diese Notation verwenden. Die Notationszyklen von der Endgrenze bis zum Anfang des Arrays.
$a = 0 .. 9
$a[2..-2]
2
1
0
9
8
Außerdem besteht ein häufiger Fehler darin, davon auszugehen, dass $a[0..-2]
sich auf alle Elemente des Arrays mit Ausnahme des letzten bezieht. Es bezieht sich auf die ersten, letzten und vorletzten Elemente im Array.
Sie können den Plusoperator (+) verwenden, um einen Bereich mit einer Liste von Elementen in einem Array zu kombinieren. Geben Sie beispielsweise Folgendes ein, um die Elemente an den Indexpositionen 0, 2 und 4 bis 6 anzuzeigen:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Außerdem können Sie den Plusoperator verwenden, um mehrere Bereiche und einzelne Elemente aufzulisten. So listen Sie z. B. die Elemente null bis zwei, vier bis sechs und das Element an der achten Position ein:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Iterationen über Arrayelemente
Sie können auch Schleifenkonstrukte wie ForEach-, For- und While-Schleifen verwenden, um auf die Elemente in einem Array zu verweisen. Um beispielsweise eine ForEach-Schleife zum Anzeigen der Elemente im $a
Array zu verwenden, geben Sie Folgendes ein:
$a = 0..9
foreach ($element in $a) {
$element
}
0
1
2
3
4
5
6
7
8
9
Die Foreach-Schleife durchläuft das Array und gibt jeden Wert im Array zurück, bis das Ende des Arrays erreicht wird.
Die For-Schleife ist nützlich, wenn Sie Zähler erhöhen, während Sie die Elemente in einem Array untersuchen. Wenn Sie beispielsweise eine For-Schleife verwenden möchten, um jeden anderen Wert in einem Array zurückzugeben, geben Sie Folgendes ein:
$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
$a[$i]
}
0
2
4
6
8
Sie können eine While-Schleife verwenden, um die Elemente in einem Array anzuzeigen, bis eine definierte Bedingung nicht mehr zutrifft. Geben Sie beispielsweise Folgendes ein, um die Elemente im $a
Array anzuzeigen, während der Arrayindex kleiner als 4 ist:
$a = 0..9
$i=0
while($i -lt 4) {
$a[$i];
$i++
}
0
1
2
3
Eigenschaften von Arrays
Count oder Length oder LongLength
Um zu bestimmen, wie viele Elemente sich in einem Array befinden, verwenden Sie die -Eigenschaft oder den Length
zugehörigen Count
Alias. Longlength
ist nützlich, wenn das Array mehr als 2.147.483.647 Elemente enthält.
$a = 0..9
$a.Count
$a.Length
10
10
Rang
Gibt die Anzahl der Dimensionen des Arrays zurück. Die meisten Arrays in PowerShell weisen nur eine Dimension auf. Auch wenn Sie denken, dass Sie ein mehrdimensionales Array erstellen; wie im folgenden Beispiel:
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
Das Erstellen eines wirklich mehrdimensionalen Arrays in PowerShell erfordert die Unterstützung von .NET Framework. Wie im folgenden Beispiel:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Methoden von Arrays
Clear
Legt alle Elementwerte auf den Standardwert des Elementtyps des Arrays fest. Die Clear()-Methode setzt die Größe des Arrays nicht zurück.
Im folgenden Beispiel $a
ist ein Array von -Objekten dargestellt.
$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True
In diesem Beispiel wird explizit eingegeben, $intA
um ganze Zahlen zu enthalten.
[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0
ForEach
Ermöglicht das Durchlaufen aller Elemente im Array und das Ausführen eines bestimmten Vorgangs für jedes Element des Arrays.
Die ForEach-Methode verfügt über mehrere Überladungen, die unterschiedliche Vorgänge ausführen.
ForEach(scriptblock expression)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)
ForEach(scriptblock-Ausdruck)
ForEach(scriptblock expression, object[] arguments)
Hinweis
Die Syntax erfordert die Verwendung eines Skriptblocks. Klammern sind optional.
Das folgende Beispiel zeigt, wie die foreach-Methode verwendet wird. In diesem Fall besteht die Absicht darin, den Quadratwert der Elemente im Array zu generieren.
Beachten Sie, dass diese Methode in PowerShell v4 hinzugefügt wurde und in den darunter liegenden Versionen nicht verfügbar ist. Verwenden Sie für frühere Versionen die Pipelining-Methode zum ForEach-Object Cmdlet.
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Genau wie der -ArgumentList
Parameter von ForEach-Object
ermöglicht der arguments
Parameter die Übergabe eines Arrays von Argumenten an einen Skriptblock, der für die Annahme dieser Argumente konfiguriert ist.
ForEach(type convertToType)
Die ForEach
-Methode kann verwendet werden, um die Elemente schnell in einen anderen Typ umzuwandeln. Im folgenden Beispiel wird gezeigt, wie eine Liste von Zeichenfolgendaten in einen [DateTime]
Typ konvertiert wird.
@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])
Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
Die ForEach
-Methode kann auch verwendet werden, um Eigenschaftswerte für jedes Element in der Auflistung schnell abzurufen oder festzulegen.
# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
Schließlich können Methoden verwendet werden, ForEach
um eine Methode für jedes Element in der Auflistung auszuführen.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Genau wie der -ArgumentList
Parameter von ForEach-Object
ermöglicht der arguments
Parameter die Übergabe eines Arrays von Argumenten an einen Skriptblock, der für deren Annahme konfiguriert ist.
Hinweis
Ab Windows PowerShell 3.0 können Eigenschaften und Ausführungsmethoden für jedes Element in einer Auflistung auch mithilfe von "Methoden von Skalarobjekten und Auflistungen" abgerufen werden. Weitere Informationen dazu finden Sie hier about_methods
Hierbei gilt:
Ermöglicht das Filtern oder Auswählen der Elemente des Arrays. Das Skript muss auf einen anderen Wert als null (0), leere Zeichenfolge $false
oder $null
für das Element, das nach dem angezeigt wird, ausgewertet werden. Where
Es gibt eine Definition für die Where
-Methode.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
ist Expression
ein skriptblock, der für die Filterung erforderlich ist, das mode
optionale Argument ermöglicht zusätzliche Auswahlfunktionen, und das numberToReturn
optionale Argument ermöglicht die Möglichkeit, die Anzahl der elemente zu begrenzen, die vom Filter zurückgegeben werden.
Hinweis
Die Syntax erfordert die Verwendung eines Skriptblocks. Klammern sind optional.
Das folgende Beispiel zeigt, wie Sie alle ungeraden Zahlen aus dem Array auswählen.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
Die folgenden Auswahlmodi sind verfügbar.
Standard
Der Default
Modus filtert Elemente mithilfe des Expression
Skriptblocks.
Wenn ein numberToReturn
bereitgestellt wird, wird die maximale Anzahl von Elementen angegeben, die zurückgegeben werden sollen.
# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)
Hinweis
Sowohl der Modus als First
auch der Default
Modus geben die ersten (numberToReturn
) Elemente zurück und können austauschbar verwendet werden.
Letzter
$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)
SkipUntil
Der SkipUntil
Modus überspringt alle Objekte in einer Auflistung, bis ein Objekt den Skriptblockausdrucksfilter übergibt. Anschließend werden ALLE verbleibenden Sammlungselemente zurückgegeben, ohne sie zu testen. Es wird nur ein bestandenes Element getestet.
Dies bedeutet, dass die zurückgegebene Auflistung sowohl übergebende als auch nicht übergebende Elemente enthält, die NICHT getestet wurden.
Die Anzahl der zurückgegebenen Elemente kann begrenzt werden, indem ein Wert an das numberToReturn
Argument übergeben wird.
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
Until
Der Until
Modus invertiert den SkipUntil
Modus. Es gibt ALLE Elemente in einer Auflistung zurück, bis ein Element den Skriptblockausdruck übergibt. Sobald ein Element den scriptblock-Ausdruck übergibt , beendet die Methode die Where
Verarbeitung von Elementen.
Dies bedeutet, dass Sie den ersten Satz nicht übergebener Elemente von der Where
-Methode erhalten. Nachdem ein Element bestanden wurde, wird der Rest WEDER getestet noch zurückgegeben.
Die Anzahl der zurückgegebenen Elemente kann begrenzt werden, indem ein Wert an das numberToReturn
Argument übergeben wird.
# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10
Hinweis
SkipUntil
Sowohl als auch Until
arbeiten unter der Prämisse, dass KEIN Batch von Elementen getestet wird.
Until
gibt die Elemente VOR dem ersten Durchlauf zurück.
SkipUntil
gibt alle Elemente nach dem ersten Durchlauf zurück, einschließlich des ersten Übergebens.
Split
Im Split
Modus werden Sammlungselemente in zwei separate Auflistungen aufgeteilt oder gruppiert. Diejenigen, die den scriptblock-Ausdruck übergeben, und diejenigen, die dies nicht tun.
Wenn angegeben numberToReturn
wird, enthält die erste Auflistung die übergebenden Elemente, die den angegebenen Wert nicht überschreiten.
Die verbleibenden Objekte, auch diejenigen, die den Ausdrucksfilter übergeben , werden in der zweiten Auflistung zurückgegeben.
$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status Name DisplayName
------ ---- -----------
Running Appinfo Application Information
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
...
$stopped
Status Name DisplayName
------ ---- -----------
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Stopped AppIDSvc Application Identity
...
Abrufen der Member eines Arrays
Verwenden Sie den InputObject-Parameter des Cmdlets Get-Member, um die Eigenschaften und Methoden eines Arrays abzurufen, z. B. die Length-Eigenschaft und die SetValue-Methode.
Wenn Sie ein Array an Get-Member
übergeben, sendet PowerShell die Elemente einzeln und Get-Member
gibt den Typ jedes Elements im Array zurück (Duplikate werden ignoriert).
Wenn Sie den Parameter -InputObject verwenden, Get-Member
gibt die Member des Arrays zurück.
Der folgende Befehl ruft beispielsweise die Member der $a
Arrayvariablen ab.
Get-Member -InputObject $a
Sie können die Member eines Arrays auch abrufen, indem Sie ein Komma (,) vor dem Wert eingeben, der an das Cmdlet Get-Member übergeben wird. Das Komma macht das Array zum zweiten Element in einem Array von Arrays. Windows PowerShell leitet die Arrays einzeln weiter, und Get-Member gibt die Member des Arrays zurück. Wie in den nächsten beiden Beispielen.
,$a | Get-Member
,(1,2,3) | Get-Member
Bearbeiten eines Arrays
Sie können die Elemente in einem Array ändern, einem Array ein Element hinzufügen und die Werte aus zwei Arrays in einem dritten Array kombinieren.
Um den Wert eines bestimmten Elements in einem Array zu ändern, geben Sie den Arraynamen und den Index des Elements an, das Sie ändern möchten, und verwenden Sie dann den Zuweisungsoperator (=), um einen neuen Wert für das Element anzugeben. Um beispielsweise den Wert des zweiten Elements im Array (Indexposition 1) in $a
10 zu ändern, geben Sie Folgendes ein:
$a[1] = 10
Sie können auch die SetValue-Methode eines Arrays verwenden, um einen Wert zu ändern. Im folgenden Beispiel wird der zweite Wert (Indexposition 1) des $a
Arrays in 500 geändert:
$a.SetValue(500,1)
Sie können den Operator += verwenden, um einem Array ein Element hinzuzufügen. Das folgende Beispiel zeigt, wie Sie dem $a
Array ein Element hinzufügen.
$a = @(0..4)
$a += 5
Hinweis
Wenn Sie den +=
Operator verwenden, erstellt PowerShell tatsächlich ein neues Array mit den Werten des ursprünglichen Arrays und dem hinzugefügten Wert. Dies kann zu Leistungsproblemen führen, wenn der Vorgang mehrmals wiederholt wird oder die Größe des Arrays zu groß ist.
Es ist nicht einfach, Elemente aus einem Array zu löschen, aber Sie können ein neues Array erstellen, das nur ausgewählte Elemente eines vorhandenen Arrays enthält. Um beispielsweise das $t
Array mit allen Elementen im $a
Array mit Ausnahme des Werts an Indexposition 2 zu erstellen, geben Sie Folgendes ein:
$t = $a[0,1 + 3..($a.length - 1)]
Um zwei Arrays in einem einzelnen Array zu kombinieren, verwenden Sie den Plusoperator (+). Im folgenden Beispiel werden zwei Arrays erstellt, kombiniert und dann das resultierende kombinierte Array angezeigt.
$x = 1,3
$y = 5,9
$z = $x + $y
Daher enthält das $z
Array 1, 3, 5 und 9.
Um ein Array zu löschen, weisen Sie dem Array den Wert $null zu. Der folgende Befehl löscht das Array in der $a
Variablen.
$a = $null
Sie können auch das Remove-Item
Cmdlet verwenden, aber das Zuweisen des Werts von $null
ist schneller, insbesondere für große Arrays.
Arrays von 0 oder 1
Ab Windows PowerShell 3.0 verfügt eine Auflistung von 0 oder einem Objekt über die Count- und Length-Eigenschaft. Außerdem können Sie in einem Array eines Objekts indiziert werden. Dieses Feature hilft Ihnen, Skriptfehler zu vermeiden, die auftreten, wenn ein Befehl, der eine Sammlung erwartet, weniger als zwei Elemente erhält.
Die folgenden Beispiele veranschaulichen dieses Feature.
Null-Objekte
$a = $null
$a.Count
$a.Length
0
0
Ein Objekt
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4