• 10/08/2020
  • 24 Minuten zum Lesen
    • j
    • h
    • s
    • V

Arrays sind ein elementarer Sprache Funktion der meisten Programmiersprachen. Sie sind eine Sammlung von Werten oder Objekten, die schwer zu vermeiden sind. Schauen wir uns Arrays und alles, was sie zu bieten haben, genau an.,

Hinweis

Die Originalversion dieses Artikels erschien auf dem Blog von @KevinMarquette. ThePowerShell Team dankt Kevin für den Austausch dieser Inhalte mit uns. Bitte schauen Sie sich seinen Blog an atPowerShellExplained.com.

Was ist ein Array?

Ich werde mit einer grundlegenden technischen Beschreibung beginnen, was Arrays sind und wie sie vonmost-Programmiersprachen verwendet werden, bevor ich in die andere Richtung gehe, wie PowerShell sie verwendet.

Ein Array ist eine Datenstruktur, die als Sammlung mehrerer Elemente dient., Sie können über Thearray iterieren oder über einen Index auf einzelne Elemente zugreifen. Das Array wird als sequentieller Block vonmemory erstellt, in dem jeder Wert direkt neben dem anderen gespeichert ist.

Ich werde auf jedem dieser Details berühren, wie wir gehen.

Grundlegende Verwendung

Da Arrays ein so grundlegendes Merkmal von PowerShell sind, gibt es eine einfache Syntax für die Arbeit mitthem in PowerShell.,

Erstellen Sie ein Array

Ein leeres Array kann mit @()

PS> $data = @()PS> $data.count0

Wir können ein Array erstellen und mit Werten versehen, indem wir sie einfach in die @() Klammern setzen.

PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree

Dieses Array enthält 4 Elemente. Wenn wir die Variable $data, wird die Liste unserer Elemente angezeigt. Wenn es ein Array von Strings ist, erhalten wir eine Zeile pro String.

Wir können ein Array in mehreren Zeilen deklarieren. Das Komma ist in diesem Fall optional und im Allgemeinen übrig.,

$data = @( 'Zero' 'One' 'Two' 'Three')

Ich bevorzuge es, meine Arrays in mehreren Zeilen so zu deklarieren. Es wird nicht nur einfacher zu lesen, wennSie haben mehrere Elemente, es erleichtert auch den Vergleich zu früheren Versionen, wenn Sie sourcecontrol verwenden.

Andere Syntax

Es ist allgemein bekannt, dass @() die Syntax zum Erstellen eines Arrays ist, aber kommagetrennte Listenarbeiten die meiste Zeit.,

$data = 'Zero','One','Two','Three'

Write-Output zum Erstellen von Arrays

Ein cooler kleiner Trick, der erwähnenswert ist, ist, dass Sie Write-Output verwenden können, um schnell Strings zu erstellenauf der Konsole.

$data = Write-Output Zero One Two Three

Dies ist praktisch, da Sie keine Anführungszeichen um die Zeichenfolgen setzen müssen, wenn der Parameter acceptsstrings. Ich würde das nie in einem Skript tun, aber es ist faires Spiel in der Konsole.

Zugriff auf Elemente

Nachdem Sie nun ein Array mit Elementen darin haben, möchten Sie möglicherweise auf diese Elemente zugreifen und diese aktualisieren.,

Offset

Um auf einzelne Elemente zuzugreifen, verwenden wir die Klammern mit einem Offset-Wert ab 0. Dies ishow erhalten wir das erste Element in unserem Array:

PS> $data = 'Zero','One','Two','Three'PS> $dataZero

Der Grund, warum wir hier Null verwenden, ist, weil das erste Element am Anfang der Liste steht, also verwenden wirein Offset von 0 Elementen, um dorthin zu gelangen. Um zum zweiten Element zu gelangen, müssten wir einen Offset von 1 toskip das erste Element verwenden.

PS> $dataOne

