- 10/08/2020
- 24 minutter på å lese
-
- j
- h
- s
- V
Matriser er en grunnleggende språk-funksjonen i de fleste programmeringsspråk. De er en samling ofvalues eller objekter som er vanskelige å unngå. La oss ta en nærmere titt på matriser og alt theyhave å tilby.,
Merk
Den opprinnelige versjonen av denne artikkelen dukket opp på bloggen skrevet av @KevinMarquette. ThePowerShell team takk Kevin for å dele denne innhold med oss. Sjekk ut bloggen hans atPowerShellExplained.com.
Hva er en matrise?
jeg kommer til å begynne med en grunnleggende teknisk beskrivelse av hva matriser er og hvordan de er brukt bymost programmeringsspråk før jeg skiftet til den andre måter PowerShell gjør bruk av dem.
En matrise er en datastruktur som fungerer som en samling av flere elementer., Du kan iterere over thearray eller få tilgang til enkelte elementer ved hjelp av en indeks. Tabellen er opprettet som en sekvensiell del ofmemory hvor hver verdi er lagret rett ved siden av den andre.
jeg vil komme inn på hver av disse detaljene som vi går.
Grunnleggende bruk
på Grunn av matriser er en grunnleggende funksjon i PowerShell, det er en enkel syntaks for å arbeide withthem i PowerShell.,
Opprette en matrise
En tom matrise kan være opprettet ved hjelp av @()
PS> $data = @()PS> $data.count0
Vi kan lage en tabell og frø det med verdier bare ved å plassere dem innenfor @()
parentes.
PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree
Denne gruppen er 4 elementer. Når vi ringer $data
variabel, kan vi se listen over våre produkter. Hvis det er anarray av strenger, da får vi en linje per strengen.
Vi kan erklære et utvalg på flere linjer. Komma er valgfritt i dette tilfellet, og generelt leftout.,
$data = @( 'Zero' 'One' 'Two' 'Three')
jeg foretrekker å erklære min arrays på flere linjer sånn. Ikke bare kan det bli lettere å lese whenyou har flere elementer, for det gjør det også lettere å sammenligne med tidligere versjoner når du bruker sourcecontrol.
Andre syntaks
Det er vanligvis forstått som @()
er syntaksen for å opprette en array, men atskilt med komma listswork mesteparten av tiden.,
$data = 'Zero','One','Two','Three'
Skrive-Utgang for å lage arrays
Et kult lite triks som er verdt å nevne er at du kan bruke Write-Output
for å raskt opprette stringsat konsollen.
$data = Write-Output Zero One Two Three
Dette er praktisk fordi du ikke trenger å sette anførselstegn rundt strenger når parameteren acceptsstrings. Jeg ville aldri gjøre dette i et manus, men det er fair spill på konsollen.
få Tilgang til elementer
Nå har du en matrise med elementer i det, kan du ønsker å få tilgang til og oppdatere disse elementene.,
Offset
for Å få tilgang til enkelte elementene, vil vi bruke parenteser med en forskyvningsverdi som starter på 0. Dette ishow får vi det første elementet i vårt utvalg:
PS> $data = 'Zero','One','Two','Three'PS> $dataZero
grunnen til At vi bruker null her er fordi det første elementet er i begynnelsen av listen, slik at vi usean offset 0 elementer for å få til det. For å komme til det andre elementet, vi ville trenge å bruke en forskyvning av 1 toskip det første elementet.
PS> $dataOne
Dette ville bety at det siste elementet er i offset 3.,
PS> $dataThree
Indeks
Nå kan du se hvorfor jeg har valgt nettopp de verdier som jeg gjorde i dette eksemplet. Jeg introduserte dette som et offsetbecause det er hva det egentlig er, men denne forskyvningen er mer ofte referert til som en indeks. Anindex som starter med 0
. For resten av denne artikkelen vil jeg kalle offset en indeks.
Spesielle indeks triks
I de fleste språk, du kan bare oppgi en enkelt nummer som indeksen, og du får et enkelt element tilbake.PowerShell er mye mer fleksibel. Du kan bruke flere indekser på en gang., Ved hjelp av en liste ofindexes, kan vi velge flere elementer.
PS> $dataZeroTwoThree
varene er returnert basert på rekkefølgen av indeksene er gitt. Hvis du duplisere en indeks,får du som element begge ganger.
PS> $dataThreeZeroThree
Vi kan spesifisere en sekvens av tall med innebygd ..
operatør.
PS> $dataOneTwoThree
Dette virker i motsatt også.
PS> $dataThreeTwoOne
Du kan bruke negativ indeks verdier til å motregne fra slutten. Så hvis du trenger det siste elementet i listen,kan du bruke -1
.,
PS> $dataThree
«Out of bounds»
I de fleste språk, hvis du prøver å få tilgang til en indeks av et element som er forbi slutten av tabellen, youwould få noen form for feil, eller som et unntak. PowerShell stille returnerer ingenting.
PS> $null -eq $dataTrue
Ikke-indeksen i en array null
Hvis variabelen $null
og du prøve å indeksere den som en tabell, får du enSystem.Management.Automation.RuntimeException
unntak med meldingenCannot index into a null array
.,
PS> $empty = $nullSP> $emptyError: Cannot index into a null array.
Så sørg for at din matriser er ikke $null
før du prøver å få tilgang til elementer inni dem.
Teller
Matriser og andre samlinger har en teller eiendom som forteller deg hvor mange elementer som finnes i tabellen.
PS> $data.count4
PowerShell 3.0 lagt til et count eiendom til de fleste objekter. du kan ha et enkelt objekt, og det shouldgive du en opptelling av 1
.
PS> $date = Get-DatePS> $date.count1
Selv $null
har en teller eiendom, bortsett fra at den returnerer 0
.,
PS> $null.count0
Det er noen feller her, som jeg vil komme tilbake når jeg dekker sjekker for $null
eller tom arrayslater på i denne artikkelen.
Av-av-en feil
En felles programmeringsfeil er opprettet på grunn av matriser start på indeks 0. Av-av-en-feil kan beintroduced på to måter.
Den første er ved mentalt å tro at du vil at andre elementet og bruke en indeks av 2
og virkelig gettingthe tredje elementet. Eller ved å tro at du har fire elementer og du vil siste elementet, slik at du bruker countto tilgang til det siste elementet.,
$data
PowerShell er helt glad for å la deg gjøre det, og gi deg nøyaktig hva som objektet eksisterer på indeks 4:$null
. Du bør bruke $data.count - 1
eller -1
at vi lærte om ovenfor.
PS> $dataThree
Dette er hvor du kan bruke -1
indeksen for å få det siste elementet.
PS> $dataThree
Lee Dailey også påpekt for meg at vi kan bruke $data.GetUpperBound(0)
for å få maks indexnumber.,
PS> $data.GetUpperBound(0)3PS> $dataThree
Den nest mest vanlige måten er når iterating listen og ikke stoppe på rett tid. Jeg’llrevisit dette når vi snakker om bruk av for
repeterende.
Oppdatering elementer
Vi kan bruke den samme indeksen for å oppdatere eksisterende elementer i tabellen. Dette gir oss direkte tilgang toupdate individuelle elementer.
$data = 'dos'$data = 'tres'
Hvis vi forsøker å oppdatere et element som er forbi det siste elementet, og deretter får vi enIndex was outside the bounds of the array.
feil.
jeg vil tilbake til dette senere når jeg snakker om hvordan å gjøre en rekke større.,
Iterasjon
På et tidspunkt, må du kanskje gå eller gå hele listen, og utføre noen handling for eachitem i tabellen.
Rørledning
Matriser og PowerShell rørledningen er ment for hverandre. Dette er en av de enkleste måter toprocess over disse verdiene. Når du passerer en matrise til en rørledning, hvert element inne i matrisen isprocessed individuelt.
PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item:
Hvis du ikke har sett $PSItem
før, bare vet at det er det samme som $_
., Du kan bruke eitherone fordi de begge representerer det aktuelle objektet i rørledningen.
ForEach loop
ForEach
loop fungerer godt med samlinger. Ved hjelp av syntaks:foreach ( <variable> in <collection> )
foreach ( $node in $data ){ "Item: "}
ForEach metode
jeg har en tendens til å glemme dette, men det fungerer bra for enkle operasjoner. PowerShell kan du tocall .ForEach()
på en samling.
PS> $data.foreach({"Item "})Item Item Item Item
.foreach()
tar en parameter som er et script-blokken., Du kan droppe parentesene og justprovide skriptet blokk.
$data.foreach{"Item "}
Dette er en mindre kjent syntaks, men det fungerer akkurat det samme. Denne foreach
metoden ble lagt inPowerShell 4.0.
For-løkke
for
loop er i stor grad brukes i de fleste andre språk, men som du ikke ser det mye i PowerShell. Whenyou ser det, er det ofte i sammenheng med gangavstand til en matrise.
for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}
Det første vi gjør er å initialisere en $index
til 0
., Deretter legger vi på betingelse av at $index
mustbe mindre enn $data.count
. Til slutt vil vi presisere at hver gang vi loop som meg må øke theindex av 1
. I dette tilfellet $index++
er en forkortelse for $index = $index + 1
.
Når du bruker en for
loop, betaler spesiell oppmerksomhet til tilstanden. Jeg brukte$index -lt $data.count
her. Det er lett å få tilstanden noe galt for å få en ut-av-oneerror i din logikk., Ved hjelp av $index -le $data.count
eller $index -lt ($data.count - 1)
er stadig soslightly galt. Det ville føre til at resultatet til prosess for mange eller for få elementer. Dette er theclassic av ved en feil.
Slå loop
Dette er en som er lett å overse. Hvis du gir en matrise til en switch statement, itchecks hvert element i matrisen.
$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock
Det er mange kule ting som vi kan gjøre med switch-setningen. Jeg har en annen articlededicated til dette.,
- Alt du noensinne ønsket å vite om bytte uttalelse
Oppdatere verdier
Når gruppen er en samling av streng eller heltall (verdi-typer), noen ganger ønsker du kanskje toupdate verdiene i matrisen som du loop over dem. De fleste av looper over bruk en variabel i theloop, som inneholder en kopi av verdi. Hvis du oppdaterer den variabelen, den opprinnelige verdien i tabellen isnot oppdatert.
Det unntak at uttalelsen er for
repeterende., Hvis du ønsker å gå en matrise og oppdatere valuesinside det, da for
loop er hva du leter etter.
for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}
Dette eksemplet tar en verdi av indeksen, gjør noen endringer, og deretter bruker den samme indeksen for å assignit tilbake.
– Tabeller av Objekter
Så langt, det eneste vi har plassert i en matrise, er en verdi type, men arrays kan også containobjects.
$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})
Mange cmdlets tilbake samlinger av objekter som tabeller når du tilordne dem til en variabel.,
$processList = Get-Process
Alle de grunnleggende funksjonene vi allerede snakket om fortsatt gjelde for matriser av objekter med et fewdetails verdt å peke på.
få Tilgang til egenskaper
Vi kan bruke en indeks for å få tilgang til en enkelt element i en samling i likhet med verdi-typer.
PS> $dataFirstName LastName----- ----Kevin Marquette
Vi kan få tilgang til og oppdatere egenskaper direkte.,
PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette
Array egenskaper
du Vanligvis ville ha til å nummerere hele listen som dette for å få tilgang til alle egenskapene:
PS> $data | ForEach-Object {$_.LastName}MarquetteDoe
Eller ved å bruke Select-Object -ExpandProperty
cmdleten.
PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe
Men PowerShell gir oss muligheten til å be om LastName
direkte. PowerShell nummererer themall for oss, og returnerer en ren liste.
PS> $data.LastNameMarquetteDoe
Den opplisting fortsatt skjer, men vi kan ikke se kompleksiteten bak det.,
Where-Object filtrering
Dette er der Where-Object
kommer i, slik at vi kan filtrere og velge ut hva vi ønsker ut av arraybased på egenskapene til objektet.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette
Vi kan skrive at samme spørring for å få FirstName
vi er ute etter.
$data | Where FirstName -eq Kevin
Der()
Matriser har en Where()
metode på dem som gir deg mulighet til å angi en scriptblock
for filter.
$data.Where({$_.FirstName -eq 'Kevin'})
Denne funksjonen ble lagt til i PowerShell 4.0.,
Oppdatering av objekter i looper
Med verdi-typer, og den eneste måten å oppdatere tabellen er å bruke en for-løkke fordi vi trenger å vite theindex å erstatte verdien. Vi har flere alternativer med objekter fordi de er referanse typer. Hereis en rask eksempel:
foreach($person in $data){ $person.FirstName = 'Kevin'}
Denne sløyfen er gangavstand til alle objektene i $data
array. Fordi objektene er referanse typer,$person
variabel referanser til samme objekt som er i tabellen. Så oppdateringer til itsproperties oppdaterer den opprinnelige.,
Du fortsatt ikke kan erstatte hele objekt på denne måten. Hvis du prøver å tilordne en ny objekt til$person
variabel, kan du oppdatere variabel referanse til noe annet som ikke lenger pointsto det originale objektet i tabellen. Dette virker ikke som du forventer:
foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}
Operatører
operatørene i PowerShell også arbeide med matriser. Noen av dem fungerer litt annerledes.
-bli med
-join
operatør er den mest åpenbare så la oss se på det første., Jeg liker den -join
operatør og bruker det ofte. Det slutter seg til alle elementene i matrisen med karakter eller streng thatyou angir.
PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4
En av funksjonene jeg liker om -join
operatør er at den håndterer enkelt elementer.
PS> 1 -join '-'1
jeg bruker dette inne logging og detaljert meldinger.
PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.
-bli med $array
Her er et smart triks som Lee Dailey pekte ut for meg., Hvis du noen gang ønsker å bli med everythingwithout et skilletegn, i stedet for å gjøre dette:
PS> $data = @(1,2,3,4)PS> $data -join $null1234
Du kan bruke -join
med den matrisen som parameter uten prefiks. Ta en titt på dette eksempelet tosee at jeg snakker om.
PS> $data = @(1,2,3,4)PS> -join $data1234
-sett -delt
Den andre operatører som -replace
og -split
– utfør på hvert element i matrisen. Jeg kan ikke saythat jeg noensinne har brukt dem på denne måten, 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
-inneholder
-contains
operatør lar deg kontrollere en rekke verdier for å se om den inneholder en specifiedvalue.
PS> $data = @('red','green','blue')PS> $data -contains 'green'True
-i
Når du har en enkel verdi som du ønsker å kontrollere samsvarer med ett av flere verdier, kan du canuse -in
operatør. Verdien vil være på venstre og tabellen på høyre side av theoperator.
PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue
Dette kan bli dyrt hvis listen er stor. Jeg bruker ofte en regex mønster hvis jeg sjekke mer thana noen verdier.,
PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue
-eq-og -ne
Likestillings-og arrays kan bli komplisert. Når gruppen er på venstre side, og hvert element getscompared. I stedet for å returnere True
, returnerer objektet som matcher.
PS> $data = @('red','green','blue')PS> $data -eq 'green'green
Når du bruker -ne
operatør, får vi alle verdier som ikke er lik verdien vår.
PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue
Når du bruker denne i en if()
uttalelse, en verdi som returneres er en True
verdi., Hvis ingen verdi er tilbake, så er det en False
verdi. Begge disse neste uttalelser vurdere å True
.
$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}
jeg vil tilbake til dette i et øyeblikk når vi snakker om testing for $null
.
-match
-match
operatør prøver å matche et 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 bruker -match
med en enkelt verdi, en spesiell variabel $Matches
blir befolket med matchinfo., Dette er ikke tilfellet når en tabell er behandlet på denne måten.
Vi kan ta samme tilnærming med Select-String
.
$servers | Select-String SQL
jeg ta en nærmere titt på Select-String
,-match
og $matches
variabel i et annet innlegg calledThe mange måter å bruke regex.
$null eller tom
Testing for $null
eller tom arrays kan være vanskelig. Her er de vanligste fellene med matriser.
På et øyeblikk, dette utsagnet ser ut som det skal fungere.,
if ( $array -eq $null){ 'Array is $null'}
Men jeg bare gikk over hvordan -eq
sjekker hvert element i tabellen. Så vi kan ha en rekke severalitems med en enkelt $null verdi, og det ville vurdere å $true
$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}
Dette er hvorfor det er en beste praksis for å plassere $null
på venstre side av operatøren. Dette makesthis scenario en ikke-sak.
if ( $null -eq $array ){ 'Array actually is $null'}
En $null
array er ikke det samme som en tom tabell. Hvis du vet du har en array, sjekk thecount av objekter i det., Hvis matrise er $null
, antallet er 0
.
if ( $array.count -gt 0 ){ "Array isn't empty"}
Det er en mer fellen å se opp for her. Du kan bruke count
selv om du har en singleobject, med mindre det objektet som er en PSCustomObject
. Dette er en feil som er løst i PowerShell 6.1.Det er gode nyheter, men mange mennesker er fortsatt på 5.1 og trenger å se opp for det.
PS> $object = @{Name='TestObject'}PS> $object.count$null
Hvis du er fortsatt på PowerShell 5.1, kan du vikle objekt i en matrise før du sjekker count toget en nøyaktig telling.,
if ( @($array).count -gt 0 ){ "Array isn't empty"}
for Å fullt spille det trygt, sjekk for $null
, så sjekk teller.
if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}
Alt-eq
jeg nylig så noen spør hvordan du kontrollere at hver verdi i en tabell samsvarer med en gitt verdi.Reddit-brukeren /u/bis hadde denne smarte løsningen som kontrollerer for eventuelle feil verdier og thenflips resultatet.
$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}
Legge til tabeller
På dette punktet, du begynner å lure på hvordan du legger til elementer i en matrise. Den raskt svar er at youcan ikke. En matrise er en fast størrelse i minnet., Hvis du trenger å vokse det eller legge til en enkelt element til det, thenyou trenger for å lage en ny matrise og kopier alle verdier over fra den gamle tabellen. Dette høres ut som mye arbeid, men PowerShell skjuler kompleksiteten i å skape den nye tabellen. PowerShellimplements tillegg operatøren (+
) for matriser.
Merk
PowerShell ikke implementere en subtraksjon drift. Hvis du ønsker et fleksibelt alternativ til anarray, må du bruke en generisk List
objekt.,
Array tillegg
Vi kan bruke i tillegg operatør med matriser for å opprette en ny tabell. Så gitt disse to matriser:
$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')
Vi kan legge dem sammen for å få et nytt utvalg.
PS> $first + $secondZeroOneTwoThree
Pluss er lik +=
Vi kan lage en ny tabell i sted og legge til et element i det som dette:
$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'
Bare husk at hver gang du bruker +=
at du er duplisere og opprette en ny tabell. Thisis en ikke et problem for små datasett, men det skalerer svært dårlig.,
Rørledning oppdraget
Du kan tilordne resultater i rørledning til en variabel. Det er en matrise hvis det inneholder multipleitems.
$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}
Vanligvis når vi tenker på ved hjelp av rørledningen, tenker vi på den typiske PowerShell one-liners. Vi canleverage rørledningen med foreach()
uttalelser og andre looper. Så i stedet for å legge til elementer for å anarray i en loop, vi kan slippe elementer på rørledningen.
$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}
Array Typer
standard, et utvalg i PowerShell er opprettet som en ]
type., Dette gjør det mulig å containany type gjenstand eller verdi. Dette fungerer fordi alt er arvet fra PSObject
type.
Sterkt skrevet matriser
Du kan opprette en matrise av alle typer ved hjelp av en lignende syntaks. Når du oppretter et sterkt skrevet utvalg,det kan bare inneholde verdier eller objekter som er av den angitte typen.
ArrayList
ved å Legge elementer til en matrise er en av de største begrensningene, men det er et par andre collectionsthat vi kan slå til som kan løse dette problemet.,
ArrayList
er vanligvis en av de første tingene som vi tenker på når vi trenger en tabell som isfaster å jobbe med. Det fungerer som et objekt utvalg ethvert sted som vi trenger det, men det håndterer addingitems raskt.
Her er hvordan skaper vi en ArrayList
og legge til elementer i det.
$myarray = ::new()$myArray.Add('Value')
Vi ringer inn .NET for å få denne typen. I dette tilfellet, bruker vi standard konstruktør tocreate det. Så vi kaller den Add
metode for å legge til et element til det.,
grunnen til At jeg bruker i begynnelsen av linjen er å undertrykke returkoden. Some.NET samtaler gjør dette, og kan skape uventede utgang.
Hvis bare data som du har i din matrise er strenger, da også ta en titt på usingStringBuilder. Det er nesten det samme, men har noen metoder som er kun for å håndtere withstrings. StringBuilder
er spesielt utformet for ytelse.
Det er vanlig å se folk gå til ArrayList
fra-matriser. Men det kommer fra en tid hvor C# gjorde’thave generisk støtte., ArrayList
er mindre i støtte for generisk List
Generisk Liste
En generisk type er en spesiell type i C# som definerer en generalisert klasse og brukeren angir thedata typer bruker når de opprettes. Så hvis du ønsker en liste av tall og strenger, ville du definethat du ønsker liste over int
eller string
typer.
Her er hvordan du opprette en Liste over strenger.
$mylist = ]::new()
Eller en liste for tall.,
$mylist = ]::new()
Vi kan kaste en eksisterende matrise til en liste som dette uten å lage objektet først:
$mylist = ]@(1,2,3)
Vi kan redusere syntaks med using namespace
uttalelse i PowerShell 5 og nyere. using
uttalelse behov for å være den første linjen av skriptet. Ved å deklarere et navnerom, PowerShelllets du la den ut av datatyper når du refererer til dem.
using namespace System.Collections.Generic$myList = ]@(1,2,3)
Dette gjør List
mye mer brukbare.,
Du har et lignende Add
metode tilgjengelig for deg. I motsetning til den ArrayList, det er ingen retur verdi onthe Add
metode, slik at vi slipper å void
det.
$myList.Add(10)
Og vi kan fortsatt få tilgang til elementer som andre matriser.
PS> $myList10
Liste
Du kan ha en liste over alle type, men når du ikke vet hvilken type objekter, kan du bruke]
for å inneholde dem.,
$list = ]::new()
Fjern()
ArrayList
og den generisk List
både støtte fjerne elementer fra samlingen.
using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree
Når du arbeider med verdi-typer, det fjerner den første fra listen. Du kan kalle det i løpet andover igjen for å holde fjerne denne verdien. Hvis du har referanse typer, du har å gi objectthat du ønsker fjernet.,
]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)
fjern-metoden returnerer true
hvis det var i stand til å finne og fjerne elementet fra samlingen.
Mer samlinger
Det er mange andre samlinger som kan brukes, men disse er god generisk utvalg erstatninger.Hvis du er interessert i å lære mer om disse alternativene, kan du ta en titt på thisGist thatMark Kraus satt sammen.
Andre nyanser
Nå som jeg har dekket alle de store funksjonalitet, her er noen flere ting som jeg ønsket tomention før jeg bryte opp dette.,
Pre-størrelse tabeller
jeg nevnte at du ikke kan endre størrelsen på et utvalg når det er opprettet. Vi kan opprette en matrise ofa forhåndsinnstilt størrelse ved å ringe det med new($size)
constructor.
$data = ]::new(4)$data.count4
Multiplisere matriser
Et interessant lite trikset er at du kan multiplisere en matrise med et heltall.
PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue
Initialisere med 0
Et vanlig scenario er at du ønsker å opprette en matrise med bare nuller. Hvis du bare kommer til å haveintegers, et sterkt skrevet utvalg av heltall som standard til alle nuller.,
PS> ]::new(4)0000
Vi kan bruke å multiplisere triks for å gjøre dette også.
PS> $data = @(0) * 4PS> $data0000
Den fine tingen om å multiplisere trikset er at du kan bruke en hvilken som helst verdi. Så hvis du vil ratherhave 255
som standard verdi, ville dette være en god måte å gjøre det på.
PS> $data = @(255) * 4PS> $data255255255255
Nestede tabeller
En tabell inne i en matrise kalles en nestet tabell. Jeg bruker ikke disse mye i PowerShell, men jeg haveused dem mer i andre språk. Vurder å bruke en rekke matriser når dataene passer inn i en gridlike mønster.,
Her er to måter vi kan lage en to-dimensjonal array.
$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))
komma er svært viktig i disse eksemplene. Jeg ga et tidligere eksempel på et vanlig array onmultiple linjer der kommaet var valgfritt. Det er ikke tilfelle med en multi-dimensjonal array.
Den måten vi bruker indeksen notasjon endringer litt nå som vi har en nestet tabell. Ved hjelp av$data
ovenfor, dette er hvordan vi ville få tilgang til verdien 3.
PS> $outside = 0PS> $inside = 2PS> $data3
Legg til et sett av brakett for hvert nivå av utvalg hekkende., Den første satt i parentes er for det ytterste-tabellen, og deretter kan du jobbe din vei i fra det.
Skriv-Ut-NoEnumerate
PowerShell liker å pakke opp eller spesifisere matriser. Dette er et sentralt aspekt av veien PowerShell bruker thepipeline men det er tider som du ikke vil at det skal skje.
jeg vanligvis rør objekter til Get-Member
for å lære mer om dem. Når jeg pipe en matrise til det, itgets pakket og Get-Medlem ser de medlemmer av spekter og ikke selve tabellen.,
PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...
for Å hindre at pakk av tabellen, kan du bruke Write-Object -NoEnumerate
.
PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...
jeg har en annen måte som er mer av en hack (og jeg prøver å unngå hacks som dette). Du kan plassere acomma foran på tabellen før du rør det.
PS> ,$data | Get-MemberTypeName: System.Object...
Returnere et array
Dette opppakkingen av matriser skjer også når du utgang eller returnere verdier fra en funksjon. Du canstill få en matrise hvis du tilordne utgang til en variabel, så dette er ikke ofte et problem.
fangsten er at du har en ny matrise., Hvis det er stadig et problem, kan du brukeWrite-Output -NoEnumerate $array
eller return ,$array
for å omgå det.
Legg igjen en kommentar