Freigeben über


about_Arrays

Kurze Beschreibung

Beschreibt Arrays, bei denen es sich um Datenstrukturen handelt, die zum Speichern von Sammlungen von Elementen konzipiert sind.

Lange Beschreibung

Ein Array ist eine Datenstruktur, die zum Speichern einer Sammlung von Elementen konzipiert ist. Die Elemente können denselben Typ oder unterschiedliche Typen aufweisen.

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 einer Variablen mehrere Werte zu. Die im Array gespeicherten Werte werden durch ein Komma getrennt und vom Variablennamen durch den Zuordnungsoperator (=) getrennt.

Um beispielsweise ein Array $A zu erstellen, das die sieben numerischen Werte (ganze Zahl) 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 $B zu erstellen, das den einzelnen Wert von 7 enthält, geben Sie Folgendes ein:

$B = ,7

Sie können ein Array auch mithilfe des Bereichsoperators (..) erstellen und initialisieren. 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 ermitteln. Zum Beispiel:

$A.GetType()

Um ein stark typiertes Array zu erstellen, d. h. 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 zu umwandeln, stellen Sie dem Variablennamen einen Arraytyp voran, der in Klammern eingeschlossen ist. Zum Beispiel:

[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 in .NET umwandeln. Die Objekte, die Get-Process zum Darstellen von Prozessen abgerufen werden, sind beispielsweise vom Typ "System.Diagnostics.Process ". Um ein stark typiertes Array von Prozessobjekten zu erstellen, geben Sie den folgenden Befehl ein:

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

Der Array-Unterausdrucksoperator

Der Array-Unterausdrucksoperator 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 von Null oder ein Objekt zu erstellen. Zum Beispiel:

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

Der Arrayoperator ist in Skripts hilfreich, wenn Sie Objekte abrufen, aber nicht wissen, wie viele davon erwartet werden. Zum Beispiel:

$p = @(Get-Process Notepad)

Weitere Informationen zum Array-Unterausdrucksoperator finden Sie unter about_Operators.

Zugreifen auf und Verwenden von Arrayelementen

Lesen eines Arrays

Sie können mithilfe des Variablennamens auf ein Array verweisen. Rufen Sie den Arraynamen auf, um alle Elemente im Array anzuzeigen. Ist beispielsweise $a ein Array der Zahlen 0 bis 9:

$a
0
1
2
3
4
5
6
7
8
9

Sie können mithilfe eines Indexes auf die Elemente in einem Array verweisen. Setzen Sie die Indexnummer in Klammern. Indexwerte beginnen bei 0. Geben Sie beispielsweise Folgendes ein, um das erste Element im $a Array anzuzeigen:

$a[0]
0

Geben Sie Folgendes ein, um das dritte Element im $a 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

Negative Zahlen zählen vom Ende des Arrays. Verweist beispielsweise -1 auf das letzte Element des Arrays. Um die letzten drei Elemente des Arrays anzuzeigen, geben Sie 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

Seien Sie jedoch vorsichtig, wenn Sie diese Schreibweise verwenden. Die Schreibweise wechselt von der Endgrenze zum Anfang des Arrays.

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

Ein allgemeiner Fehler besteht auch darin, anzunehmen $a[0..-2] , dass sich auf alle Elemente des Arrays bezieht, mit Ausnahme der letzten. 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. Um beispielsweise die Elemente an den Indexpositionen 0, 2 und 4 bis 6 anzuzeigen, geben Sie Folgendes ein:

$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 auflisten zu können. Um z. B. Die Elemente 0 bis 2, vier bis sechs auflisten und das Element mit dem achten Positionstyp auflisten:

$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 Schleifen verwenden, 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 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. 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

Verwenden Sie die Eigenschaft oder den Length Count Alias, um zu bestimmen, wie viele Elemente sich in einem Array befinden. 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. Auch 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 markierten 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 zeilenweiser 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 einer einzelnen Gruppe von Klammern ([]).

Bei einigen Vorgängen in einem mehrdimensionalen Array, z. B. Replikation und Verkettung, muss das Array abgeflacht werden. Durch die Abschärfung wird das Array in ein 1dimensionales Array ungezwungener Typ umgewandelt. Das resultierende Array übernimmt alle Elemente in zeilengerichteter Reihenfolge. Betrachten Sie das folgende 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 der 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 typiert, $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, Objekt[] Argumente)