Dies würde bedeuten, dass sich das letzte Element auf Offset 3 befindet.,

PS> $dataThree

Index

Jetzt können Sie sehen, warum ich die Werte für dieses Beispiel ausgewählt habe. Ich habe dies als offsetbecause eingeführt, was es wirklich ist, aber dieser Offset wird häufiger als Index bezeichnet. Einindex, der bei 0beginnt. Für den Rest dieses Artikels werde ich den Offset als Index bezeichnen.

Spezielle Indextricks

In den meisten Sprachen können Sie nur eine einzelne Zahl als Index angeben und Sie erhalten ein einzelnes Element zurück.PowerShell ist viel flexibler. Sie können mehrere Indizes gleichzeitig verwenden., Durch die Bereitstellung einer Liste vonindizes können wir mehrere Elemente auswählen.

PS> $dataZeroTwoThree

Die Elemente werden basierend auf der Reihenfolge der bereitgestellten Indizes zurückgegeben. Wenn Sie einen Index duplizieren, erhalten Sie dieses Element beide Male.

PS> $dataThreeZeroThree

Wir können eine Folge von Zahlen mit dem eingebauten .. Operator angeben.

PS> $dataOneTwoThree

Dies funktioniert auch Umgekehrt.

PS> $dataThreeTwoOne

Sie können negative Indexwerte verwenden, um vom Ende auszugleichen. Wenn Sie also das letzte Element in der Liste benötigen, können Sie -1.,

PS> $dataThree

Out of bounds

Wenn Sie in den meisten Sprachen versuchen, auf einen Index eines Elements zuzugreifen, das über dem Ende des Arrays liegt, erhalten Sie eine Art Fehler oder eine Ausnahme. PowerShell gibt stillschweigend nichts zurück.

PS> $null -eq $dataTrue

Kann nicht in ein Null-Array indiziert werden

Wenn Ihre Variable $null ist und Sie versuchen, sie wie ein Array zu indizieren, erhalten Sie eineSystem.Management.Automation.RuntimeException Ausnahme mit der MeldungCannot index into a null array.,

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

Stellen Sie also sicher, dass Ihre Arrays nicht $null bevor Sie versuchen, auf Elemente in ihnen zuzugreifen.

Count

Arrays und andere Sammlungen verfügen über eine count-Eigenschaft, die angibt, wie viele Elemente sich im Array befinden.

PowerShell 3.0 hat den meisten Objekten eine count-Eigenschaft hinzugefügt. sie können ein einzelnes Objekt haben und es solltengeben Sie eine Zählung von 1.

PS> $date = Get-DatePS> $date.count1

Sogar $null hat eine count-Eigenschaft, außer es gibt 0.,

PS> $null.count0

Hier gibt es einige Fallen, die ich noch einmal aufsuchen werde, wenn ich in diesem Artikel nach $null oder empty arrayslater suche.

Off-by-One-Fehler

Ein häufiger Programmierfehler wird erstellt, da Arrays bei Index 0 beginnen. Off-by-One-Fehler können seineingeführt auf zwei Arten.

Das erste ist, indem Sie mental denken, dass Sie das zweite Element wollen und einen Index von 2 und wirklich gettingthe drittes Element. Oder indem Sie denken, dass Sie vier Elemente haben und das letzte Element möchten, verwenden Sie die Zählung, um auf das letzte Element zuzugreifen.,

$data

PowerShell ist vollkommen glücklich, Sie das tun zu lassen und Ihnen genau zu geben, welches Element bei Index 4 vorhanden ist:$null. Sie sollten oder die -1, die wir oben erfahren haben.

PS> $dataThree

Hier können Sie den -1 Index verwenden, um das letzte Element abzurufen.

PS> $dataThree

Lee Dailey wies mich auch darauf hin, dass wir $data.GetUpperBound(0) verwenden können, um die maximale Indexnummer zu erhalten.,

