Arrays er et grundlæggende sprogelement i de fleste programmeringssprog. De er en samling af værdier eller objekter og er derfor vanskelige at undgå. Lad os se nærmere på arrays og alt, hvad de har at tilbyde.

  • Sideindeks
  • hvad er et array?,match
  • $null eller tom
    • Alle -eq
  • Tilføjelse til arrays
    • Array tillæg
    • Plus er lig med +=
    • Pipeline opgave
  • Array-Typer
    • Stærkt skrevet arrays
    • ArrayList
    • Generisk Liste
      • Liste
      • Fjern()
    • Mere samlinger
  • Andre nuancer
    • Pre-størrelse arrays
    • Multiplicere arrays
    • Initialiseret med 0
    • Indlejrede matrixer
    • Skriv-Output -NoEnumerate
      • Returnerer en matrix
  • andet?,
  • Hvad er et array?

    jeg vil starte med en grundlæggende teknisk beskrivelse af, hvad arrays er, og hvordan de anvendes af de fleste programmeringssprog, før jeg skifte til andre måder PowerShell gør brug af dem.

    et array er en datastruktur, der fungerer som en samling af flere elementer. Du kan gentage over arrayet eller få adgang til individuelle elementer ved hjælp af et indeks. Arrayet oprettes som en sekventiel del af hukommelsen, hvor hver værdi gemmes lige ved siden af den anden.

    Jeg vil berøre hver af disse detaljer, mens vi går.,

    grundlæggende brug

    da arrays er et så grundlæggende træk ved Po .ershell, er der en simpel syntaks til at arbejde med dem i Po .ershell.

    Oprette et array med @()

    Et tomt array kan være skabt ved hjælp af @()

     PS> $data = @() PS> $data.count 0

    Vi kan skabe en række, og dækker det med værdier, blot ved at placere dem i @() parentes.

     PS> $data = @('Zero','One','Two','Three') PS> $data.count 4 PS> $data Zero One Two Three

    Dette array har 4 elementer. Når vi kalder variablen $data, ser vi listen over vores varer., Hvis det er en række strenge, så har vi en linje pr.

    Vi kan erklære et array på flere linjer. Kommaet er valgfrit i dette tilfælde og generelt udeladt.

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

    Jeg foretrækker at erklære mine arrays på flere linjer som det. Det bliver ikke kun lettere at læse, når du har flere elementer, det gør det også lettere at sammenligne med tidligere versioner, når du bruger kildekontrol.,

    anden syntaks

    det er almindeligt forstået, at @() er syntaksen til oprettelse af et array, men kommaseparerede lister fungerer det meste af tiden.

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

    Skriv-Output til at skabe arrays

    En cool lille trick værd at nævne, er, at du kan bruge Write-Output for hurtigt at oprette strenge på konsollen.

     $data = Write-Output Zero One Two Three

    Dette er praktisk, fordi du ikke behøver at sætte citater omkring strengene, når parameteren accepterer strenge., Jeg ville aldrig gøre dette i et script, men det er fair spil i konsollen.

    adgang til elementer

    nu hvor du har et array med elementer i det, kan du få adgang til og opdatere disse elementer.

    Offset

    for at få adgang til individuelle elementer bruger vi parenteserne med en offsetværdi, der starter ved 0. Dette er, hvordan vi får det første element i vores array ‘ et:

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

    grunden til, at vi bruger nul her, fordi det første element er i begyndelsen af listen, så vi bruger et offset på 0 elementer til at komme til det., For at komme til det andet element skal vi bruge en forskydning på 1 For at springe over det første element.

     PS> $data One

    Dette ville betyde, at det sidste element er forskudt 3.

     PS> $data Three

    indeks

    nu Kan du se, hvorfor jeg valgte de værdier, jeg gjorde for dette eksempel. Jeg introducerede dette som en forskydning, fordi det er, hvad det egentlig er, men denne forskydning er mere almindeligt omtalt som et indeks. Et indeks, der starter ved 0. For resten af denne artikel vil jeg kalde offset et indeks.,

    specielle indekstricks

    på de fleste sprog kan du kun angive et enkelt nummer som indeks, og du får et enkelt element tilbage. Po .ershell er meget mere fleksibel. Du kan bruge flere indekser på .n gang. Ved at give en liste over indekser kan vi vælge flere elementer.

     PS> $data Zero Two Three

    elementerne vil blive returneret baseret på rækkefølgen af de indekser forudsat. Hvis du duplikerer et indeks, får du den vare begge gange.,

     PS> $data Three Zero Three

    man kan angive en sekvens af tal, med den indbyggede .. operatør.

     PS> $data One Two Three

    Dette fungerer også omvendt.

     PS> $data Three Two One

    Du kan bruge negitive indeksværdier til at udligne fra slutningen. Så hvis du har brug for det sidste element på listen, kan du bruge -1.,

     PS> $data Three

    uden for grænserne

    på de fleste sprog, hvis du forsøger at få adgang til et indeks for et element, der er forbi slutningen af arrayet, vil du få en form for fejl eller en undtagelse. Po .ershell vil stille ikke give dig noget.

     PS> $null -eq $data True

    kan Ikke indeksere i en null-array

    Hvis din variabel er $null og du forsøger at indeksere det som en vifte, du vil få en System.Management.Automation.RuntimeException undtagelse med den besked Cannot index into a null array.,

     PS> $empty = $null SP> $empty Error: Cannot index into a null array.

    Så sørg for, at din arrays er ikke $null før du prøver at få adgang til elementer inde i dem.

    tæller

    Arrays og andre samlinger har en tælleegenskab, der fortæller dig, hvor mange elementer der er i arrayet.

     PS> $data.count 4

    Po .ershell 3.0 tilføjede en tælleegenskab til de fleste objekter. du kan have et enkelt objekt, og det skal give dig en optælling af 1.,

     PS> $date = Get-Date PS> $date.count 1

    Selv $null har en tæller ejendom, bortset fra at det vender tilbage 0.

     PS> $null.count 0

    Der er nogle fælder her, at jeg vil vende, når jeg dækker kontrollerer for $null eller tom arrays senere i denne artikel.

    slukket med en fejl

    der oprettes en almindelig programmeringsfejl, fordi arrays starter ved indeks 0. En off by one fejl kan introduceres på to meget almindelige måder.,

    den første er ved mentalt at tænke, at du vil have det 2.element og bruge et indeks på 2 og virkelig få det tredje element. Eller ved at tænke, at du har4 elementer, og du vil have sidste element, så du vil bare bruge størrelsen til at få adgang til det sidste element.

     $data

    PowerShell er helt tilfreds med at lade dig gøre det, og give dig præcis, hvad varen findes på index 4, $null. Du skal bruge $data.count - 1 eller -1, som vi lærte om ovenstående.,

     PS> $data Three

    Dette er, hvor du kan bruge -1 indeks til at få det sidste element.

     PS> $data Three

    Lee Dailey påpegede også for mig, at vi kan bruge$data.GetUpperBound(0) for at få det maksimale indeksnummer.

     PS> $data.GetUpperBound(0) Three

    den næst mest almindelige måde er, når du gentager listen og bare ikke stopper på det rigtige tidspunkt. Jeg vil revidere dette, når vi taler om at bruge for loop.,

    opdatering af elementer

    Vi kan bruge det samme indeks til at opdatere eksisterende elementer i arrayet. Dette giver os direkte adgang til at opdatere individuelle elementer.

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

    Hvis vi forsøger at opdatere et element, der er forbi sidste element, så får vi en Index was outside the bounds of the array. fejl.

    Jeg vil gense dette senere, når jeg taler om, hvordan man laver et array større.

    Iteration

    på et tidspunkt skal du gå eller gentage hele listen og udføre nogle handlinger for hvert element i arrayet.,

    rørledning

    Arrays og Po .ershell-rørledningen er beregnet til hinanden. Dette er en af de enkleste måder at behandle over disse værdier. Når du sender et array til en rørledning, behandles hvert element inde i arrayet individuelt.

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

    Hvis du ikke har set $PSItem før, bare vide, at dens den samme som $_. Du kan bruge en af dem, fordi de begge repræsenterer det aktuelle objekt i rørledningen.,

    ForEach loop

    ForEach loop fungerer godt med samlinger. Ved hjælp af syntaksen: foreach ( <variable> in <collection> )

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

    ForEach-metoden

    jeg har en tendens til at glemme alt om denne ene, men det fungerer godt for simple operationer. Po .ershell giver dig mulighed for at ringe .ForEach() på en samling.

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

    .foreach() tager en parameter, som er et script blok. Du kan droppe parenteserne og bare give scriptblokken.,

     $data.foreach{"Item "}

    Dette er en mindre kendt syntaks, men det fungerer lige det samme. Denne foreach metode blev tilføjet i Po .ershell 4.0.

    for loop

    for loop bruges stærkt på de fleste andre sprog, men du kan ikke se det meget i Po .ershell. Når du ser det, er det ofte i forbindelse med at gå et array.

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

    Den første ting, vi gør, er at initialisere en $index til 0., Derefter tilføjer vi betingelsen om, at $index skal være mindre end $data.count. Endelig specificerer vi, at hver gang vi sløjfer, skal jeg øge indekset med 1. I dette tilfælde $index++ er en forkortelse for $index = $index + 1.

    Når du bruger en for loop, skal du være særlig opmærksom på tilstanden. Jeg brugte $index -lt $data.count her. Det er meget nemt at få tilstanden lidt forkert for at få en af med en fejl i din logik., Brug af $index -le $data.count eller $index -lt ($data.count - 1) er nogensinde så lidt forkert. Det ville få dit resultat til at behandle for mange eller for få ting. Dette er den klassiske ud af en fejl.

    s .itch loop

    Dette er en, der er meget let at overse. Hvis du giver et array til en s .itch-erklæring, det matcher på hvert element i arrayet.

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

    Dette vil give dette resultat:

     Tick Tock Tick Tock

    Der er en masse fede ting som dette, at vi kan gøre med den switch-sætning., Jeg har en anden artikel dedikeret til dette.

    • Alt hvad du nogensinde ønsket at vide om den switch-sætning

    Opdatering af værdier

    Når dit array er en samling af strengen, eller heltal (værdi-typer), nogle gange vil du ønsker at opdatere værdierne i arrayet, som du loop over dem. De fleste af løkkerne ovenfor bruger en variabel i løkken, der indeholder en kopi af værdien. Hvis du opdaterer denne variabel, opdateres den oprindelige værdi i arrayet ikke.

    undtagelsen fra denne erklæring erfor loop., Hvis du vil gå et array og opdatere værdier inde i det, er for loop det, du leder efter.

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

    dette eksempel tager en værdi for indeks, foretager et par ændringer og bruger derefter det samme indeks til at tildele det tilbage.

    Arrays af objekter

    indtil videre er det eneste, vi har placeret i et array, en værditype, men arrays kan også indeholde objekter.

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

    mange cmdlets returnerer samlinger af objekter som arrays, når du tildeler dem til en variabel.,

     $processList = Get-Process

    alle de grundlæggende funktioner, vi allerede har talt om, gælder stadig for arrays af objekter med et par detaljer, der er værd at påpege.

    adgang til Egenskaber

    Vi kan bruge et indeks til at få adgang til et enkelt element i en samling ligesom med værdityper.

     PS> $data FirstName LastName ----- ---- Kevin Marquette

    Vi kan få adgang til og opdatere egenskaber direkte.,

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

    Array egenskaber

    Normalt vil du nødt til at opregne det hele liste som denne til at få adgang til alle egenskaber:

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

    Eller ved hjælp af Select-Object -ExpandProperty cmdlet.

     PS> $data | Select-Object -ExpandProperty LastName Marquette Doe

    Men PowerShell giver os mulighed for at anmode om LastName direkte. Po .ershell vil opregne dem alle for os og give os en ren liste.,

     PS> $data.LastName Marquette Doe

    opgørelsen sker stadig, men vi ser ikke kompleksiteten bag det.

    hvor-Objektfiltrering

    det er her Where-Object kommer ind, så vi kan filtrere og vælge, hvad vi vil have ud af arrayet baseret på objektets egenskaber.

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

    Vi kan skrive den samme forespørgsel som denne for at få FirstName vi leder efter.,

     $data | Where FirstName -eq Kevin

    Hvor()

    Arrays er en Where() metode på dem, der giver dig mulighed for at angive en scriptblock til filteret.

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

    Denne funktion blev tilføjet i PowerShell 4.0.

    opdatering af objekter i loops

    Med værdityper er den eneste måde at opdatere arrayet på at bruge A for loop, fordi vi er nødt til at kende indekset for at erstatte værdien. Vi har flere muligheder med objekter, fordi de er referencetyper., Her er et hurtigt eksempel:

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

    denne sløjfe går hvert objekt i $data array. Da objekter er referencetyper, refererer variablen$person nøjagtigt det samme objekt, der er i arrayet. Så opdateringer til dets egenskaber vil opdatere originalen.

    Du kan stadig ikke erstatte hele objektet på denne måde. Hvis du forsøger at tildele et nyt objekt til variablen $person, opdaterer du variabelreferencen til noget andet, der ikke længere peger på det originale objekt i arrayet., Dette vil ikke arbejde som du ville forvente:

     foreach($person in $data) { $person = @{ FirstName='Kevin' LastName='Marquette' } }

    Operatører

    operatører i PowerShell også arbejde på arrays. Nogle af dem arbejder lidt anderledes.

    -join

    -join operatør er den mest oplagte, så vi vil se på det først. Jeg kan godt lide -join operatør og bruge det ofte. Det vil slutte sig til alle elementer i arrayet med et tegn eller en streng, som du angiver.,

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

    en af de funktioner, jeg kan lide ved-join operatøren er, at den håndterer enkelte elementer.

     PS> 1 -join '-' 1

    Jeg bruger denne inde logning og verbose meddelelser.

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

    -Deltag i $array

    Her er et smart trick, som Lee Dailey påpegede for mig., Hvis du nogensinde ønsker at deltage i alt, uden skilletegn, i stedet for at gøre dette:

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

    Du kan bruge -join med array, som den parameter, der uden præfiks. Tag et kig på dette eksempel for at se, at jeg taler om.

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

    erstat-og -split

    De andre aktører som f.eks. -replace og -split vil udføre på hvert element i arrayet. Jeg kan ikke sige, at jeg nogensinde har brugt dem på denne måde, men her er et eksempel.,

     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

    -indeholder

    -contains operatør vil give dig mulighed for at kontrollere en række værdier for at se, om det indeholder en bestemt værdi.

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

    -i

    Når du har en enkelt værdi, som du ønsker at kontrollere, matcher et eller flere værdier, kan du bruge -in operatør. Værdien ville være til venstre og arrayet på højre side af operationen.,

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

    dette kan blive dyrt, hvis listen er stor. Jeg vil ofte bruge et rege.mønster, hvis jeg kontrollerer mere end 4-5 værdier.

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

    -E.og-ne

    ligestilling og arrays kan blive kompliceret. Når arrayet er på venstre side, vil hvert element blive sammenlignet. I stedet for at returnere True, returnerer det det objekt, der matcher.,

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

    Når du bruger-ne operatør, får vi alle de værdier, der ikke svarer til vores værdi.

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

    Når du bruger det i en if() erklæring, en værdi, der returneres, er en True værdi. Hvis der ikke returneres nogen værdi, er det en False værdi. Begge disse næste udsagn vil evaluere til True.,

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

    jeg vil vende tilbage til dette i et øjeblik, når vi taler om test for $null.

    -match

    -match operatøren vil forsøge at matche hvert element i samlingen.

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

    Når du bruger -match med en enkelt værdi, en særlig variabel $Matches bliver fyldt med match info. Dette er ikke tilfældet, når en Matri.behandles på denne måde.

    Vi kan tage den samme tilgang med Select-String.,

     $servers | Select-String SQL

    jeg tage et nærmere kig på Select-String-match og $matches variabel i et andet indlæg, kaldes De mange måder at bruge regex.

    $null eller tom

    Test for $null eller tomme arrays kan være vanskelig. Her er de almindelige fælder med arrays.

    på et øjeblik ser denne erklæring ud som om den skal fungere.

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

    men jeg gik lige over, hvordan -eq kontrollerer hvert element i arrayet., Så vi kan få et array af flere elementer med et enkelt $null-værdi, og det ville vurdere, at $true

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

    det er derfor, det er en bedste praksis for at placere $null på venstre side af operatøren. Dette gør dette scenario til et ikke-problem.

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

    $null array er ikke det samme som et tomt array. Hvis du ved, at du har et array, skal du kontrollere antallet af objekter i det., Hvis arrayet er $null, vil tællingen være 0.

     if ( $array.count -gt 0 ) { 'Array is not empty' }

    Der er endnu en fælde at passe på her. Du kan bruge count selvom du har et enkelt objekt, medmindre objektet er et PSCustomObject. Dette er en fejl, der er rettet i Po .ershell 6.1. Det er gode nyheder, men mange mennesker er stadig på 5.1 og skal passe på det.

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

    Hvis du stadig er på PowerShell 5.,1, kan du pakke objektet i et array, før du kontrollerer tællingen for at få en nøjagtig tælling.

     if ( @($array).count -gt 0 ) { 'Array is not empty' }

    for fuldt ud at afspille det sikkert, skal du kontrollere for $null, og kontroller derefter tællingen.

     if ( $null -ne $array -and @($array).count -gt 0 ) { 'Array is not empty' }

    Alle -eq

    jeg har for nylig set nogen spørger, hvordan man kan kontrollere, at hver værdi i et array matcher en given værdi. Reddit bruger/u / bis havde denne smarte løsning, der kontrollerer for eventuelle forkerte værdier og derefter vender resultatet.,

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

    tilføjelse til arrays

    På dette tidspunkt begynder du at undre dig over, hvordan du tilføjer elementer til et array. Det hurtige svar er, at du ikke kan. et array er en fast størrelse i hukommelsen. Hvis du har brug for at dyrke det eller tilføje et enkelt element til det, skal du oprette et nyt array og kopiere alle værdierne fra det gamle array. Dette lyder dyrt og som en masse arbejde, men Po .ershell skjuler kompleksiteten ved at oprette det nye array.

    array-tilføjelse

    Vi kan bruge tilføjelsesoperatøren med arrays til at oprette et nyt array., Så i betragtning af disse to arrays:

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

    Vi kan tilføje dem sammen for at få et nyt array.

     PS> $first + $second Zero One Two Three

    Plus er lig med +=

    Vi kan skabe et nyt array på plads, og tilføj et element til det, som denne:

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

    Bare husk, at hver gang du bruger += som du er overlappe og opretter et nyt array. Dette er ikke et problem for små datasæt, men det skalerer ekstremt dårligt.,

    Pipeline assignment

    Du kan tildele resultaterne af en hvilken som helst pipeline til en variabel. Det vil være en Matri., hvis den indeholder flere elementer.

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

    normalt når vi tænker på at bruge rørledningen, tænker vi på de typiske Po .ershell-liners. Vi kan udnytte rørledningen medforeach() udsagn og andre sløjfer. Så i stedet for at tilføje elementer til en Matri in i en løkke, kan vi slippe elementer på rørledningen.,

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

    Ved at tildele resultatet af foreach til en variabel, vi fange alle de objekter og oprette et enkelt array.

    Array-Typer

    Som standard, et array i PowerShell er oprettet som ] type. Dette gør det muligt at indeholde enhver form for objekt eller værdi. Dette fungerer, fordi alt er arvet fra PSObject type.

    stærkt indtastede arrays

    Du kan oprette en Matri.af enhver type ved hjælp af en lignende syntaks., Når du opretter et stærkt indtastet array, kan det kun indeholde værdier eller objekter den angivne type.

    ArrayList

    tilføjelse af elementer til en Matri.er en af dens største begrænsninger, men der er et par andre samlinger, som vi kan henvende os til, der løser dette problem.

    ArrayList er normalt en af de første ting, vi tænker på, når vi har brug for et array, der er hurtigere at arbejde med. Det fungerer som et objekt array hvert sted, vi har brug for det, men det håndterer tilføje elementer hurtigt.

    Sådan opretter vi et ArrayList og tilføjer elementer til det.,

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

    Vi ringer til.Net for at få denne type. I dette tilfælde bruger vi standardkonstruktøren til at oprette den. Derefter kalder vi Add – metoden for at tilføje et element til det.

    grunden til at jeg bruger i begyndelsen af linjen er at undertrykke returkoden. Nogle. net-opkald vil gøre dette og kan skabe uventet output.

    Hvis de eneste data, du har i dit array, er strings, så tag også et kig på at bruge StringBuilder., Det er næsten det samme, men har nogle metoder, der kun er til at håndtere strenge. StringBuilder er specielt designet til ydeevne.

    • Sammenkæde strenge ved hjælp af StringBuilder

    Det er virkelig almindeligt at se folk gå til ArrayList fra arrays. Men det kommer fra en tid, hvor C# ikke havde generisk støtte., ArrayList afskrives til understøttelse af den generiske List

    generisk liste

    en generisk type er en speciel type I C#, der definerer en generaliseret klasse, og brugeren vil specificere de datatyper, den vil bruge, når den oprettes. Så hvis du vil have en liste over tal eller strenge, vil du definere, at du vil have en liste over int eller string typer.

    Her er hvordan du opretter en liste for strenge.

     $mylist = ]::new()

    eller en liste over tal.,

     $mylist = ]::new()

    Vi kan kaste et eksisterende array til en liste som denne, uden at du opretter objektet først:

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

    Vi kan afkorte den syntaks, der er en lille smule med using namespace erklæring i PowerShell 5 og nyere. Erklæringen using skal være den første linje i dit script. Ved at erklære et navnerum, Po .ershell lader dig lade det være af datatyperne, når du henviser til dem.,

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

    Dette gør List meget mere brugbare.

    du har en lignende Add metode til rådighed for dig. I modsætning til arraylisten er der ingen returværdi på Add metoden, så vi behøver ikke void it.

     $myList.Add(10)

    og vi kan stadig få adgang til elementerne som andre arrays.,

     PS> $myList 10

    Liste

    Du kan have en liste af enhver art, men når man ikke ved den type af objekter, kan du bruge ] til at indeholde dem.

     $list = ]::new()

    Fjern()

    ArrayList og de generiske List både støtte at fjerne genstande fra samlingen.

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

    Når du arbejder med værdityper, fjerner den den første fra listen., Du kan kalde det igen og igen for at fortsætte med at fjerne denne værdi. Hvis du har referencetyper, skal du angive det objekt, du vil fjerne.

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

    Den fjerne metode returnerer true, hvis det var i stand til at finde og fjerne elementet fra samlingen.

    flere samlinger

    Der er mange andre samlinger, der kan bruges, men disse er de gode generiske array udskiftninger., Hvis du er interesseret i at lære om flere af disse muligheder, tage et kig på dette resum., at Mark Kraus sat sammen.

    andre nuancer

    nu hvor jeg har dækket al den store funktionalitet, er her et par flere ting, som jeg ville nævne, før jeg pakker dette op.

    Pre-si .ed arrays

    jeg nævnte, at du ikke kan ændre størrelsen på et array, når det er oprettet. Vi kan oprette en Matri.med en forudbestemt størrelse ved at kalde den med new($size) konstruktør.,

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

    Multiplicere arrays

    En interessant lille trick er, at du kan gange et array af heltal.

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

    Initialiser med 0

    et almindeligt scenario er, at du vil oprette et array med alle nuller. Hvis du kun vil have heltal, vil en stærkt indtastet vifte af heltal som standard til alle nuller.

     PS> ]::new(4) 0 0 0 0

    Vi kan også bruge multiplikationstrick til at gøre dette.,

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

    det gode ved at multiplicere tricket er, at du kan bruge en hvilken som helst værdi. Så hvis du hellere vil have 255 som din standardværdi, ville dette være en god måde at gøre det på.

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

    Indlejrede matrixer

    Et array inde i et array kaldes en indlejret array. Jeg bruger ikke disse meget i Po .ershell, men jeg har brugt dem mere på andre sprog. Overvej at bruge en række arrays, når dine data passer ind i et gitter som mønster.

    Her er to måder, vi kan oprette et 2-dimensionelt array på.,

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

    kommaet er meget vigtigt i disse eksempler. Jeg gav et tidligere eksempel på et normalt array på flere linjer, hvor kommaet var valgfrit. Det er ikke tilfældet med et multidimensionelt array.

    den måde, vi bruger indeksnotationen på, ændres lidt nu, hvor vi har et indlejret array. Brug af $data ovenfor, Sådan får vi adgang til værdien 3.

     PS> $outside = 0 PS> $inside = 2 PS> $data 3

    Tilføj et sæt beslag for hvert niveau af array redebygning., Det første sæt parenteser er til det yderste mest array, og så arbejder du dig ind derfra.

    Writerite-Output-NoEnumerate

    Po .ershell kan lide at pakke eller opregne arrays. Dette er et centralt aspekt af den måde, Po .ershell bruger rørledningen på, men der er tidspunkter, hvor du ikke ønsker, at det skal ske.

    Jeg rør ofte objekter til Get-Member for at lære mere om dem. Når jeg rør et array til det, det bliver pakket ud, og Get-Member ser medlemmerne af arrayet og ikke det faktiske array.,

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

    for at forhindre denne udpakning af arrayet kan du bruge Write-Object -NoEnumerate.

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

    Jeg har en anden måde at gøre dette på, der er mere et hack (og jeg prøver at undgå hacks som dette). Du kan placere et komma foran arrayet, før du rør det.

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

    returner et array

    Denne un-indpakning af arrays sker også, når du udsender eller returnerer værdier fra en funktion., Du kan stadig få et array, hvis du tildeler output til en variabel, så dette er ikke almindeligt et problem.

    fangsten er, at du vil have en ny Matri.. Hvis det nogensinde er et problem, kan du bruge Write-Output -NoEnumerate $array eller return ,$array til at omgå det.

    noget andet?

    Jeg ved, at det hele er meget at tage ind. Mit håb er, at du vil lære noget fra denne artikel, hver gang du læser det, og at det vil vise sig at være en god reference for dig i lang tid fremover., Hvis du fandt, at dette var nyttigt, kan du dele det med andre, som du tror vil få værdi ud af det.herfra vil jeg anbefale dig at tjekke et lignende indlæg, som jeg skrev om hashtables.

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *