Freigeben über


about_Arrays

Kurze Beschreibung

Beschreibt Arrays, bei denen es sich um Datenstrukturen handelt, die zum Speichern von Auflistungen von Elementen entwickelt wurden.

Lange Beschreibung

Ein Array ist eine Datenstruktur, die zum Speichern einer Auflistung von Elementen entwickelt wurde. Bei den Elementen kann es sich um denselben Typ oder um verschiedene Typen handeln.

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

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.

Um beispielsweise ein Array namens $A zu erstellen, das die sieben numerischen (int)-Werte 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.

Um beispielsweise ein einzelnes Elementarray namens $B zu erstellen, das den einzelnen Wert von 7 enthält, geben Sie Folgendes ein:

$B = ,7

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

$C = 5..8

Enthält daher $C vier Werte: 5, 6, 7 und 8.

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

$A.GetType()

Um ein stark typisiertes Array zu erstellen, d. h. ein Array, das nur Werte eines bestimmten Typs enthalten kann, wandeln Sie die Variable in einen Arraytyp um, z. B. string[], long[], oder int32[]. Wenn Sie ein Array umwandeln möchten, stellen Sie dem Variablennamen einen Arraytyp voran, der in Klammern eingeschlossen ist. Um beispielsweise ein 32-Bit-Ganzzahlarray mit dem Namen $ia zu erstellen, das vier ganze Zahlen (1500, 2230, 3350 und 4000) enthält, 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 in .NET umgewandelt werden. Beispielsweise haben die Objekte, die zum Darstellen von Prozessen abgerufen werden, Get-Process den 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 Arrayunterausdrucksoperator

Der Arrayunterausdrucksoperator erstellt ein Array aus den darin enthaltenen Anweisungen. Unabhängig davon, was die Anweisung innerhalb des Operators erzeugt, platziert der Operator sie in einem Array. Auch wenn null oder ein Objekt vorhanden ist.

Die Syntax des Arrayoperators lautet wie folgt:

@( ... )

Sie können den Arrayoperator verwenden, um ein Array mit null oder einem Objekt zu erstellen. Beispiel:

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

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

$p = @(Get-Process Notepad)

Weitere Informationen zum Operator des Arrayunterausdrucks 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. Um alle Elemente im Array anzuzeigen, geben Sie den Arraynamen ein. Angenommen, es handelt sich $a um ein Array, das ganze Zahlen von 0, 1, 2 bis 9 enthält. Geben Sie Folgendes ein:

$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 an 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 am 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 Indexreihenfolge 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 Notation wechselt von der Endgrenze 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 bereiche 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. Elemente 0 bis 2, vier bis sechs und das Element beim achten Positionstyp auf:

$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, Forund While 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 die Indikatoren 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 erfüllt ist. Um beispielsweise die Elemente im $a Array anzuzeigen, 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 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

Rank

Gibt die Anzahl der Dimensionen des Arrays zurück. Die meisten Arrays in PowerShell haben nur eine Dimension. Auch wenn Sie denken, dass Sie wie im folgenden Beispiel ein mehrdimensionales Array 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, müssen 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. Das folgende Beispiel zeigt, 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 eines einzelnen Satzes von Klammern ([]).

Für einige Vorgänge für ein mehrdimensionales Array, z. B. Replikation und Verkettung, muss dieses Array vereinfacht werden. Durch die Vereinfachung wird das Array in ein eindimensionales Array des uneingeschränkten Typs 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 $c es sich um ein eindimensionales Array handelt, 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 ist ein Array von -Objekten dargestellt.

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

In diesem Beispiel wird explizit typisiert, $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(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(scriptblock-Ausdruck)

ForEach(scriptblock-Ausdruck, Object[]-Argumente)

Diese Methode wurde in PowerShell v4 hinzugefügt.

Hinweis

Die Syntax erfordert die Verwendung eines Skriptblocks. Klammern sind optional, wenn der Scriptblock der einzige Parameter ist. Außerdem darf kein Leerzeichen zwischen der Methode und der öffnenden Klammer oder Klammer vorhanden sein.

Das folgende Beispiel zeigt, wie die -Methode verwendet wird ForEach . In diesem Fall besteht die Absicht darin, den Quadratwert der Elemente im Array zu generieren.

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Genau wie der -ArgumentList Parameter von ForEach-Objectermöglicht der arguments Parameter die Übergabe eines Arrays von Argumenten an einen Skriptblock, der für die Annahme dieser Argumente 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 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)

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-Objectermöglicht der Arguments -Parameter die Übergabe eines Arrays von Werten an einen Skriptblock, der so konfiguriert ist, dass diese akzeptiert werden.

Hinweis

Ab Windows PowerShell 3.0 kann das Abrufen von Eigenschaften und das Ausführen von Methoden für jedes Element in einer Auflistung auch mithilfe von "Methoden von skalaren Objekten und Auflistungen" erreicht 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 in einem anderen Wert ausgewertet werden als null (0), leere Zeichenfolge $false oder $null damit das Element nach angezeigt Wherewird. 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 Scriptblock der einzige Parameter ist. Außerdem darf kein Leerzeichen zwischen der Methode und der öffnenden Klammer oder Klammer vorhanden sein.

Der Expression ist 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 aus dem Filter zurückgegeben werden.

Die zulässigen Werte für mode sind:

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

Das folgende Beispiel zeigt, wie alle ungeraden Zahlen aus dem Array ausgewählt werden.

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

In diesem Beispiel wird gezeigt, wie Die Zeichenfolgen ausgewählt werden, die nicht leer sind.

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

Default

Der Default Modus filtert Elemente mithilfe des Expression Skriptblocks.

Wenn ein numberToReturn angegeben 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.

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 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 NICHT getestet oder 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 unter der Prämisse, dass sie keinen Batch von Elementen testen.

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

SkipUntil gibt alle Elemente nach dem ersten Durchlauf zurück, einschließlich des ersten übergebenen Elements.

Split

Der Split Modus unterteilt oder gruppiert Sammlungselemente in zwei separate Sammlungen. Diejenigen, die den Scriptblock-Ausdruck übergeben, und diejenigen, die dies nicht tun.

Wenn ein numberToReturn angegeben ist, enthält die erste Auflistung die übergebenden Elemente, um den angegebenen Wert nicht zu überschreiten.

Die restlichen 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

Beide foreach Methoden und where sind systeminterne Member. Weitere Informationen zu intrinsischen Elementen finden Sie unter about_Instrinsic_Members

Abrufen der Elemente eines Arrays

Verwenden Sie den InputObject-Parameter des Cmdlets, um die Eigenschaften und Methoden eines Arrays abzurufen, zLength. B. die -Eigenschaft und die Get-MemberSetValue-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 ignoriert).

Wenn Sie den InputObject-Parameter verwenden, Get-Member gibt die Member des Arrays zurück.

Mit dem folgenden Befehl werden beispielsweise die Member der $a Arrayvariablen abgerufen.

Get-Member -InputObject $a

Sie können auch die Member eines Arrays abrufen, indem Sie ein Komma (,) vor dem Wert eingeben, der an das Get-Member Cmdlet übergeben wird. Das Komma macht das Array zum zweiten Element in einem Array von Arrays. PowerShell leitet die Arrays einzeln und Get-Member gibt die Member des Arrays zurück. Wie die nächsten beiden Beispiele.

,$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. Geben Sie beispielsweise Folgendes ein, um den Wert des zweiten Elements im $a Array (Indexposition 1) in 10 zu ändern:

$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. Im folgenden Beispiel wird gezeigt, wie dem Array ein Element $a hinzugefügt wird.

$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. Geben Sie beispielsweise Folgendes ein, um das $t Array mit allen Elementen im $a Array mit Ausnahme des Werts an Indexposition 2 zu erstellen:

$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 einen Wert von $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 von $null ist schneller, insbesondere für große Arrays.

Arrays mit 0 oder 1

Ab Windows PowerShell 3.0 verfügt eine Auflistung von null oder einem Objekt über die Count Eigenschaften undLength. Außerdem können Sie in ein 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

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 bei Arrays. 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 über die Pipeline übergeben werden, oder durch Parameter, die Arrays von Objekten unterstützen.

Weitere Informationen finden Sie unter System.Tuple.

Memberzugriffsenumeration

Wenn Sie ab PowerShell 3.0 den Memberzugriffsoperator verwenden, um auf ein Element zuzugreifen, das in einer Listensammlung nicht vorhanden ist, listet PowerShell automatisch die Elemente in der Auflistung auf 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 Arrayvariablen $filesgespeichert. Da das Arrayobjekt nicht über den LastWriteTime-Member 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 . 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.

Zum Festlegen der Werte 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 Sie Member mit einer ausgeblendetenset Methode finden.

$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, sollte beim Aufrufen von Methoden mithilfe der Memberaufzählung Sorgfalt angewendet werden.

Weitere Informationen