Der zweithäufigste Weg ist, wenn die Liste iteriert wird und nicht zum richtigen Zeitpunkt angehalten wird. Ich’llrevisit, wenn wir sprechen über die Verwendung von for loop.

Elemente aktualisieren

Wir können denselben Index verwenden, um vorhandene Elemente im Array zu aktualisieren. Dadurch haben wir direkten Zugriff auf einzelne Artikel.

$data = 'dos'$data = 'tres'

Wenn wir versuchen, ein Element zu aktualisieren, das über dem letzten Element liegt, erhalten wir einenIndex was outside the bounds of the array. Fehler.

Ich werde dies später noch einmal wiederholen, wenn ich darüber spreche, wie man ein Array größer macht.,

Iteration

Irgendwann müssen Sie möglicherweise die gesamte Liste durchlaufen oder iterieren und für jedes Element im Array eine Aktion ausführen.

Pipeline

Arrays und die PowerShell-Pipeline sind füreinander bestimmt. Dies ist eine der einfachsten Möglichkeiten, diese Werte zu verarbeiten. Wenn Sie ein Array an eine Pipeline übergeben, wird jedes Element innerhalb des Arrays einzeln verarbeitet.

PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item: 

Wenn Sie $PSItem noch nicht gesehen haben, wissen Sie einfach, dass es dasselbe ist wie $_., Sie können eitherone verwenden, da beide das aktuelle Objekt in der Pipeline darstellen.

ForEach Schleife

DieForEach Schleife funktioniert gut mit Sammlungen. Mit der Syntax:foreach ( <variable> in <collection> )

foreach ( $node in $data ){ "Item: "}

ForEach Methode

Ich neige dazu, dieses zu vergessen, aber es funktioniert gut für einfache Operationen. PowerShell ermöglicht es Ihnen, .ForEach() für eine Sammlung zu installieren.

PS> $data.foreach({"Item "})Item Item Item Item 

Die .foreach() nimmt einen Parameter an, der ein Skriptblock ist., Sie können die Klammern fallen lassen und justprovide den Skriptblock.

$data.foreach{"Item "}

Dies ist eine weniger bekannte Syntax, aber sie funktioniert genauso. Dieseforeach – Methode wurde inPowerShell 4.0 hinzugefügt.

For loop

Diefor Schleife wird in den meisten anderen Sprachen stark verwendet, aber Sie sehen es nicht viel in PowerShell. Whenyou es sehen, es ist oft im Zusammenhang zu Fuß ein array.

for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}

Als erstes initialisieren wir eine $index auf 0., Dann fügen wir die Bedingung hinzu, dass $index kleiner sein muss als $data.count. Schließlich geben wir an, dass jedes Mal, wenn wir eine Schleife durchlaufen, ich den Index um 1erhöhen muss. In diesem Fall ist $index++ die Abkürzung für $index = $index + 1.

Wenn Sie einefor Schleife verwenden, achten Sie besonders auf die Bedingung. Ich habe hier$index -lt $data.count verwendet. Es ist leicht, die Bedingung etwas falsch zu machen, um einen Off-by-One-Fehler in Ihrer Logik zu erhalten., Die Verwendung von oder $index -lt ($data.count - 1) ist immer unansehnlich falsch. Das würde dazu führen, dass Ihr Ergebnis zu viele oder zu wenige Elemente verarbeitet. Dies ist theclassic off-by-one-Fehler.

Schalterschleife

Dies ist eine, die leicht zu übersehen ist. Wenn Sie einer switch-Anweisung ein Array bereitstellen, wird jedes Element im Array überprüft.

$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock

Mit der switch-Anweisung können wir viele coole Dinge tun. Ich habe noch einen anderen Artikel dazu.,

  • Alles, was Sie jemals über die switch-Anweisung wissen wollten

Aktualisieren von Werten

