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
  • $null oder leer
    • All-eq
  • Hinzufügen zu Arrays
    • Array Addition
    • Plus equals +=
    • Pipeline assignment
  • Array Types
    • Stark typisierte Arrays
    • ArrayList
    • Generische Liste
      • List
      • Remove()
    • More collections
  • Other collections
    • Pre-sized arrays
    • Multiplying arrays
    • Initialize with 0
    • Nested arrays
    • Write-Output-NoEnumerate
      • Return an array
  • Noch etwas?,
  • 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 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 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.countsein muss. Schließlich geben wir an, dass ich bei jeder Schleife den Index um 1erhö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 -ExpandPropertycmdlet.

     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 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 überprüfen, wenn wir über das Testen auf $nullsprechen.

    – 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 $nullauf 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.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.