about_Arrays

Kurze Beschreibung

Beschreibt Arrays, die Datenstrukturen sind, die zum Speichern von Sammlungen von Elementen konzipiert sind.

Lange Beschreibung

Ein Array ist eine Datenstruktur, die zum Speichern einer Auflistung von Elementen konzipiert ist. Die Elemente können denselben Typ oder verschiedene Typen sein.

Ab Windows PowerShell 3.0 verfügt eine Auflistung von Null oder ein Objekt über einige Eigenschaften von Arrays.

Erstellen und Initialisieren eines Arrays

Um ein Array zu erstellen und zu initialisieren, weisen Sie mehreren Werten eine Variable zu. Die im Array gespeicherten Werte werden mit einem Komma getrennt und durch den Variablennamen durch den Zuordnungsoperator (=) getrennt.

Wenn Sie beispielsweise ein Array $A erstellen möchten, das die sieben numerischen Werte (Int) von 22, 5, 10, 8, 12, 9 und 80 enthält, geben Sie folgendes ein:

$A = 22,5,10,8,12,9,80

Das Komma kann auch verwendet werden, um ein einzelnes Elementarray zu initialisieren, indem das Komma vor dem einzelnen Element platziert wird.

Wenn Sie beispielsweise ein einzelnes Elementarray $B mit dem einzelnen Wert von 7 erstellen möchten, geben Sie folgendes ein:

$B = ,7

Sie können auch ein Array mithilfe des Bereichsoperators (..) erstellen und initialisieren. Im folgenden Beispiel wird ein Array erstellt, das die Werte 5 bis 8 enthält.

$C = 5..8

$C Daher sind vier Werte enthalten: 5, 6, 7 und 8.

Wenn kein Datentyp angegeben wird, erstellt PowerShell jedes Array als Objektarray (System.Object[]). Um den Datentyp eines Arrays zu bestimmen, verwenden Sie die GetType() -Methode. Um beispielsweise den Datentyp des $A Arrays zu bestimmen, geben Sie Folgendes ein:

$A.GetType()

Um ein stark typiertes Array zu erstellen, also ein Array, das nur Werte eines bestimmten Typs enthalten kann, casten Sie die Variable als Arraytyp, z. B. string[], long[]oder int32[]. Um ein Array zu casten, gehen Sie vor dem Variablennamen mit einem Arraytyp, der in Klammern eingeschlossen ist. Wenn Sie beispielsweise ein 32-Bit-Ganzzahlarray $ia mit vier ganzzahligen Zahlen (1500, 2230, 3350 und 4000) erstellen möchten, 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 jeden unterstützten Typ im .NET gecastet werden. Die Objekte, Get-Process die zum Darstellen von Prozessen abgerufen werden, sind beispielsweise der Typ "System.Diagnostics.Process ". Geben Sie zum Erstellen eines stark typierten Arrays von Prozessobjekten den folgenden Befehl ein:

[Diagnostics.Process[]]$zz = Get-Process

Der Array-Unterausdrucksoperator

Der Array-Unterausdruck-Operator erstellt ein Array aus den Anweisungen darin. Unabhängig davon, welche Anweisung innerhalb des Operators erzeugt wird, platziert der Operator es in einem Array. Selbst wenn null oder ein Objekt vorhanden ist.

Die Syntax des Arrayoperators lautet wie folgt:

@( ... )

Sie können den Arrayoperator verwenden, um ein Array von Null oder ein Objekt zu erstellen. Zum Beispiel:

$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0

Der Arrayoperator ist nützlich in Skripts, wenn Sie Objekte abrufen, aber nicht wissen, wie viele Objekte Sie erhalten. Zum Beispiel:

$p = @(Get-Process Notepad)

Weitere Informationen zum Array-Unterausdruck-Operator finden Sie unter about_Operators.

Zugreifen auf und Verwenden von Arrayelementen

Lesen eines Arrays

