- 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 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 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 1
erhö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 -join
und 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 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 wiederholen, wenn wir über das Testen auf $null
sprechen.
– 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.
Schreibe einen Kommentar