Wenn Ihr Array eine Sammlung von Zeichenfolgen oder Ganzzahlen (Werttypen) ist, möchten Sie manchmal die Werte im Array aktualisieren, während Sie sie durchlaufen. Die meisten der obigen Schleifen verwenden eine Variable in theloop, die eine Kopie des Werts enthält. Wenn Sie diese Variable aktualisieren, wird der ursprüngliche Wert im Array nicht aktualisiert.

Die Ausnahme zu dieser Anweisung ist diefor Schleife., Wenn Sie ein Array durchlaufen und Werte aktualisiereninside es, dann ist diefor Schleife, wonach Sie suchen.

for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}

Dieses Beispiel nimmt einen Wert nach Index, nimmt einige Änderungen vor und verwendet dann denselben Index, um ihn zurückzuweisen.

Arrays von Objekten

Bisher haben wir nur einen Werttyp in ein Array eingefügt, aber Arrays können auch enthaltenobjekte.

$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})

Viele Cmdlets geben Sammlungen von Objekten als Arrays zurück, wenn Sie sie einer Variablen zuweisen.,

$processList = Get-Process

Alle grundlegenden Funktionen, über die wir bereits gesprochen haben, gelten weiterhin für Arrays von Objekten mit ein paar erwähnenswerten Details.

Zugriff auf Eigenschaften

Wir können einen Index verwenden, um auf ein einzelnes Element in einer Sammlung zuzugreifen, genau wie bei Werttypen.

PS> $dataFirstName LastName----- ----Kevin Marquette

Wir können direkt auf Eigenschaften zugreifen und diese aktualisieren.,

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette

Array properties

Normalerweise müssten Sie die gesamte Liste wie folgt aufzählen, um auf alle Eigenschaften zuzugreifen:

PS> $data | ForEach-Object {$_.LastName}MarquetteDoe

Oder mit dem Cmdlet Select-Object -ExpandProperty.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

PowerShell bietet uns jedoch die Möglichkeit, LastName direkt anzufordern. PowerShell zählt themall für uns auf und gibt eine saubere Liste zurück.

PS> $data.LastNameMarquetteDoe

Die Aufzählung noch passiert, aber wir sehen nicht die Komplexität dahinter.,

Where-Object filtering

Hier kommt Where-Object, damit wir filtern und auswählen können, was wir aus dem Array wollen basierend auf den Eigenschaften des Objekts.

PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette

Wir können dieselbe Abfrage schreiben, um die gesuchte FirstName zu erhalten.

$data | Where FirstName -eq Kevin

Where()

Arrays haben eine Where() – Methode, mit der Sie eine scriptblock für den Filter angeben können.

$data.Where({$_.FirstName -eq 'Kevin'})

Diese Funktion wurde in PowerShell 4.0 hinzugefügt.,

Objekte in Schleifen aktualisieren

Mit Werttypen ist die einzige Möglichkeit, das Array zu aktualisieren, die Verwendung einer for-Schleife, da wir den Index kennen müssen, um den Wert zu ersetzen. Wir haben mehr Optionen mit Objekten, da es sich um Referenztypen handelt. Hier ist ein kurzes Beispiel:

foreach($person in $data){ $person.FirstName = 'Kevin'}

Diese Schleife durchläuft jedes Objekt im Array $data. Da Objekte Referenztypen sind, verweist die Variable$person genau auf dasselbe Objekt im Array. Also Updates zu itsproperties aktualisieren das Original.,

Sie können immer noch nicht das gesamte Objekt auf diese Weise ersetzen. Wenn Sie versuchen, der Variablen$person ein neues Objekt zuzuweisen, aktualisieren Sie die Variablenreferenz auf etwas anderes, das nicht mehr auf das ursprüngliche Objekt im Array verweist. Dies funktioniert nicht wie erwartet:

Operatoren

Die Operatoren in PowerShell funktionieren auch auf Arrays. Einige von ihnen arbeiten etwas anders.

– join

