• 10/08/2020
  • 24 minutter på at læse
    • j
    • h
    • s
    • V

Arrays er en grundlæggende sproglige træk i de fleste programmeringssprog. De er en samling af værdier eller genstande, der er vanskelige at undgå. Lad os se nærmere på arrays og alt hvad de har at tilbyde.,

Bemærk

den originale version af denne artikel blev vist på bloggen skrevet af @Kevinmar .uette. Thepo .ershell team tak Kevin for at dele dette indhold med os. Tjek venligst hans blog atPowerShellExplained.com.

Hvad er en Matri??

Jeg vil starte med en grundlæggende teknisk beskrivelse af, hvad arrays er, og hvordan de bruges af de fleste programmeringssprog, før jeg skifter til de andre måder, Po .ershell bruger dem på.

et array er en datastruktur, der fungerer som en samling af flere elementer., Du kan gentage over thearray 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

Fordi arrays er sådan en grundlæggende funktion af PowerShell, der er en simple syntaks for at arbejde withthem i PowerShell.,

Opret et array

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

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

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.count4PS> $dataZeroOneTwoThree

dette array har 4 elementer. Når vi kalder variablen $data, ser vi listen over vores varer. Hvis det er anarray af strenge, så får vi en linje pr.

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

$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 sourcecontrol.

anden syntaks

det er almindeligt forstået, at @() er syntaksen til oprettelse af et array, men kommaseparerede listsworkork 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 stringsat konsollen.

$data = Write-Output Zero One Two Three

Dette er praktisk, fordi du ikke behøver at lægge citater rundt om strengene, når parameteren acceptererstrings. 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. Det ersådan vi får det første element i vores array ‘ et:

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

grunden til, at vi bruger nul her, fordi det første element er i begyndelsen af listen, så vi usean offset på 0 elementer til at komme til det. For at komme til det andet punkt, ville vi nødt til at bruge en forskydning af 1 toskip det første punkt.

PS> $dataOne

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

PS> $dataThree

indeks

nu Kan du se, hvorfor jeg valgte de værdier, jeg gjorde for dette eksempel. Jeg introducerede dette som en offsetbecause det er, hvad det egentlig er, men denne forskydning er mere almindeligt omtalt som et indeks. Aninde., 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 overindeks, kan vi vælge flere elementer.

PS> $dataZeroTwoThree

elementerne returneres baseret på rækkefølgen af de angivne indekser. Hvis du duplikerer et indeks, får du denne vare begge gange.

PS> $dataThreeZeroThree

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

PS> $dataOneTwoThree

Dette fungerer også omvendt.

PS> $dataThreeTwoOne

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

PS> $dataThree

uden for grænserne

på de fleste sprog, hvis du forsøger at få adgang til et indeks over et element, der er forbi slutningen af arrayet, vil du få en form for fejl eller en undtagelse. Po .ershell returnerer intet lydløst.

PS> $null -eq $dataTrue

kan Ikke indeksere i en null-array

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

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

så sørg for, at dine arrays ikke er $null, før du forsøger 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.count4

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

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

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

PS> $null.count0

Der er nogle fælder her, som jeg vil besøge igen, når jeg dækker kontrol for $null eller tomme arrayslater i denne artikel.

Off-by-one-fejl

en almindelig programmeringsfejl oprettes, fordi arrays starter ved indeks 0. Off-by-one fejl kan væreindført på to måder.

den første er ved mentalt at tænke, at du vil have det andet element og bruge et indeks på 2 og virkelig få det tredje element. Eller ved at tænke, at du har fire varer, og du vil have sidste element, så du bruger tællettil 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> $dataThree

Her kan du bruge -1 indekset for at få det sidste element.

PS> $dataThree

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

PS> $data.GetUpperBound(0)3PS> $dataThree

den næst mest almindelige måde er, når du gentager listen og ikke stopper på det rigtige tidspunkt. Jeg besøger 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 tilopdater individuelle varer.

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

