• 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 -joinoperatø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.

Noe annet?