Der -join Operator ist der offensichtlichste, also schauen wir uns zuerst an., Ich mag den Operator -joinund benutze ihn oft. Es verbindet alle Elemente im Array mit dem Zeichen oder der Zeichenfolge, die Sie angeben.

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4

Eine der Funktionen, die mir am Operator -join gefällt, ist, dass er einzelne Elemente verarbeitet.

PS> 1 -join '-'1

Ich verwende dies in Logging-und ausführlichen Nachrichten.

PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.

-join $Arrays

Hier ist ein cleverer trick, Lee Dailey mir darauf hingewiesen., Wenn Sie jemals alles verbinden möchtenohne eines Trennzeichens, anstatt dies zu tun:

PS> $data = @(1,2,3,4)PS> $data -join $null1234

Sie können -join mit dem Array als Parameter ohne Präfix verwenden. Schauen Sie sich dieses Beispiel tosee an, von dem ich spreche.

PS> $data = @(1,2,3,4)PS> -join $data1234

-ersetzen und-teilen

Die anderen Operatoren wie -replace und -split werden für jedes Element im Array ausgeführt. Ich kann nicht sagen, dass ich sie jemals so benutzt habe, aber hier ist ein Beispiel.,

PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03

-enthält

Mit dem Operator -contains können Sie ein Array von Werten überprüfen, um festzustellen, ob es einen bestimmten Wert enthält.

PS> $data = @('red','green','blue')PS> $data -contains 'green'True

-in

Wenn Sie einen einzelnen Wert haben, den Sie überprüfen möchten, der mit einem von mehreren Werten übereinstimmt, können SieVerwenden Sie den Operator -in. Der Wert wäre links und das Array auf der rechten Seite des Operators.

PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue

Das kann teuer werden, wenn die Liste groß ist. Ich verwende oft ein Regex-Muster, wenn ich mehr als überprüfeein paar Werte.,

PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue

-eq,- ne

der Geschlechter und arrays kann kompliziert werden. Wenn sich das Array auf der linken Seite befindet, wird jedes Elementvergleich. Anstatt True zurückzugeben, wird das übereinstimmende Objekt zurückgegeben.

PS> $data = @('red','green','blue')PS> $data -eq 'green'green

Wenn Sie den Operator -ne, erhalten wir alle Werte, die nicht unserem Wert entsprechen.

PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue

Wenn Sie dies in einer if() Anweisung verwenden, ist ein zurückgegebener Wert ein True Wert., Wenn kein Wert zurückgegeben wird, ist es ein False Wert. Beide nächsten Anweisungen werden als Trueausgewertet.

$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}

Ich werde dies in einem Moment noch einmal wiederholen, wenn wir über das Testen auf $nullsprechen.

– match

Der Operator -match versucht, jedes Element in der Sammlung abzugleichen.

PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01

Wenn Sie -match mit einem einzigen Wert verwenden, wird eine spezielle Variable $Matches mit matchinfo gefüllt., Dies ist nicht der Fall, wenn ein Array auf diese Weise verarbeitet wird.

Wir können den gleichen Ansatz mit Select-String.

$servers | Select-String SQL

Ich schaue mir Select-String,-match und die Variable $matches in einem anderen Beitrag andie vielen Möglichkeiten, regex zu verwenden.

$null oder leer

Das Testen auf $null oder leere Arrays kann schwierig sein. Hier sind die häufigsten Traps mit Arrays.

Auf einen Blick sieht diese Aussage so aus, als sollte sie funktionieren.,

if ( $array -eq $null){ 'Array is $null'}

Aber ich bin gerade darüber gegangen, wie -eq jedes Element im Array überprüft. So können wir ein Array von mehreren habenelemente mit einem einzelnen $null Wert und es würde ausgewertet $true

$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}

Aus diesem Grund ist es eine bewährte Methode, die $null auf der linken Seite des Operators zu platzieren. Dies macht dieses Szenario zu einem Nicht-Problem.

if ( $null -eq $array ){ 'Array actually is $null'}