Hvis vi forsøger at opdatere et element, der er forbi sidste element, så får vi enIndex 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 muligvis gå eller gentage hele listen og udføre nogle handlinger for hvert emne i arrayet.

rørledning

Arrays og Po .ershell-rørledningen er beregnet til hinanden. Dette er en af de enkleste måder atbehandle 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 det er det samme som $_., Du kan også bruge en, fordi de begge repræsenterer det aktuelle objekt i rørledningen.

ForEach loop

ForEach loop fungerer godt med samlinger. Brug af syntaksen:foreach ( <variable> in <collection> )

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

ForEach metode

Jeg har en tendens til at glemme denne, men den fungerer godt til enkle 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, der er en scriptblok., Du kan slippe parenteserne og baregive scriptblokken.

$data.foreach{"Item "}

Dette er en mindre kendt syntaks, men det virker bare det samme. Denne foreach metode blev tilføjet inpo .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å en Matri..

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 øgeindeks 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 nemt at få tilstanden lidt forkert for at få en off-by-oneerror i din logik., Brug af $index -le $data.count eller $index -lt ($data.count - 1) er nogensinde lidt forkert. Det ville få dit resultat til at behandle for mange eller for få ting. Dette er den klassiske off-by-one-fejl.

Skift loop

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

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

Der er mange seje ting, vi kan gøre med S .itch-sætningen. Jeg har en anden artikuleret 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 ønsker du måske toupdate de værdier i arrayet, som du loop over dem. De fleste af løkkerne ovenfor bruger en variabel iLoop, der har en kopi af værdien. Hvis du opdaterer denne variabel, er den oprindelige værdi i arrayetikke opdateret.

undtagelsen fra denne erklæring erfor loop., Hvis du vil gå et array og opdatere værdierinde i det, så 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 tilbage.

Arrays af objekter

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

$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 nogle få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> $dataFirstName LastName----- ----Kevin Marquette

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

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName 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}MarquetteDoe

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

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

Men PowerShell giver os mulighed for at anmode om LastName direkte. Po .ershell opregner themall for os og returnerer en ren liste.

PS> $data.LastNameMarquetteDoe

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 arraybaseret på objektets egenskaber.

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

Vi kan skrive den samme forespørgsel 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 Po .ershell 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 skal vide theinde.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 itsproperties opdaterer 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 fungerer ikke som du ville forvente:

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

operatører

operatørerne i Po .ershell arbejder også på arrays. Nogle af dem arbejder lidt anderledes.

-join

-join operatør er den mest oplagte, så lad os se på det først., Jeg kan godt lide -joinoperatør og bruge det ofte. Det forbinder alle elementer i arrayet med det tegn eller streng, somdu angiver.

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

en af de funktioner, som 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 everythingwithout en afgrænsning, i stedet for at gøre dette:

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

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

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

erstat-og -split

De andre aktører som f.eks. -replace og -split 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-01LAX-SQL-02LAX-SQL-03

-indeholder

-contains operatøren giver dig mulighed for at kontrollere en række værdier for at se, om det indeholder en specifiedvalue.

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

-i

Når du har en enkelt værdi, som du ønsker at kontrollere, svarer til en af flere værdier, skal du canuse -in operatør. Værdien ville være til venstre og arrayet på højre side af operator.

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

dette kan blive dyrt, hvis listen er stor. Jeg bruger ofte et rege.mønster, hvis jeg tjekker mere end nogle få værdier.,

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

-E.og-ne

ligestilling og arrays kan blive kompliceret. Når arrayet er på venstre side, får hvert elementsammenlignet. I stedet for at returnere True, returnerer det objektet, 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'redblue

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 vurderer til True.

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

Jeg vil revidere dette i et øjeblik, når vi taler om test for $null.

-match

-match operatøren forsøger 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-01ATX-SQL-01

Når du bruger -match med en enkelt værdi, en særlig variabel $Matches bliver fyldt med matchinfo., Dette er ikke tilfældet, når et array 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, calledThe 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å en bred vifte af severalitems med en 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ørDette scenario 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 kontrollereantal objekter i den., Hvis arrayet er $null, er tællingen 0.