Sie können auf ein Array verweisen, indem Sie den Variablennamen verwenden. Geben Sie den Arraynamen ein, um alle Elemente im Array anzuzeigen. Angenommen $a , es handelt sich um ein Array mit ganzzahligen Zahlen 0, 1, 2, bis 9; 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, beginnend mit Position 0. Schließen Sie die Indexnummer in Klammern ein. Wenn Sie beispielsweise das erste Element im $a Array anzeigen möchten, geben Sie folgendes ein:

$a[0]
0

Geben Sie zum Anzeigen des dritten Elements im $a Array Folgendes ein:

$a[2]
2

Sie können einen Teil des Arrays mithilfe eines Bereichsoperators für den Index abrufen. Wenn Sie beispielsweise die zweiten bis fünften Elemente des Arrays abrufen möchten, geben Sie Folgendes ein:

$a[1..4]
1
2
3
4

Negative Zahlenanzahl vom Ende des Arrays. Beispielsweise bezieht sich "-1" auf das letzte Element des Arrays. Geben Sie zum Anzeigen der letzten drei Elemente des Arrays in aufsteigender Reihenfolge folgendes ein:

$a = 0 .. 9
$a[-3..-1]
7
8
9

Wenn Sie negative Indizes in absteigender Reihenfolge eingeben, ändert sich die Ausgabe.

$a = 0 .. 9
$a[-1..-3]
9
8
7

Beachten Sie jedoch vorsichtig, wenn Sie diese Notation verwenden. Die Notation zyklen von der Endgrenze bis zum Anfang des Arrays.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

Auch ein allgemeiner Fehler besteht $a[0..-2] darin, darauf zu verweisen, dass alle Elemente des Arrays mit Ausnahme der letzten elemente verwendet werden. Es bezieht sich auf die ersten, letzten und letzten Elemente im Array.

Sie können den Plusoperator (+) verwenden, um einen Bereich mit einer Liste der Elemente in einem Array zu kombinieren. Wenn Sie beispielsweise die Elemente an Indexpositionen 0, 2 und 4 bis 6 anzeigen möchten, geben Sie folgendes ein:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

Um auch mehrere Bereiche und einzelne Elemente auflisten zu können, können Sie den Plusoperator verwenden. Wenn Sie beispielsweise Elemente null bis zwei, vier bis sechs auflisten möchten, und das Element bei acht Positionaltyp:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iterationen über Arrayelemente

Sie können auch Schleifenkonstrukte verwenden, z ForEach. B. , Forund While Schleifen, um auf die Elemente in einem Array zu verweisen. Wenn Sie beispielsweise eine ForEach Schleife verwenden möchten, um die Elemente im $a Array anzuzeigen, 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 wird durch das Array durchlaufen 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 beim Untersuchen der Elemente in einem Array inkrementieren. 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 wahr ist. Wenn Sie beispielsweise die Elemente im $a Array anzeigen möchten, während der Arrayindex kleiner als 4 ist, geben Sie folgendes ein:

$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 in einem Array enthalten sind, verwenden Sie die Length Eigenschaft oder den Alias Count . 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

Rank

Gibt die Anzahl der Dimensionen des Arrays zurück. Die meisten Arrays in PowerShell verfügen nur über eine Dimension. Selbst wenn Sie denken, dass Sie ein mehrdimensionales Array wie das folgende Beispiel erstellen:

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

In diesem Beispiel erstellen Sie ein eindimensionales Array, das andere Arrays enthält. Dies wird auch als gezacktes Array bezeichnet. Die Rank Eigenschaft hat bewiesen, dass dies eindimensional ist. Um auf Elemente in einem gezackten Array zuzugreifen, muss sich die Indizes in separaten Klammern befinden ([]).

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

Mehrdimensionale Arrays werden in Zeilen-Hauptreihenfolge gespeichert. Im folgenden Beispiel wird gezeigt, wie Sie ein wirklich mehrdimensionales Array erstellen.