Diese Methode wurde in PowerShell v4 hinzugefügt.

Hinweis

Für die Syntax ist die Verwendung eines Skriptblocks erforderlich. Klammern sind optional, wenn der Scriptblock der einzige Parameter ist. Außerdem darf es keinen Abstand zwischen der Methode und der öffnenden Klammer oder geschweiften Klammer 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 so konfiguriert ist, dass sie akzeptiert werden.

Weitere Informationen zum Verhalten von ArgumentList finden Sie unter about_Splatting.

ForEach(typ convertToType)

Die ForEach() Methode kann verwendet werden, um die Elemente in einen anderen Typ umzuwandeln. Das folgende Beispiel zeigt, wie eine Liste von Zeichenfolgendatumsangaben 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 zum Abrufen oder Festlegen von Eigenschaftswerten für jedes Element in der Auflistung verwendet werden.

# 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 so konfiguriert ist, dass sie akzeptiert werden.

Hinweis

Ab Windows PowerShell 3.0 kann das Abrufen von Eigenschaften und 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.

Where()

Ermöglicht das Filtern oder Auswählen der Elemente des Arrays. Das Skript muss einen anderen Wert als Null (0), leere Zeichenfolge oder $null für das Element auswerten, $false das nach der Where()Zeichenfolge angezeigt werden soll. 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

Für die Syntax ist die Verwendung eines Skriptblocks erforderlich. Klammern sind optional, wenn der Scriptblock der einzige Parameter ist. Außerdem darf es keinen Abstand zwischen der Methode und der öffnenden Klammer oder geschweiften Klammer geben.

Dies Expression ist 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.

Der Wert muss mode ein Enumerationswert von WhereOperatorSelectionMode sein:

  • Default (0) - Alle Elemente zurückgeben
  • First (1) - Gibt das erste Element zurück.
  • Last (2) - Gibt das letzte Element zurück.
  • SkipUntil (3) - Elemente überspringen, bis die Bedingung wahr ist, alle verbleibenden Elemente zurückgeben (einschließlich des ersten Elements, für das die Bedingung wahr ist)
  • Until (4) - Gibt alle Elemente zurück, bis die Bedingung wahr ist.
  • Split (5) - Zurückgeben eines Arrays mit 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

Das nächste Beispiel zeigt, wie alle nicht leeren Zeichenfolgen ausgewählt werden.

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

Default

Der Default Modus filtert Elemente mithilfe des Expression Scriptblocks.

Wenn eine numberToReturn Angabe erfolgt, gibt sie die maximale Anzahl der zurückzugebenden Elemente an.

# 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 Filter für den Skriptblockausdruck ü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 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 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 den ersten Satz von nicht übergebenden Elementen aus der Where() Methode erhalten. Nachdem ein Element bestanden wurde, werden die restlichen Elemente 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

Sowohl als SkipUntil auch Until unter der Prämisse, dass NICHT eine Reihe von Elementen getestet wird.

Until gibt die Elemente VOR dem ersten PASS zurück. SkipUntil gibt alle Elemente NACH dem ersten Durchlauf zurück, einschließlich des ersten übergebenden Elements.

Split

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

Wenn ein numberToReturn Wert angegeben ist, 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

Beide Methoden ForEach() Where() sind systeminterne Member. Weitere Informationen zu systeminternen Membern finden Sie unter about_Instrinsic_Members.

Abrufen der Member 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-Memberein Array senden, sendet PowerShell die Elemente einzeln und Get-Member gibt den Typ der einzelnen Elemente im Array zurück (Duplikate ignorieren).

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

Beispielsweise ruft der folgende Befehl die Member der $a Arrayvariable ab.

Get-Member -InputObject $a

Sie können auch die Member eines Arrays abrufen, indem Sie vor dem Wert, der an das Get-Member Cmdlet weitergeleitet wird, ein Komma (,) eingeben. 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 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 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. Um z. B. das $t Array mit allen Elementen im $a Array zu erstellen, mit Ausnahme des Werts an Indexposition 2, geben Sie Folgendes ein:

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

Um zwei Arrays in einem einzigen 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.

