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
- Alle -eq
- Array tillæg
- Plus er lig med +=
- Pipeline opgave
- Stærkt skrevet arrays
- ArrayList
- Generisk Liste
- Liste
- Fjern()
- Mere samlinger
- Pre-størrelse arrays
- Multiplicere arrays
- Initialiseret med 0
- Indlejrede matrixer
- Skriv-Output -NoEnumerate
- Returnerer en matrix
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.