Ein $null Array ist nicht dasselbe wie ein leeres Array. Wenn Sie wissen, dass Sie ein Array haben, überprüfen Sie dieAnzahl der Objekte darin., Wenn das Array $null, ist die Anzahl 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

Hier gibt es noch eine Falle, auf die Sie achten müssen. Sie können die count auch dann verwenden, wenn Sie ein singleobject haben, es sei denn, dieses Objekt ist eine PSCustomObject. Dies ist ein Fehler, der in PowerShell 6.1 behoben wurde.Das sind gute Nachrichten, aber viele Leute sind immer noch auf 5.1 und müssen darauf achten.

PS> $object = @{Name='TestObject'}PS> $object.count$null

Wenn Sie sich noch in PowerShell 5.1 befinden, können Sie das Objekt in ein Array einschließen, bevor Sie die Zählung überprüfen, um eine genaue Zählung zu erhalten.,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

Um auf Nummer sicher zu gehen, suchen Sie nach $null und überprüfen Sie dann die Anzahl.

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

All-eq

Ich habe kürzlich jemanden gefragt, wie überprüft werden kann, ob jeder Wert in einem Array mit einem bestimmten Wert übereinstimmt.Reddit user / u / bis hatte diese clevere Lösung, die nach falschen Werten sucht und dann das Ergebnis verschiebt.

$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}

Hinzufügen zu Arrays

Zu diesem Zeitpunkt fragen Sie sich, wie Sie Elemente zu einem Array hinzufügen können. Die schnelle Antwort ist, dass Siekann nicht. Ein Array ist eine feste Größe im Speicher., Wenn Sie es vergrößern oder ein einzelnes Element hinzufügen müssen, dannSie müssen ein neues Array erstellen und alle Werte aus dem alten Array kopieren. Das klingt nach viel Arbeit, PowerShell verbirgt jedoch die Komplexität der Erstellung des neuen Arrays. Powershellimplementiert den Additionsoperator (+) für Arrays.

Hinweis

PowerShell implementiert keine Subtraktionsoperation. Wenn Sie eine flexible Alternative zu anarray möchten, müssen Sie ein generisches List Objekt verwenden.,

Array addition

Wir können den Additionsoperator mit Arrays verwenden, um ein neues Array zu erstellen. Angesichts dieser beiden Arrays:

$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')

können wir sie hinzufügen, um ein neues Array zu erhalten.

PS> $first + $secondZeroOneTwoThree

Plus equals +=

Wir können ein neues Array an Ort und Stelle erstellen und ein Element wie folgt hinzufügen:

$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'

Denken Sie daran, dass Sie jedes Mal, wenn Sie += duplizieren und ein neues Array erstellen. Thisis eine nicht ein Problem für kleinere datasets, aber es skaliert sehr schlecht.,

Pipeline-Zuweisung

Sie können die Ergebnisse einer Pipeline einer Variablen zuweisen. Es ist ein Array, wenn es Multipleitems enthält.

$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}

Normalerweise denken wir bei der Verwendung der Pipeline an die typischen PowerShell-Einzeiler. Wir können die Pipeline mit foreach() Anweisungen und anderen Schleifen durchlaufen. Anstatt also Elemente zu Anarray in einer Schleife hinzuzufügen, können wir Elemente in der Pipeline ablegen.

$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}

Array-Typen

Standardmäßig wird ein Array in PowerShell als ] – Typ erstellt., Dadurch kann es enthalten seinjeder Typ von Objekt oder Wert. Dies funktioniert, weil alles vom Typ PSObject geerbt wird.

Stark typisierte Arrays

Sie können ein Array eines beliebigen Typs mit einer ähnlichen Syntax erstellen. Wenn Sie ein stark typisiertes Array erstellen, kann es nur Werte oder Objekte des angegebenen Typs enthalten.

ArrayList

Das Hinzufügen von Elementen zu einem Array ist eine der größten Einschränkungen, aber es gibt einige andere Sammlungendas können wir uns diesem Problem zuwenden.,

Die ArrayList ist häufig eines der ersten Dinge, an die wir denken, wenn wir ein Array benötigen, mit dem isfaster arbeiten kann. Es verhält sich wie ein Objektarray an jedem Ort, an dem wir es brauchen, aber es behandelt Addingitems schnell.

So erstellen wir eine ArrayList und fügen Elemente hinzu.

$myarray = ::new()$myArray.Add('Value')

Wir rufen in.NET auf, um diesen Typ zu erhalten. In diesem Fall verwenden wir den Standardkonstruktor, um es zu erstellen. Dann rufen wir die Add – Methode auf, um ein Element hinzuzufügen.,

Der Grund, warum ich am Anfang der Zeile verwende, besteht darin, den Rückgabecode zu unterdrücken. Some.NET aufrufe tun dies und können unerwartete Ausgaben erstellen.

Wenn die einzigen Daten, die Sie in Ihrem Array haben, Strings sind, dann schauen Sie sich auch usingStringBuilder an. Es ist fast das Gleiche, hat aber einige Methoden, die nur für den Umgang mitstrings sind. Die StringBuilder wurde speziell für die Leistung entwickelt.

Es ist üblich, dass Personen von Arrays zu ArrayList wechseln. Aber es kommt aus einer Zeit, in der C# keine generische Unterstützung hatte., Die ArrayList ist veraltet, um die generische List

Generische Liste

Ein generischer Typ ist ein spezieller Typ in C#, der eine generalisierte Klasse definiert, und der Benutzer gibt die Andatentypen, die er beim Erstellen verwendet. Wenn Sie also eine Liste von Zahlen oder Zeichenfolgen wünschen, würden Sie definierendass Sie eine Liste von int oder string Typen.

So erstellen Sie eine Liste für Zeichenfolgen.

$mylist = ]::new()

, Oder eine Liste für die zahlen.,

$mylist = ]::new()

Wir können ein vorhandenes Array in eine solche Liste umwandeln, ohne zuerst das Objekt zu erstellen:

$mylist = ]@(1,2,3)

Wir können die Syntax mit der using namespace – Anweisung in PowerShell 5 und neuer verkürzen. Dieusing Anweisung muss die erste Zeile Ihres Skripts sein. Indem Sie einen Namespace deklarieren, PowerShelllets Sie lassen es weg von den Datentypen, wenn Sie sie referenzieren.

using namespace System.Collections.Generic$myList = ]@(1,2,3)

Dadurch wird die List deutlich nutzbarer.,

Sie haben eine ähnliche Add Methode zur Verfügung. Im Gegensatz zur ArrayList gibt es keinen Rückgabewert fürdieAdd – Methode, sodass wir sie nichtvoid müssen.

$myList.Add(10)

Und wir können immer noch wie andere Arrays auf die Elemente zugreifen.

List

Sie können eine Liste beliebiger Typen haben, aber wenn Sie den Objekttyp nicht kennen, können Sie sie verwenden] um sie zu enthalten.,

$list = ]::new()

Remove()

Die ArrayList und die generische List unterstützen beide das Entfernen von Elementen aus der Sammlung.

using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree

Bei der Arbeit mit Werttypen wird der erste aus der Liste entfernt. Sie können es immer wieder aufrufen, um diesen Wert weiter zu entfernen. Wenn Sie Referenztypen haben, müssen Sie das Objekt angeben, das entfernt werden soll.,

]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)

Die Methode remove gibt true zurück, wenn das Element gefunden und aus der Sammlung entfernt werden konnte.

Weitere Sammlungen

Es gibt viele andere Sammlungen, die verwendet werden können, aber dies sind die guten generischen Array-Ersetzungen.Wenn Sie mehr über diese Optionen erfahren möchten, werfen Sie einen Blick auf diese Liste, die Mark Kraus zusammengestellt hat.

Andere Nuancen

Jetzt, da ich alle wichtigen Funktionen abgedeckt habe, sind hier noch ein paar Dinge, die ich tun wollte, bevor ich das abschließe.,

Arrays in Vorgröße

Ich habe erwähnt, dass Sie die Größe eines Arrays nach seiner Erstellung nicht mehr ändern können. Wir können ein Array mit einer festgelegten Größe erstellen, indem wir es mit dem Konstruktor new($size) aufrufen.

$data = ]::new(4)$data.count4

Arrays multiplizieren

Ein interessanter kleiner Trick ist, dass Sie ein Array mit einer Ganzzahl multiplizieren können.

PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue

Initialisieren mit 0

Ein häufiges Szenario ist, dass Sie ein Array mit allen Nullen erstellen möchten. Wenn Sie nur habenintegers, ein stark typisiertes Array von ganzen Zahlen standardmäßig alle Nullen.,

PS> ]::new(4)0000

Dazu können wir auch den Multiplikationstrick verwenden.

PS> $data = @(0) * 4PS> $data0000

Das Schöne am Multiplikationstrick ist, dass Sie jeden Wert verwenden können. Wenn Sie also lieber 255 als Standardwert haben würden, wäre dies ein guter Weg, dies zu tun.

PS> $data = @(255) * 4PS> $data255255255255

Verschachtelte Arrays

Ein Array innerhalb eines Arrays wird als verschachteltes Array bezeichnet. Ich benutze diese nicht viel in PowerShell, aber ich habe sie mehr in anderen Sprachen verwendet. Erwägen Sie die Verwendung eines Arrays von Arrays, wenn Ihre Daten in ein rasterähnliches Muster passen.,

Hier sind zwei Möglichkeiten, wie wir ein zweidimensionales Array erstellen können.

$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))

Das Komma ist sehr wichtig in diesen Beispielen. Ich habe ein früheres Beispiel für ein normales Array gegebenmultiple Zeilen, in denen das Komma optional war. Das ist bei einem mehrdimensionalen Array nicht der Fall.

Die Art und Weise, wie wir die Indexnotation verwenden, ändert sich geringfügig, da wir ein verschachteltes Array haben. Mit der$data oben würden wir auf den Wert 3 zugreifen.

PS> $outside = 0PS> $inside = 2PS> $data3

Fügen Sie für jede Ebene der Array-Verschachtelung einen Satz Klammer hinzu., Der erste Satz von Klammern ist für das äußerste Array und dann arbeiten Sie sich von dort aus hinein.

Write-Output -NoEnumerate

PowerShell gerne zu packen oder aufzählen von arrays. Dies ist ein Kernaspekt der Art und Weise, wie PowerShell Thepipeline verwendet, aber es gibt Zeiten, in denen Sie nicht möchten, dass dies geschieht.

Ich pipe Objekte häufig an Get-Member, um mehr über sie zu erfahren. Wenn ich ein Array an es weiterleite, wird es entpackt und Get-Member sieht die Mitglieder des Arrays und nicht das eigentliche Array.,

PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...

Um das Auspacken des Arrays zu verhindern, können Sie Write-Object -NoEnumerate.

PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...

Ich habe einen zweiten Weg, der eher ein Hack ist (und ich versuche, solche Hacks zu vermeiden). Sie können acomma vor dem Array platzieren, bevor Sie es pipe.

PS> ,$data | Get-MemberTypeName: System.Object...

Geben Sie ein Array zurück

Dieses Auspacken von Arrays tritt auch auf, wenn Sie Werte von einer Funktion ausgeben oder zurückgeben. Sie können kein Array erhalten, wenn Sie die Ausgabe einer Variablen zuweisen, sodass dies normalerweise kein Problem darstellt.

Der Haken ist, dass Sie ein neues array., Wenn dies jemals ein Problem ist, können SieWrite-Output -NoEnumerate $array oder return ,$array, um es zu umgehen.

Noch etwas?