if ( $array.count -gt 0 ){ "Array isn't 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å Po .ershell 5.1, kan du pakke objektet i et array, før du kontrollerer tællingen tilfå en nøjagtig optælling.,

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

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

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

All-e.

Jeg har for nylig set nogen spørge, hvordan man kontrollerer, 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 slipper resultatet.

$results = Test-Somethingif ( -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 vokse det eller tilføje et enkelt element til det, sådu skal oprette et nyt array og kopiere alle værdierne fra det gamle array. Dette lyder som en masse arbejde, men Po .ershell skjuler kompleksiteten ved at oprette det nye array. Po .ershellimplements tilføjelsen operatør (+) for arrays.

Bemærk

Po .ershell implementerer ikke en subtraktionsoperation. Hvis du vil have et fleksibelt alternativ til anarray, skal du bruge et generisk List objekt.,

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')

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

PS> $first + $secondZeroOneTwoThree

Plus er lig med +=

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

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

Bare husk, at hver gang du bruger += at du kopierer og opretter et nyt array. Thisis et 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 er et array, hvis det indeholder multipleitems.

$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 kangennemføre rørledningen medforeach() udsagn og andre sløjfer. Så i stedet for at tilføje elementer til anarray i en løkke, vi kan slippe elementer på rørledningen.

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

Array-Typer

Som standard, et array i PowerShell er oprettet som ] type., Dette gør det muligt at indeholdeenhver type 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 array er en af dens største begrænsninger, men der er et par andre samlingerat vi kan henvende os til at løse 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 addingitems 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 tilOpret det. 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. Some.NET opkald gør dette og kan skabe uventet output.

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

det er almindeligt at se folk flytte til ArrayList fra arrays. Men det kommer fra en tid, hvor C# didn ‘ thave generisk støtte., ArrayList er forældet 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 specificerer datatyper, den bruger, 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 for tal.,

$mylist = ]::new()

Vi kan kaste et eksisterende array til en liste som denne uden at oprette objektet første:

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

Vi kan forkorte syntaks med using namespace erklæring i PowerShell 5 og nyere. Erklæringenusing skal være den første linje i dit script. Ved at erklære et navnerum, Po .ershelllets du forlader det ud af datatyperne, når du referere 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 metode, så vi behøver ikkevoid it.

$myList.Add(10)

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

PS> $myList10

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")ZeroOneThree

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 objektet, som du vil fjerne.,

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

Den fjerne metoden 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å thisGist thatMark Kraus sat sammen.

andre nuancer

nu hvor jeg har dækket alle de store funktioner, her er et par flere ting, som jeg ønskede tomention 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 ofa afen forudbestemt størrelse ved at kalde den med new($size) constructor.

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

multiplicere arrays

et interessant lille trick er, at du kan multiplicere et array med et heltal.

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

Initialiser med 0

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

PS> ]::new(4)0000

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

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

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

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

indlejrede arrays

et array inde i et array kaldes et 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 gitterlignende mønster.,

Her er to måder, vi kan oprette et todimensionelt 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 = 0PS> $inside = 2PS> $data3

Tilføj et sæt beslag for hvert niveau af array nesting., Det første sæt beslag er til det yderste 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 påpipeline, 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, itgets udpakket og Get-medlem ser medlemmerne af arrayet og ikke den faktiske array.,

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

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

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

Jeg har en anden måde, der er mere af et hack (og jeg forsøger at undgå hacks som dette). Du kan placere acomma foran arrayet, før du rør det.

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

returner et array

denne udpakning af arrays sker også, når du udsender eller returnerer værdier fra en funktion. Du canstill få et array, hvis du tildeler output til en variabel, så dette er ikke almindeligt et problem.

fangsten er, at du har et nyt array., Hvis det nogensinde er et problem, kan du brugeWrite-Output -NoEnumerate $array eller return ,$array til at omgå det.

noget andet?