Arrays är ett grundläggande språk inslag i de flesta programmeringsspråk. De är en samling av värden eller objekt och är därför svåra att undvika. Låt oss ta en närmare titt på matriser och allt de har att erbjuda.

  • Page Index
  • Vad är en array?,match
  • $null eller tom
    • All-EQ
  • lägga till arrays
    • Array addition
    • Plus är lika med +=
    • Pipeline assignment
  • Array typer
    • starkt skrivit arrays
    • ArrayList
    • Generisk lista
      • lista
      • ta bort()
    • fler samlingar
  • andra nyanser
    • förstora arrays
    • multiplicera arrays
    • initiera med 0
    • kapslade arrays
    • skriv-output-noenumerate
      • returnera en array
  • något annat?,
  • Vad är en array?

    Jag kommer att börja med en grundläggande teknisk beskrivning av vilka arrayer som är och hur de används av de flesta programmeringsspråk innan jag byter till de andra sätten PowerShell använder dem.

    en array är en datastruktur som fungerar som en samling av flera objekt. Du kan iterera över matrisen eller komma åt enskilda objekt med hjälp av ett index. Matrisen skapas som en sekventiell bit Minne där varje värde lagras precis bredvid den andra.

    Jag kommer att beröra var och en av dessa detaljer när vi går.,

    Grundläggande användning

    eftersom arrayer är en sådan grundläggande egenskap hos PowerShell, finns det en enkel syntax för att arbeta med dem i PowerShell.

    skapa en matris med @()

    en tom matris kan skapas genom att använda@()

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

    Vi kan skapa en matris och frö den med värden bara genom att placera dem i@() parenteser.

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

    den här matrisen har 4 objekt. När vi kallar variabeln $data ser vi listan över våra objekt., Om det är en rad strängar, kommer vi att ha en rad per sträng.

    Vi kan förklara en array på flera rader. Kommatecken är valfritt i detta fall och i allmänhet utelämnas.

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

    Jag föredrar att förklara mina matriser på flera rader så. Det blir inte bara lättare att läsa när du har flera objekt, det gör det också lättare att jämföra med tidigare versioner när du använder källkontroll.,

    annan syntax

    det är allmänt underförstått att @() är syntaxen för att skapa en array, men kommaseparerade listor fungerar för det mesta.

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

    skriv-utgång för att skapa matriser

    ett coolt litet trick som är värt att nämna är att du kan användaWrite-Output för att snabbt skapa strängar på konsolen.

     $data = Write-Output Zero One Two Three

    det här är praktiskt eftersom du inte behöver lägga citat runt strängarna när parametern accepterar strängar., Jag skulle aldrig göra detta i ett manus men det är rättvist spel i konsolen.

    åtkomst till objekt

    Nu när du har en matris med objekt i den, kanske du vill komma åt och uppdatera dessa objekt.

    Offset

    för att komma åt enskilda objekt använder vi parenteserna med ett offsetvärde som börjar vid 0. Så här får vi det första objektet i vår array:

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

    anledningen till att vi använder noll här beror på att det första objektet är i början av listan så vi använder en förskjutning av 0 objekt för att komma till det., För att komma till det andra objektet måste vi använda en förskjutning av 1 för att hoppa över det första objektet.

     PS> $data One

    detta skulle innebära att det sista objektet är på offset 3.

     PS> $data Three

    Index

    Nu kan du se varför jag valde de värden som jag gjorde för det här exemplet. Jag introducerade detta som en förskjutning eftersom det är vad det verkligen är, men denna förskjutning kallas mer allmänt som ett index. Ett index som börjar vid 0. För resten av den här artikeln kommer jag att ringa offset ett index.,

    Specialindex tricks

    på de flesta språk kan du bara ange ett enda nummer som index och du får ett enda objekt tillbaka. PowerShell är mycket mer flexibel. Du kan använda flera index på en gång. Genom att tillhandahålla en lista med index kan vi välja flera objekt.

     PS> $data Zero Two Three

    objekten kommer att returneras baserat på ordningen för de angivna indexerna. Om du duplicerar ett index får du det objektet båda gånger.,

     PS> $data Three Zero Three

    Vi kan ange en sekvens av siffror med den inbyggda.. operatören.

     PS> $data One Two Three

    detta fungerar även i omvänd ordning.

     PS> $data Three Two One

    Du kan använda negitive indexvärden för att kompensera från slutet. Så om du behöver det sista objektet i listan kan du använda -1.,

     PS> $data Three

    Out of bounds

    på de flesta språk, om du försöker komma åt ett index för ett objekt som är förbi slutet av matrisen, skulle du få någon typ av fel eller ett undantag. PowerShell kommer tyst att ge dig ingenting.

     PS> $null -eq $data True

    kan inte indexeras till en null array

    om din variabel är $nulloch du försöker indexera den som en array, får du ett System.Management.Automation.RuntimeExceptionundantag med meddelandet Cannot index into a null array.,

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

    så se till att dina matriser inte är$null innan du försöker komma åt element inuti dem.

    räkna

    matriser och andra samlingar har en räkneegenskap som berättar hur många objekt som finns i matrisen.

     PS> $data.count 4

    PowerShell 3.0 lade till en räkneegenskap till de flesta objekt. du kan ha ett enda objekt och det bör ge dig en räkning av 1.,

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

    även $null har en räkneegenskap förutom att den returnerar 0.

     PS> $null.count 0

    det finns några fällor här som jag kommer att se över när jag täcker kontroll för$null eller tomma matriser senare i den här artikeln.

    av med ett fel

    ett vanligt programmeringsfel skapas eftersom arrayer startar vid index 0. Ett av med ett fel kan introduceras på två mycket vanliga sätt.,

    den första är genom att mentalt tänka att du vill ha det andra objektet och använda ett index på 2 och verkligen få det tredje objektet. Eller genom att tro att du har4 objekt och du vill ha sista objektet, så du kommer bara använda storleken för att komma åt det sista objektet.

     $data

    PowerShell låter dig göra det och ger dig exakt vilket objekt som finns på index 4,$null. Du bör använda $data.count - 1eller-1 som vi lärde oss om ovan.,

     PS> $data Three

    det är här du kan använda indexet -1 för att få det sista elementet.

     PS> $data Three

    Lee Dailey påpekade också för mig att vi kan använda$data.GetUpperBound(0) för att få max indexnummer.

     PS> $data.GetUpperBound(0) Three

    det näst vanligaste sättet är när man itererar listan och bara inte stoppar vid rätt tidpunkt. Jag återkommer när vi pratar om att använda for – slingan.,

    Uppdatera objekt

    Vi kan använda samma index för att uppdatera befintliga objekt i matrisen. Detta ger oss direkt tillgång till uppdatera enskilda objekt.

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

    om vi försöker uppdatera ett objekt som är förbi det sista elementet får vi ett Index was outside the bounds of the array. – fel.

    jag återkommer senare när jag pratar om hur man gör en array större.

    Iteration

    vid något tillfälle måste du gå eller iterera hela listan och utföra vissa åtgärder för varje objekt i matrisen.,

    rörledning

    arrayer och PowerShell-rörledningen är avsedda för varandra. Detta är ett av de enklaste sätten att bearbeta över dessa värden. När du skickar en matris till en rörledning behandlas varje objekt inuti matrisen individuellt.

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

    om du inte har sett $PSItem tidigare, vet du bara att det är samma sak som $_. Du kan använda endera eftersom de båda representerar det aktuella objektet i rörledningen.,

    foreach loop

    ForEach loop fungerar bra med Samlingar. Använda syntaxen: foreach ( <variable> in <collection> )

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

    ForEach metod

    Jag tenderar att glömma den här men det fungerar bra för enkla operationer. PowerShell låter dig ringa .ForEach() på en samling.

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

    .foreach() tar en parameter som är ett scriptblock. Du kan släppa parenteserna och bara ge scriptblocket.,

     $data.foreach{"Item "}

    detta är en mindre känd syntax men det fungerar precis samma. Dennaforeach – metod lades till i PowerShell 4.0.

    för loop

    for loop används kraftigt på de flesta andra språk men du ser det inte mycket i PowerShell. När du ser det, är det ofta i samband med att gå en array.

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

    det första vi gör är att initiera en$index till0., Sedan lägger vi till villkoret att$index måste vara mindre än$data.count. Slutligen anger vi att varje gång vi slingrar att jag måste öka indexet med 1. I detta fall är$index++ kort för$index = $index + 1.

    När du använder en for loop, var särskilt uppmärksam på villkoret. Jag använde $index -lt $data.count här. Det är väldigt lätt att få tillståndet något fel att få en off av ett fel i din logik., Använda$index -le $data.count eller$index -lt ($data.count - 1) är någonsin så lite fel. Det skulle orsaka ditt resultat att bearbeta för många eller för få objekt. Detta är klassiken av ett fel.

    Switch loop

    detta är en som är mycket lätt att förbise. Om du tillhandahåller en array till en switch-sats, matchar den på varje objekt i matrisen.

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

    detta kommer att producera denna utgång:

     Tick Tock Tick Tock

    det finns många coola saker som detta som vi kan göra med switch-uttalandet., Jag har en annan artikel tillägnad detta.

    • allt du någonsin velat veta om switch uttalande

    uppdatera värden

    När din array är en samling av sträng eller heltal (värdetyper), ibland kommer du vill uppdatera värdena i matrisen när du slingrar över dem. De flesta slingorna ovan använder en variabel i slingan som innehåller en kopia av värdet. Om du uppdaterar variabeln uppdateras inte det ursprungliga värdet i matrisen.

    undantaget från detta uttalande ärfor – slingan., Om du vill gå en array och uppdatera värden inuti den, är for loop vad du letar efter.

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

    det här exemplet tar ett värde per index, gör några ändringar och använder sedan samma index för att tilldela det tillbaka.

    matriser av objekt

    hittills är det enda vi har placerat i en array en värdetyp, men matriser kan också innehålla objekt.

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

    många cmdlets returnerar samlingar av objekt som matriser när du tilldelar dem till en variabel.,

     $processList = Get-Process

    alla grundläggande funktioner som vi redan talat om gäller fortfarande för matriser av objekt med några detaljer som är värda att påpeka.

    åtkomst till Egenskaper

    Vi kan använda ett index för att komma åt ett enskilt objekt i en samling precis som med värdetyper.

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

    Vi kan komma åt och uppdatera egenskaper direkt.,

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

    Array properties

    normalt måste du räkna upp hela listan så här för att få tillgång till alla egenskaper:

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

    eller genom att användaSelect-Object -ExpandProperty cmdlet.

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

    men PowerShell ger oss möjlighet att begäraLastName direkt. PowerShell kommer att räkna upp dem alla för oss och ge oss en ren lista.,

     PS> $data.LastName Marquette Doe

    uppräkningen sker fortfarande, men vi ser inte komplexiteten bakom den.

    var-Objektfiltrering

    det är här Where-Object kommer in så att vi kan filtrera och välja vad vi vill ha ut ur matrisen baserat på objektets egenskaper.

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

    Vi kan skriva samma fråga så här för att fåFirstName vi letar efter.,

     $data | Where FirstName -eq Kevin

    var ()

    matriser har en Where() metod på dem som låter dig ange en scriptblock för filtret.

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

    den här funktionen lades till i PowerShell 4.0.

    Uppdatera objekt i loopar

    med värdetyper är det enda sättet att uppdatera matrisen att använda en för loop eftersom vi behöver veta indexet för att ersätta värdet. Vi har fler alternativ med objekt eftersom de är referenstyper., Här är ett snabbt exempel:

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

    den här slingan går varje objekt i matrisen$data. Eftersom objekt är referenstyper refererar variabeln$person exakt samma objekt som finns i matrisen. Så uppdateringar av dess egenskaper kommer att uppdatera originalet.

    Du kan fortfarande inte ersätta hela objektet på detta sätt. Om du försöker tilldela ett nytt objekt till variabeln $person uppdaterar du variabelreferensen till något annat som inte längre pekar på det ursprungliga objektet i matrisen., Detta fungerar inte som du skulle förvänta dig:

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

    operatörer

    operatörerna i PowerShell arbetar också med arrayer. Några av dem fungerar lite annorlunda.

    -gå

    -join operatören är den mest uppenbara så vi kommer att titta på det först. Jag gillar -join – operatören och använder den ofta. Det kommer att gå med alla element i matrisen med ett tecken eller en sträng som du anger.,

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

    en av de funktioner som jag gillar med -join – operatören är att den hanterar enskilda objekt.

     PS> 1 -join '-' 1

    Jag använder detta i loggnings-och verbose-meddelanden.

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

    -gå $array

    Här är ett smart trick som Lee Dailey påpekade för mig., Om du någonsin vill gå med i allt utan avgränsare, istället för att göra det här:

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

    Du kan använda-join med matrisen som parameter utan prefix. Ta en titt på detta exempel för att se att jag talar om.

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

    -Ersätt och-dela

    de andra operatörerna som-replace och-split kommer att utföra på varje objekt i matrisen. Jag kan inte säga att jag någonsin har använt dem på detta sätt, men här är ett exempel.,

     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

    -innehåller

    operatören-contains låter dig kontrollera en rad värden för att se om den innehåller ett angivet värde.

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

    -in

    När du har ett enda värde som du vill verifiera matchar ett av flera värden kan du använda-in – operatören. Värdet skulle vara till vänster och matrisen på höger sida av operationen.,

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

    detta kan bli dyrt om listan är stor. Jag kommer ofta att använda ett regex-mönster om jag kontrollerar mer än 4-5-värden.

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

    -eq och-ne

    jämlikhet och arrays kan bli komplicerade. När matrisen är på vänster sida kommer varje objekt att jämföras. Istället för att returneraTrue returneras objektet som matchar.,

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

    När du använder -ne – operatören får vi alla värden som inte är lika med vårt värde.

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

    När du använder detta i en if() – sats är ett värde som returneras ett True – värde. Om inget värde returneras är det ett värde False. Båda dessa nästa uttalanden kommer att utvärdera till True.,

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

    jag återkommer detta i ett ögonblick när vi pratar om testning för $null.

    -match

    -match – operatören försöker matcha varje objekt 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 använder -match med ett enda värde fylls en särskild variabel $Matches med matchinfo. Detta är inte fallet när en array behandlas på detta sätt.

    vi kan använda samma tillvägagångssätt medSelect-String.,

     $servers | Select-String SQL

    jag tar en närmare titt påSelect-String,-match och variabeln$matches I ett annat inlägg kallas de många sätten att använda regex.

    $null eller tom

    testning för$null eller tomma matriser kan vara knepigt. Här är de vanliga fällor med matriser.

    i korthet ser det här uttalandet ut att fungera.

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

    men jag gick bara över hur -eq kontrollerar varje objekt i matrisen., Så vi kan ha en rad flera objekt med ett enda $null-värde och det skulle utvärdera till $true

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

    det är därför det är en bästa praxis att placera $nullpå operatörens vänstra sida. Detta gör detta scenario en icke-fråga.

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

    a$null array är inte samma sak som en tom matris. Om du vet att du har en array, kontrollera antalet objekt i den., Om matrisen är $null kommer antalet att vara 0.

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

    det finns ytterligare en fälla att se upp för här. Du kan användacount även om du har ett enda objekt, om inte objektet är ettPSCustomObject. Detta är en bugg som är fast i PowerShell 6.1. Det är goda nyheter, men många människor är fortfarande på 5.1 och måste se upp för det.

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

    om du fortfarande är på PowerShell 5.,1, Du kan linda objektet i en array innan du kontrollerar räkningen för att få en korrekt räkning.

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

    för att helt spela det säkert, kolla efter$null och kontrollera sedan räkningen.

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

    All-EQ

    Jag såg nyligen någon fråga hur man kontrollerar att varje värde i en array matchar ett visst värde. Reddit user / u / bis hade denna smarta lösning som kontrollerar eventuella felaktiga värden och vänder sedan resultatet.,

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

    lägga till i matriser

    vid denna tidpunkt börjar du undra hur du lägger till objekt i en array. Det snabba svaret är att du inte kan. en array är en fast storlek i minnet. Om du behöver odla det eller lägga till ett enda objekt till det, måste du skapa en ny array och kopiera alla värden över från den gamla matrisen. Detta låter dyrt och som mycket arbete, men PowerShell döljer komplexiteten att skapa den nya matrisen.

    Array addition

    Vi kan använda additionsoperatören med arrayer för att skapa en ny array., Så med tanke på dessa två matriser:

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

    Vi kan lägga till dem tillsammans för att få en ny array.

     PS> $first + $second Zero One Two Three

    Plus är lika med +=

    Vi kan skapa en ny array på plats och lägga till ett objekt så här:

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

    kom bara ihåg att varje gång du använder += att du duplicerar och skapar en ny array. Detta är inte ett problem för små datauppsättningar men det skalar extremt dåligt.,

    pipeline assignment

    Du kan tilldela resultaten av en pipeline till en variabel. Det kommer att vara en array om den innehåller flera objekt.

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

    normalt när vi tänker på att använda rörledningen tänker vi på de typiska PowerShell one-liners. Vi kan utnyttja rörledningen medforeach() uttalanden och andra slingor. Så istället för att lägga till objekt i en matris i en slinga kan vi släppa objekt på rörledningen.,

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

    genom att tilldela resultaten av foreach till en variabel fångar vi alla objekt och skapar en enda array.

    Array Types

    som standard skapas en matris i PowerShell som en] – typ. Detta gör det möjligt att innehålla någon typ av objekt eller värde. Detta fungerar eftersom allt är ärvt frånPSObject – typen.

    starkt skrivna matriser

    Du kan skapa en array av vilken typ som helst med en liknande syntax., När du skapar en starkt maskinskriven array kan den bara innehålla värden eller objekt den angivna typen.

    ArrayList

    att lägga till objekt i en array är en av dess största begränsningar, men det finns några andra samlingar som vi kan vända oss till för att lösa detta problem.

    ArrayList är vanligtvis en av de första sakerna vi tänker på när vi behöver en matris som är snabbare att arbeta med. Det fungerar som ett objekt array varje plats som vi behöver det, men det hanterar lägga till objekt snabbt.

    Så här skapar vi en ArrayList och lägger till objekt i den.,

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

    Vi ringer till.Net för att få den här typen. I det här fallet använder vi standardkonstruktören för att skapa den. Sedan kallar vi metodenAdd för att lägga till ett objekt i det.

    anledningen till att jag använder I början av raden är att undertrycka returkoden. Vissa. Net-samtal kommer att göra detta och kan skapa oväntade utdata.

    om den enda data som du har i din array är strängar, ta också en titt på att använda StringBuilder., Det är nästan samma sak men har vissa metoder som är bara för att hantera strängar. StringBuilder är speciellt utformad för prestanda.

    • sammanfoga strängar med StringBuilder

    det är verkligen vanligt att se människor flytta till ArrayList från arrayer. Men det kommer från en tid där C # inte hade generiskt stöd., DenArrayList skrivs av i stöd för den generiskaList

    Generisk lista

    en generisk typ är en speciell typ i C# som definierar en generaliserad klass och användaren kommer att ange de datatyper som den kommer att använda när den skapas. Så om du vill ha en lista med siffror eller strängar, skulle du definiera att du vill ha en lista med int eller string typer.

    Så här skapar du en lista för strängar.

     $mylist = ]::new()

    eller en lista för siffror.,

     $mylist = ]::new()

    Vi kan kasta en befintlig array till en lista som denna utan att skapa objektet först:

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

    Vi kan förkorta syntaxen lite med using namespace uttalande i

    PowerShell 5 och nyare. Uttalandetusingmåste vara den första raden i ditt skript. Genom att förklara ett namnområde låter PowerShell dig lämna det från datatyperna när du refererar till dem.,

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

    detta gör List mycket mer användbar.

    du har en liknandeAdd metod tillgänglig för dig. Till skillnad från Arraylisten finns det inget returvärde på metodenAdd så vi behöver intevoid det.

     $myList.Add(10)

    och vi kan fortfarande komma åt elementen som andra matriser.,

     PS> $myList 10

    lista

    Du kan ha en lista av vilken typ som helst, men när du inte känner till typen av objekt kan du använda] för att innehålla dem.

     $list = ]::new()

    ta bort ()

    ArrayList och den generiskaList båda stöder att ta bort objekt från samlingen.

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

    När du arbetar med värdetyper kommer den att ta bort den första från listan., Du kan ringa det om och om igen för att fortsätta ta bort det värdet. Om du har referenstyper måste du ange objektet som du vill ta bort.

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

    borttagningsmetoden kommer att returnera sant om den kunde hitta och ta bort objektet från samlingen.

    fler samlingar

    det finns många andra samlingar som kan användas men det här är de bra generiska arrayutbytena., Om du är intresserad av att lära dig mer om dessa alternativ, ta en titt på denna Gist som Mark Kraus sätta ihop.

    andra nyanser

    nu när jag har täckt alla de stora funktioner, här är några fler saker som jag ville nämna innan jag avsluta detta.

    förstora matriser

    jag nämnde att du inte kan ändra storleken på en array när den har skapats. Vi kan skapa en matris med en förutbestämd storlek genom att ringa den med konstruktören new($size).,

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

    multiplicera arrayer

    ett intressant litet knep är att du kan multiplicera en array med ett heltal.

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

    initiera med 0

    ett vanligt scenario är att du vill skapa en array med alla nollor. Om du bara kommer att ha heltal, kommer en starkt skrivit matris av heltal standard till alla nollor.

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

    Vi kan använda multiplikationstricket för att göra detta också.,

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

    det fina med multiplikationstricket är att du kan använda vilket värde som helst. Så om du hellre vill ha 255 som standardvärde, skulle detta vara ett bra sätt att göra det.

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

    kapslade matriser

    en array inuti en array kallas en kapslad array. Jag använder inte dessa mycket i PowerShell men jag har använt dem mer på andra språk. Överväg att använda en rad matriser när dina data passar i ett rutnät som mönster.

    här är två sätt vi kan skapa en 2 dimensionell array.,

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

    kommatecken är mycket viktigt i dessa exempel. Jag gav ett tidigare exempel på en normal array på flera linjer där kommatecken var valfritt. Det är inte fallet med en flerdimensionell array.

    hur vi använder indexnotationen ändras något nu när vi har en kapslad array. Använda$data ovan, så här skulle vi komma åt värdet 3.

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

    Lägg till en uppsättning fäste för varje nivå av array nesting., Den första uppsättningen parentes är för den yttre mest array och sedan arbetar du dig in därifrån.

    skriv-Output-NoEnumerate

    PowerShell gillar att packa upp eller räkna upp arrays. Detta är en kärnaspekt av hur PowerShell använder rörledningen men det finns tillfällen som du inte vill att det ska hända.

    Jag rör ofta objekt tillGet-Member om du vill veta mer om dem. När jag rör en array till det, blir det oförpackat och Get-medlem ser medlemmarna i matrisen och inte själva matrisen.,

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

    för att förhindra att uppackningen av matrisen kan du använda Write-Object -NoEnumerate.

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

    Jag har ett andra sätt att göra detta som är mer av ett hack (och jag försöker undvika hackar så här). Du kan placera ett komma framför matrisen innan du rör den.

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

    returnera en array

    detta un-omslag av arrayer händer också när du matar ut eller returnerar värden från en funktion., Du kan fortfarande få en array om du tilldelar utmatningen till en variabel så det här är inte vanligtvis ett problem.

    fångsten är att du kommer att ha en ny array. Om det någonsin är ett problem kan du använda Write-Output -NoEnumerate $array eller return ,$array för att arbeta runt det.

    något annat?

    Jag vet att det här är mycket att ta in. Mitt hopp är att du kommer att lära dig något från den här artikeln varje gång du läser den och att det kommer att visa sig vara en bra referens för dig under lång tid framöver., Om du tycker att detta är till hjälp, vänligen dela den med andra som du tror kommer att få värde av det.

    härifrån rekommenderar jag att du kolla in ett liknande inlägg som jag skrev om hashtables.

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *