Arrays sind ein grundlegendes Sprachmerkmal der meisten Programmiersprachen. Sie sind eine Sammlung von Werten oder Objekten und daher schwer zu vermeiden. Schauen wir uns Arrays und alles, was sie zu bieten haben, genau an.
- Seitenindex
- Was ist ein Array?,match
- All-eq
- Array Addition
- Plus equals +=
- Pipeline assignment
- Stark typisierte Arrays
- ArrayList
- Generische Liste
- List
- Remove()
- More collections
- Pre-sized arrays
- Multiplying arrays
- Initialize with 0
- Nested arrays
- Write-Output-NoEnumerate
- Return an array
Was ist ein array?
Ich werde mit einer grundlegenden technischen Beschreibung beginnen, was Arrays sind und wie sie von den meisten 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 das Array iterieren oder über einen Index auf einzelne Elemente zugreifen. Das Array wird als sequentieller Speicherblock 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 mit ihnen in PowerShell.
Erstellen Sie ein Array mit @()
Mit @()
PS> $data = @() PS> $data.count 0
können wir ein Array erstellen und mit Werten versehen, indem wir sie einfach in die@()
Klammern setzen.
PS> $data = @('Zero','One','Two','Three') PS> $data.count 4 PS> $data Zero One Two Three
Das array hat 4 Elemente. Wenn wir die Variable $data
, wird die Liste unserer Elemente angezeigt., Wenn es sich um ein Array von Zeichenfolgen handelt, haben wir eine Zeile pro Zeichenfolge.
Wir können ein Array in mehreren Zeilen deklarieren. Das Komma ist in diesem Fall optional und im Allgemeinen weggelassen.
$data = @( 'Zero' 'One' 'Two' 'Three' )
Ich bevorzuge es, meine Arrays in mehreren Zeilen so zu deklarieren. Es wird nicht nur einfacher zu lesen, wenn Sie mehrere Elemente haben, sondern erleichtert auch den Vergleich mit früheren Versionen, wenn Sie die Quellcodeverwaltung verwenden.,
Andere Syntax
Es ist allgemein bekannt, dass @()
die Syntax zum Erstellen eines Arrays ist, aber kommagetrennte Listen funktionieren meistens.
$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 Zeichenfolgen an der Konsole zu erstellen.
$data = Write-Output Zero One Two Three
Dies ist praktisch, da Sie keine Anführungszeichen um die Zeichenfolgen setzen müssen, wenn der Parameter Zeichenfolgen akzeptiert., 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. So erhalten wir das erste Element in unserem Array:
PS> $data = 'Zero','One','Two','Three' PS> $data Zero
Der Grund, warum wir hier Null verwenden, liegt darin, dass sich das erste Element am Anfang der Liste befindet, sodass wir einen Offset von 0 Elementen verwenden, um dorthin zu gelangen., Um zum zweiten Element zu gelangen, müssten wir einen Versatz von 1 verwenden, um das erste Element zu überspringen.
PS> $data One
Dies würde bedeuten, dass sich das letzte Element auf Offset 3 befindet.
Index
Jetzt können Sie sehen, warum ich die Werte ausgewählt habe, die ich für dieses Beispiel gemacht habe. Ich habe dies als Offset eingeführt, weil es das ist, was es wirklich ist, aber dieser Offset wird häufiger als Index bezeichnet. Ein Index, der bei 0
beginnt. 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 von Indizes können wir mehrere Elemente auswählen.
PS> $data Zero Two Three
Die Elemente werden basierend auf der Reihenfolge der bereitgestellten Indizes zurückgegeben. Wenn Sie einen Index duplizieren, erhalten Sie dieses Element beide Male.,
PS> $data Three Zero Three
Wir können eine Folge von Zahlen mit dem eingebauten ..
Operator angeben.
PS> $data One Two Three
Dies funktioniert auch Umgekehrt.
PS> $data Three Two One
Sie können negitive Indexwerte verwenden, um vom Ende auszugleichen. Wenn Sie also das letzte Element in der Liste benötigen, können Sie -1
.,
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 wird Ihnen stillschweigend nichts geben.
PS> $null -eq $data True
Kann nicht in ein Null-Array indiziert werden
Wenn Ihre Variable $null
ist und Sie versuchen, sie wie ein Array zu indizieren, erhalten Sie eine System.Management.Automation.RuntimeException
Ausnahme mit der Meldung 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.
PS> $data.count 4
PowerShell 3.0 Hinzugefügt, eine count-Eigenschaft, um die meisten Objekte. sie können ein einzelnes Objekt haben und es sollte Ihnen eine Anzahl von 1
.,
PS> $date = Get-Date PS> $date.count 1
Sogar $null
hat eine count-Eigenschaft, außer es gibt 0
.
PS> $null.count 0
Hier gibt es einige Fallen, die ich noch einmal aufsuchen werde, wenn ich in diesem Artikel nach $null
oder leeren Arrays suche.
Aus durch einen Fehler
Ein häufiger Programmierfehler wird erzeugt, da Arrays bei Index 0 beginnen. Ein Aus durch einen Fehler kann auf zwei sehr häufige Arten eingeführt werden.,
Das erste ist, indem Sie mental denken, dass Sie das 2. Element möchten und einen Index von 2
und wirklich das dritte Element erhalten. Oder indem Sie denken, dass Sie 4
Elemente haben und das letzte Element möchten, verwenden Sie einfach die Größe, 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 $data.count - 1
oder die -1
, die wir oben erfahren haben.,
Hier können Sie den -1
Index verwenden, um das letzte Element abzurufen.
Lee Dailey wies mich auch darauf hin, dass wir $data.GetUpperBound(0)
verwenden können, um die maximale Indexnummer zu erhalten.
PS> $data.GetUpperBound(0) Three
Der zweithäufigste Weg ist beim Iterieren der Liste und einfach nicht zum richtigen Zeitpunkt anzuhalten. Ich werde dies noch einmal wiederholen, wenn wir über die Verwendung der for
Schleife sprechen.,
Elemente aktualisieren
Wir können denselben Index verwenden, um vorhandene Elemente im Array zu aktualisieren. Dies gibt uns direkten Zugriff auf einzelne Elemente zu aktualisieren.
$data = 'dos' $data = 'tres'
Wenn wir versuchen, ein Element zu aktualisieren, das über dem letzten Element liegt, erhalten wir einen Index 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 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 beide 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, diesen zu vergessen, aber er funktioniert gut für einfache Operationen. Mit PowerShell können Sie .ForEach()
für eine Sammlung aufrufen.
PS> $data.foreach({"Item "}) Item Item Item Item
Die .foreach()
nimmt einen Parameter an, der ein Skriptblock ist. Sie können die Klammern löschen und einfach den Skriptblock bereitstellen.,
$data.foreach{"Item "}
Dies ist eine weniger bekannte Syntax, aber sie funktioniert genauso. Dieseforeach
– Methode wurde in PowerShell 4.0 hinzugefügt.
For loop
Die for
Schleife wird in den meisten anderen Sprachen stark verwendet, aber Sie sehen es in PowerShell nicht viel. Wenn Sie es sehen, ist es oft im Zusammenhang mit dem Gehen eines Arrays.
for ( $index = 0; $index -lt $data.count; $index++) { "Item: " -f $data }
Als erstes initialisieren wir eine $index
zu 0
., Dann fügen wir die Bedingung hinzu, dass $index
kleiner als $data.count
sein muss. Schließlich geben wir an, dass ich bei jeder Schleife den Index um 1
erhöhen muss. In diesem Fall ist $index++
die Abkürzung für $index = $index + 1
.
Wenn Sie eine for
Schleife verwenden, achten Sie besonders auf die Bedingung. Ich habe hier $index -lt $data.count
verwendet. Es ist sehr einfach, die Bedingung etwas falsch zu machen, um einen Fehler in Ihrer Logik zu vermeiden., Die Verwendung von $index -le $data.count
oder $index -lt ($data.count - 1)
ist so leicht falsch. Das würde dazu führen, dass Ihr Ergebnis zu viele oder zu wenige Elemente verarbeitet. Dies ist der Klassiker von einem Fehler.
Schalter schleife
Dies ist eine, die ist sehr einfach zu übersehen. Wenn Sie ein Array für eine switch-Anweisung bereitstellen, stimmt es mit jedem Element im Array überein.
$data = 'Zero','One','Two','Three' switch( $data ) { 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' } }
Dies erzeugt diese Ausgabe:
Tick Tock Tick Tock
Es gibt viele coole Dinge wie diese, die wir mit der switch-Anweisung machen können., Ich habe 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 der Schleife, 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 durchsuchen und darin Werte aktualisieren möchten, suchen Sie nach der Schleife for
.
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, Arrays können jedoch auch Objekte enthalten.
$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 Details, die es wert sind, darauf hingewiesen zu werden.
Zugriff auf Eigenschaften
Wir können einen Index verwenden, um auf ein einzelnes Element in einer Sammlung zuzugreifen, genau wie bei Werttypen.
PS> $data FirstName LastName ----- ---- Kevin Marquette
Wir können direkt auf Eigenschaften zugreifen und diese aktualisieren.,
PS> $data.FirstName Kevin PS> $data.FirstName = 'Jay' PS> $data FirstName 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} Marquette Doe
Oder mit der Select-Object -ExpandProperty
cmdlet.
PS> $data | Select-Object -ExpandProperty LastName Marquette Doe
PowerShell bietet uns jedoch die Möglichkeit, LastName
direkt anzufordern. PowerShell wird sie alle für uns aufzählen und uns eine saubere Liste geben.,
PS> $data.LastName Marquette Doe
Die Aufzählung noch passiert, aber wir sehen nicht die Komplexität dahinter.
Where-Object filtering
Hier kommt Where-Object
, damit wir basierend auf den Eigenschaften des Objekts filtern und auswählen können, was wir aus dem Array wollen.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'} FirstName LastName ----- ---- Kevin Marquette
Wir können dieselbe Abfrage wie diese schreiben, um die zu erhalten FirstName
Wir suchen.,
$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 genau auf dasselbe Objekt im Array. Also Updates zu seinen Eigenschaften werden das Original aktualisieren.
Sie können immer noch nicht das gesamte Objekt auf diese Weise ersetzen. Wenn Sie versuchen, der Variablen ein neues Objekt zuzuweisen, aktualisieren Sie den Variablenbezug auf etwas anderes, das nicht mehr auf das ursprüngliche Objekt im Array verweist., Dies funktioniert nicht wie erwartet:
foreach($person in $data) { $person = @{ FirstName='Kevin' LastName='Marquette' } }
Operatoren
Die Operatoren in PowerShell funktionieren auch auf Arrays. Einige von ihnen arbeiten etwas anders.
– join
Der Operator -join
ist der offensichtlichste, daher werden wir ihn zuerst betrachten. Ich mag den Operator -join
und benutze ihn oft. Es verbindet alle Elemente im Array mit einem Zeichen oder einer Zeichenfolge, die Sie angeben.,
PS> $data = @(1,2,3,4) PS> $data -join '-' 1-2-3-4 PS> $data -join ',' 1,2,3,4
Eine der Funktionen, die ich am -join
– Operator mag, ist, dass er einzelne Elemente behandelt.
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 $array
Hier ist ein cleverer trick, Lee Dailey mir darauf hingewiesen., Wenn Sie jemals alles ohne Trennzeichen verbinden möchten, anstatt dies zu tun:
PS> $data = @(1,2,3,4) PS> $data -join $null 1234
Sie können -join
mit dem Array als Parameter ohne Präfix verwenden. Schauen Sie sich dieses Beispiel an, um zu sehen, wovon ich spreche.
PS> $data = @(1,2,3,4) PS> -join $data 1234
-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-01 LAX-SQL-02 LAX-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 Sie den Operator -in
verwenden. Der Wert befindet sich links und das Array rechts von der Operation.,
PS> $data = @('red','green','blue') PS> 'green' -in $data True
Das kann teuer werden, wenn die Liste groß ist. Ich werde oft ein Regex-Muster verwenden, wenn ich mehr als 4-5 Werte überprüfe.
PS> $data = @('red','green','blue') PS> $pattern = "^({0})$" -f ($data -join '|') PS> $pattern ^(red|green|blue)$ PS> 'green' -match $pattern True
-eq,- ne
der Geschlechter und arrays kann kompliziert werden. Wenn sich das Array auf der linken Seite befindet, wird jedes Element verglichen. Anstatt True
, 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' red blue
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 zu True
ausgewertet.,
$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 überprüfen, wenn wir über das Testen auf $null
sprechen.
– match
Der Operator -match
versucht, jedes Element in der Sammlung abzugleichen.
Wenn Sie -match
mit einem einzigen Wert verwenden, wird eine spezielle Variable $Matches
mit Übereinstimmungsinformationen 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 namens The many ways to use regex genauer an.
$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., Wir können also ein Array von mehreren Elementen mit einem einzigen $null-Wert haben 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' }
$null
array ist nicht das gleiche wie ein leeres array. Wenn Sie wissen, dass Sie ein Array haben, überprüfen Sie die Anzahl der Objekte darin., Wenn das Array $null
, ist die Anzahl 0
.
if ( $array.count -gt 0 ) { 'Array is not empty' }
Hier gibt es noch eine weitere Falle, auf die Sie achten müssen. Sie können die count
auch dann verwenden, wenn Sie ein einzelnes Objekt 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 sind immer noch auf PowerShell 5.,1 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 is not 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 is not 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 umdreht.,
$results = Test-Something if ( -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 Sie nicht können. Ein Array hat eine feste Größe im Speicher. Wenn Sie es vergrößern oder ein einzelnes Element hinzufügen müssen, müssen Sie ein neues Array erstellen und alle Werte aus dem alten Array kopieren. Das klingt teuer und wie viel Arbeit, PowerShell verbirgt jedoch die Komplexität der Erstellung des neuen Arrays.
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 zu einem neuen Array hinzufügen.
PS> $first + $second Zero One Two Three
Plus equals +=
Wir können ein neues Array erstellen und ein Element wie folgt hinzufügen:
$data = @( 'Zero' 'One' 'Two' 'Three' ) $data += 'four'
Denken Sie daran, dass jedes Mal, wenn Sie +=
div > dass Sie duplizieren und ein neues Array erstellen. Dies ist kein Problem für kleine Datensätze, aber es skaliert extrem schlecht.,
Pipeline-Zuweisung
Sie können die Ergebnisse einer Pipeline einer Variablen zuweisen. Es wird ein Array sein, wenn es mehrere Elemente 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 nutzen. Anstatt Elemente zu einem Array in einer Schleife hinzuzufügen, können wir Elemente in der Pipeline ablegen.,
$array = foreach ( $node in (1..5)) { "ATX-SQL-$node" }
Durch Zuweisen der Ergebnisse der foreach
zu einer Variablen erfassen wir alle Objekte und erstellen ein einzelnes Array.
Array-Typen
Standardmäßig wird ein Array in PowerShell als ]
– Typ erstellt. Dadurch kann es jede Art von Objekt oder Wert enthalten. 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 Sammlungen, an die wir uns wenden können, um dieses Problem zu lösen.
Die ArrayList
ist häufig eines der ersten Dinge, an die wir denken, wenn wir ein Array benötigen, mit dem wir schneller arbeiten können. Es verhält sich wie ein Objekt an jedem Ort, an dem wir es brauchen, aber es behandelt das Hinzufügen von Elementen 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 ihn 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. Einige. 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 StringBuilder an., Es ist fast dasselbe, hat aber einige Methoden, die nur für den Umgang mit Strings gedacht sind. Die StringBuilder
wurde speziell für die Leistung entwickelt.
- Verketten Sie Strings mit StringBuilder
Es ist wirklich üblich, dass Leute von Arrays zu ArrayList
wechseln. Aber es kommt aus einer Zeit, in der C# keine generische Unterstützung hatte., Die ArrayList
wird zur Unterstützung der generischen List
Generische Liste
Ein generischer Typ ist ein spezieller Typ in C#, der eine generalisierte Klasse definiert, und der Benutzer gibt die Datentypen an, die beim Erstellen verwendet werden. Wenn Sie also eine Liste von Zahlen oder Zeichenfolgen wünschen, würden Sie definieren, dass Sie eine Liste der Typen int
oder string
möchten.
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. Dieusing
Anweisung muss die erste Zeile Ihres Skripts sein. Wenn Sie einen Namespace deklarieren, können Sie ihn mit PowerShell von den Datentypen lassen, wenn Sie auf sie verweisen.,
using namespace System.Collections.Generic $myList = ]@(1,2,3)
Dadurch ist die List
wesentlich nutzbarer.
Sie haben eine ähnliche Add
Methode zur Verfügung. Im Gegensatz zur ArrayList gibt es keinen Rückgabewert für die Methode Add
, sodass wir sie nicht void
müssen.
$myList.Add(10)
, Und wir können immer noch Zugang zu den Elementen, wie andere arrays.,
PS> $myList 10
List
Sie können eine Liste eines beliebigen Typs haben, aber wenn Sie den Typ der Objekte nicht kennen, können 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") Zero One Three
Wenn Sie mit Werttypen arbeiten, 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 diesen Kern, den Mark Kraus zusammengestellt hat.
Andere Nuancen
Nachdem ich nun alle wichtigen Funktionen abgedeckt habe, sind hier noch ein paar Dinge, die ich erwähnen wollte, bevor ich dies abschließt.
Arrays in Vorgröße
Ich habe erwähnt, dass Sie die Größe eines Arrays nicht ändern können, sobald es erstellt wurde. Wir können ein Array mit einer festgelegten Größe erstellen, indem wir es mit dem Konstruktor aufrufen.,
$data = ]::new(4) $data.count 4
Arrays multiplizieren
Ein interessanter kleiner Trick ist, dass Sie ein Array mit einer Ganzzahl multiplizieren können.
PS> $data = @('red','green','blue') PS> $data * 3 red green blue red green blue red green blue
Initialisieren mit 0
Ein häufiges Szenario ist, dass Sie ein Array mit allen Nullen erstellen möchten. Wenn Sie nur Ganzzahlen haben, wird ein stark typisiertes Array von Ganzzahlen standardmäßig auf alle Nullen gesetzt.
PS> ]::new(4) 0 0 0 0
Dazu können wir auch den Multiplikationstrick verwenden.,
PS> $data = @(0) * 4 PS> $data 0 0 0 0
Das Schöne am Multiplikationstrick ist, dass Sie jeden Wert verwenden können. Wenn Sie also lieber 255
als Standardwert haben möchten, ist dies ein guter Weg.
PS> $data = @(255) * 4 PS> $data 255 255 255 255
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 2-dimensionales 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 in mehreren Zeilen gegeben, in denen das Komma optional war. Dies 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 = 0 PS> $inside = 2 PS> $data 3
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 die Pipeline 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-Member TypeName: System.String ...
Um das Auspacken des Arrays zu verhindern, können Sie .
PS> Write-Output -NoEnumerate $data | Get-Member TypeName: System.Object ...
Ich habe eine zweite Möglichkeit, dies zu tun, die eher ein Hack ist (und ich versuche, solche Hacks zu vermeiden). Sie können ein Komma vor dem Array platzieren, bevor Sie es pipe.
PS> ,$data | Get-Member TypeName: System.Object ...
Geben Sie ein Array zurück
Dieses Un-Wrapping von Arrays tritt auch auf, wenn Sie Werte von einer Funktion ausgeben oder zurückgeben., Sie können immer noch ein 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 Sie Write-Output -NoEnumerate $array
oder return ,$array
, um es zu umgehen.
Noch etwas?
ich weiß, das alles ist eine Menge zu nehmen in. Ich hoffe, dass Sie jedes Mal, wenn Sie es lesen, etwas aus diesem Artikel lernen und dass es sich für Sie noch lange als gute Referenz erweisen wird., Wenn Sie dies hilfreich fanden, teilen Sie es bitte mit anderen, von denen Sie denken, dass sie Wert daraus ziehen.
Von hier aus würde ich Ihnen empfehlen, einen ähnlichen Beitrag zu lesen, den ich über Hashtables geschrieben habe.