Um ein Array zu löschen, weisen Sie dem Array einen Wert $null zu. Mit dem folgenden Befehl wird das Array in der $a Variablen gelöscht.

$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 und Length die Count Eigenschaften. Außerdem können Sie ein Array eines Objekts indizieren. Mit diesem Feature können Sie Skriptfehler vermeiden, die auftreten, wenn ein Befehl, der eine Auflistung erwartet, weniger als zwei Elemente erhält.

Hinweis

In Windows PowerShell können Objekte, die durch Umwandlung einer Hashtabelle [pscustomobject] erstellt werden, nicht über die oder Count die Length Eigenschaften verfügen. Der Versuch, auf diese Member zuzugreifen, wird zurückgegeben $null.

Das folgende Beispiel zeigt, dass eine Variable, die keine Objekte enthält, eine Count und Length 0 aufweist.

PS> $a = $null
PS> $a.Count
0
PS> $a.Length
0

Das folgende Beispiel zeigt, dass eine Variable, die ein Objekt enthält, eine Count und Length 1 aufweist. Sie können auch die Arrayindizierung verwenden, um auf den Wert des Objekts zuzugreifen.

PS> $a = 4
PS> $a.Count
1
PS> $a.Length
1
PS> $a[0]
4
PS> $a[-1]
4

Wenn Sie einen Befehl ausführen, der eine Auflistung oder ein einzelnes Objekt zurückgeben kann, können Sie mithilfe der Arrayindizierung auf den Wert des Objekts zugreifen, ohne die Count Length Eigenschaften testen zu müssen. Wenn das Ergebnis jedoch ein einzelnes Objekt (Singleton) ist und dieses Objekt über eine Count oder Length eine Eigenschaft verfügt, gehören der Wert dieser Eigenschaften zum Singleton-Objekt und stellen nicht die Anzahl der Elemente in der Auflistung dar.

Im folgenden Beispiel gibt der Befehl ein einzelnes Zeichenfolgenobjekt zurück. Die Length Zeichenfolge ist 4.

PS> $result = 'one','two','three','four' | Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String
PS> $result
four
PS> $result.Count
1
PS❯ $result.Length
4

Wenn Sie ein Array von Zeichenfolgen sein möchten $result , müssen Sie die Variable als Array deklarieren.

In diesem Beispiel $result handelt es sich um ein Array von Zeichenfolgen. Das Count Und Length des Arrays ist 1, und das Length erste Element ist 4.

PS> [string[]]$result = 'one','two','three','four' |
    Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String[]
PS> $result
four
PS> $result.Count
1
PS> $result.Length
1
PS> $result[0].Length
4

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

PowerShell ruft den tatsächlichen Indexer eines Typs nicht für Typen auf, die die generische IDictionary<TKey, TValue> Schnittstelle implementieren. Wenn ein Schlüssel angegeben wird, testet PowerShell stattdessen das Vorhandensein des Schlüssels mithilfe TryGetValue()des Schlüssels, der zurückgibt $null , wenn der Schlüssel nicht vorhanden ist.

Wenn Sie dagegen den tatsächlichen 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')
Exception getting "Item": "The given key 'nosuchkey' was not present in the dictionary."
At line:1 char:1
+ [Collections.Generic.Dictionary[string, int]]::new().Item('nosuchkey' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], GetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenGetting

Memberzugriffsenumeration

Ab PowerShell 3.0 listet PowerShell automatisch die Elemente in der Auflistung auf, wenn Sie den Memberzugriffsoperator verwenden, um auf ein Element zuzugreifen, das nicht in einer Listensammlung vorhanden ist. Außerdem listet PowerShell die Elemente in der Auflistung automatisch 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 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 Memberzugriffsenumeration können Sie Werte aus Elementen in einer Auflistung abrufen , aber keine Werte für Elemente in einer Auflistung festlegen . Zum Beispiel:

$files.LastWriteTime = (Get-Date).AddDays(-1)
The property 'LastWriteTime' cannot be found on this object. Verify that the
property exists and can be set.
At line:1 char:1
+ $files.LastWriteTime = (Get-Date).AddDays(-1)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

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. Das folgende Beispiel zeigt, wie ausgeblendete set Methoden gefunden werden.

$files | Get-Member -Force -Name 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 Memberenumeration vorsichtserwendlich vorgehen.

Weitere Informationen