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
- All-EQ
- Array addition
- Plus är lika med +=
- Pipeline assignment
- starkt skrivit arrays
- ArrayList
- Generisk lista
- lista
- ta bort()
- fler samlingar
- förstora arrays
- multiplicera arrays
- initiera med 0
- kapslade arrays
- skriv-output-noenumerate
- returnera en array
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 $null
och du försöker indexera den som en array, får du ett System.Management.Automation.RuntimeException
undantag 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 - 1
eller-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 $null
på 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. Uttalandetusing
må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.