[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

Um auf Elemente in einem mehrdimensionalen Array zuzugreifen, trennen Sie die Indizes mithilfe eines Kommas () innerhalb einer einzelnen Gruppe von Klammern (,[]).

Einige Vorgänge auf einem mehrdimensionalen Array, z. B. Replikation und Verketteung, erfordern, dass dieses Array abgeflacht werden soll. Durch die Abschärfung wird das Array in ein 1-dimensionales Array mit unkonstrainierten Typen umgewandelt. Das resultierende Array übernimmt alle Elemente in zeilengerichteter Reihenfolge. Betrachten Sie das folgenden Beispiel:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

Die Ausgabe zeigt, dass es sich um ein 1dimensionales Array handelt, $c das die Elemente aus $a und $b in Zeilen-Hauptreihenfolge enthält.

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

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 handelt es sich um ein Array von Objekten.

$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 es, alle Elemente im Array zu iterieren und einen bestimmten Vorgang für jedes Element des Arrays auszuführen.

Die ForEach Methode verfügt über mehrere Überladungen, die unterschiedliche Vorgänge ausführen.

ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(Skriptblockausdruck)

ForEach(Skriptblockausdruck, Objekt[] Argumente)

Diese Methode wurde in PowerShell v4 hinzugefügt.

Hinweis

Die Syntax erfordert die Verwendung eines Skriptblocks. Klammern sind optional, wenn der Skriptblock der einzige Parameter ist. Außerdem darf es keinen Abstand zwischen der Methode und der öffnenden Klammer oder geschweiften Geschweifte geben.

Das folgende Beispiel zeigt, wie die ForEach Methode verwendet wird. In diesem Fall soll der Quadratwert der Elemente im Array generiert werden.

$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 konfiguriert ist.

Weitere Informationen zum Verhalten von ArgumentList finden Sie unter about_Splatting.

ForEach(Typ 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 Zeichenfolgenterminen in [DateTime] den 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 schnell abzurufen oder Eigenschaftswerte für jedes Element in der Auflistung 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)

Lastly, Methoden können 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 Werten an einen Skriptblock, der für die Annahme konfiguriert ist.

Hinweis

Ab Windows PowerShell 3.0 können Eigenschaften abgerufen und Methoden für jedes Element in einer Auflistung ausgeführt werden, auch mithilfe von "Methoden von Skalarobjekten und Auflistungen". Weitere Informationen dazu finden Sie hier about_methods.

Hierbei gilt:

Ermöglicht das Filtern oder Auswählen der Elemente des Arrays. Das Skript muss alle anderen Werte als null (0), leere Zeichenfolge $false oder $null für das Element, das nach dem WhereElement angezeigt werden soll, auswerten. Weitere Informationen zur booleschen Auswertung finden Sie unter about_Booleans.

Es gibt eine Definition für die Where Methode.

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

Hinweis

Die Syntax erfordert die Verwendung eines Skriptblocks. Klammern sind optional, wenn der Skriptblock der einzige Parameter ist. Außerdem darf es keinen Abstand zwischen der Methode und der öffnenden Klammer oder geschweiften Geschweifte geben.

Dies Expression ist Skriptblock, der zum Filtern erforderlich ist, das mode optionale Argument ermöglicht zusätzliche Auswahlfunktionen, und das numberToReturn optionale Argument ermöglicht die Möglichkeit, zu begrenzen, wie viele Elemente aus dem Filter zurückgegeben werden.

Die zulässigen Werte sind mode :

  • Default (0) - Alle Elemente zurückgeben
  • First (1) - Zurückgeben des ersten Elements
  • Last (2) – Zurückgeben des letzten Elements
  • SkipUntil (3) – Elemente überspringen, bis die Bedingung wahr ist, geben alle verbleibenden Elemente zurück (einschließlich des ersten Elements, für das die Bedingung wahr ist)
  • Until (4) – Zurückgeben aller Elemente, bis die Bedingung wahr ist
  • Split (5) – Zurückgeben eines Arrays von zwei Elementen
    • Das erste Element enthält übereinstimmende Elemente.
    • Das zweite Element enthält die verbleibenden Elemente.

Das folgende Beispiel zeigt, wie Sie alle ungeraden Zahlen aus dem Array auswählen.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

In diesem Beispiel wird gezeigt, wie Sie die Zeichenfolgen auswählen, die nicht leer sind.

('hi', '', 'there').Where({$_.Length})
hi
there

Default

Der Default Modus filtert Elemente mithilfe des Expression Skriptblocks.

Wenn ein numberToReturn Element angegeben wird, gibt er die maximale Anzahl von Elementen an, 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.

Last

$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 Skriptblockausdruckfilter übergibt. Anschließend werden ALLE verbleibenden Sammlungselemente zurückgegeben, ohne sie zu testen. Es wird nur ein übergebenes Element getestet.

Dies bedeutet, dass die zurückgegebene Auflistung sowohl übergebene als auch nicht übergebende Elemente enthält, die NICHT getestet wurden.

Die Anzahl der zurückgegebenen Elemente kann durch Übergeben eines Werts an das numberToReturn Argument eingeschränkt werden.

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Until

Der Until Modus umkehrt 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 Verarbeitung von Where Elementen.

Dies bedeutet, dass Sie die erste Gruppe von nicht übergebenden Elementen aus der Where Methode erhalten. Nachdem ein Element bestanden hat, werden die restlichen Elemente NICHT getestet oder zurückgegeben.

Die Anzahl der zurückgegebenen Elemente kann durch Übergeben eines Werts an das numberToReturn Argument eingeschränkt werden.

# 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

Sowohl als SkipUntil auch Until unter der Lokalen von NOT testen Sie eine Reihe von Elementen.

Until gibt die Elemente VOR dem ersten Pass zurück.

SkipUntil gibt alle Elemente NACH dem ersten Pass zurück, einschließlich des ersten Übergebens.

Split

Der Split Modus teilt sich oder gruppiert Auflistungselemente in zwei separate Auflistungen. Diejenigen, die den Scriptblock-Ausdruck übergeben, und diejenigen, die nicht.

Wenn eine numberToReturn angegeben wird, enthält die erste Auflistung die übergebenden Elemente, um den angegebenen Wert nicht zu ü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
...

Hinweis

where Sowohl als auch foreach Methoden sind systeminterne Elemente. Weitere Informationen zu systeminternen Mitgliedern finden Sie unter about_Instrinsic_Members

Abrufen der Mitglieder eines Arrays

Um die Eigenschaften und Methoden eines Arrays abzurufen, z. B. die Length Eigenschaft und die SetValue-Methode , verwenden Sie den InputObject-Parameter des Get-Member Cmdlets.

Wenn Sie ein Array an Get-Memberdas Array senden, sendet PowerShell die Elemente jeweils einzeln und Get-Member gibt den Typ der einzelnen Elemente im Array zurück (ignoriert Duplikate).

Wenn Sie den InputObject-Parameter verwenden, Get-Member werden die Elemente des Arrays zurückgegeben.

Der folgende Befehl ruft beispielsweise die Member der $a Arrayvariable ab.

Get-Member -InputObject $a

Sie können auch die Member eines Arrays abrufen, indem Sie ein Komma (,) eingeben, bevor der Wert, der an das Get-Member Cmdlet weitergeleitet wird. Das Komma macht das Array zum zweiten Element in einem Array von Arrays. PowerShell weist die Arrays jeweils einzeln auf und Get-Member gibt die Elemente 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 ein drittes 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 Zuordnungsoperator (=), um einen neuen Wert für das Element anzugeben. Um beispielsweise den Wert des zweiten Elements im $a Array (Indexposition 1) in 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 auf 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 Mehrwert. 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. Wenn Sie beispielsweise das $t Array mit allen Elementen im $a Array erstellen möchten, mit Ausnahme des Werts an Indexposition 2, geben Sie Folgendes ein:

$t = $a[0,1 + 3..($a.length - 1)]

Um zwei Arrays in ein einzelnes Array zu kombinieren, verwenden Sie den Plusoperator (+). Im folgenden Beispiel werden zwei Arrays erstellt, kombiniert und anschließend 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.

Zum Löschen eines Arrays weisen Sie dem Array einen 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 eines Werts $null ist schneller, insbesondere für große Arrays.

Arrays von Null oder 1

Ab Windows PowerShell 3.0 verfügt eine Auflistung von Null oder ein Objekt über die Count und Length die Eigenschaften. Außerdem können Sie ein Array eines Objekts indizieren. Dieses Feature hilft Ihnen, Skriptfehler zu vermeiden, die auftreten, wenn ein Befehl, der erwartet, dass eine Auflistung weniger als zwei Elemente erhält.

In den folgenden Beispielen wird dieses Feature veranschaulicht.

Zero-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

Indizierungsunterstützung für System.Tuple Objekte

PowerShell 6.1 hat die Unterstützung für den indizierten Zugriff auf Tuple Objekte hinzugefügt, ähnlich wie Arrays. Zum Beispiel:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

Im Gegensatz zu Arrays und anderen Auflistungsobjekten werden Objekte als einzelnes Objekt behandelt, Tuple wenn sie durch die Pipeline oder durch Parameter übergeben werden, die Arrays von Objekten unterstützen.

Weitere Informationen finden Sie unter System.Tuple.

Indizieren von .NET-Typen, die implementiert werden IDictionary<TKey, TValue>

PowerShell ruft den true Indexer eines Typs nicht für Typen auf, die die generische IDictionary<TKey, TValue> Schnittstelle implementieren. Stattdessen testet PowerShell bei Einem Schlüssel das Vorhandensein des Schlüssels mithilfe TryGetValue()von , der zurückgibt $null , wenn der Schlüssel nicht vorhanden ist.

Wenn Sie dagegen den true Indexer des Typs mit Item(<key>)aufrufen, löst die Methode eine Ausnahme aus, wenn der Schlüssel nicht vorhanden ist.

Der Unterschied wird im folgenden Beispiel veranschaulicht.

PS> [Collections.Generic.Dictionary[string, int]]::new()['nosuchkey']
# No output ($null)

PS> [Collections.Generic.Dictionary[string, int]]::new().Item('nosuchkey')
GetValueInvocationException: Exception getting "Item": "The given key 'nosuchkey' was not present in the dictionary."

Memberzugriffsaufzählung

Beginnend in PowerShell 3.0, wenn Sie den Memberzugriffsoperator verwenden, um auf ein Element zuzugreifen, das in einer Listensammlung nicht vorhanden ist, werden die Elemente in der Auflistung automatisch von PowerShell aufgezählt und versucht, auf das angegebene Element für jedes Element zuzugreifen. Weitere Informationen finden Sie unter about_Member-Access_Enumeration.

Beispiele

Im folgenden Beispiel werden zwei neue Dateien erstellt und die resultierenden Objekte in der Arrayvariable $filesgespeichert. Da das Arrayobjekt nicht über das LastWriteTime-Element verfügt, wird der Wert von LastWriteTime für jedes Element im Array zurückgegeben.

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

Mit der Memberzugriffsaufzählung können Sie Werte aus Elementen in einer Auflistung abrufen , aber nicht Werte für Elemente in einer Auflistung festlegen . Zum Beispiel:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

Um die Werte festzulegen, müssen Sie eine Methode verwenden.

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

Die set_LastWriteTime() Methode ist ein ausgeblendetes Element des FileInfo-Objekts . Im folgenden Beispiel wird gezeigt, wie Elemente gefunden werden, die über eine ausgeblendeteset Methode verfügen.

$files | Get-Member | Where-Object Definition -like '*set;*'
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

Achtung

Da die Methode für jedes Element in der Auflistung ausgeführt wird, sollten Sie beim Aufrufen von Methoden mithilfe der Memberaufzählung vorsichtig sein.

Siehe auch