• 10/08/2020
  • 24 minuter att läsa
    • j
    • h
    • s
    • V

arrayer är ett grundläggande språk för de flesta programmeringsspråk. De är en samling avvärden eller objekt som är svåra att undvika. Låt oss ta en närmare titt på arrays och allt dehar att erbjuda.,

Obs

den ursprungliga versionen av denna artikel dök upp på bloggen skriven av @KevinMarquette. ThePowerShell team tack Kevin för att dela innehållet med oss. Vänligen kolla in hans blogg atPowerShellExplained.com.

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 avmost programmeringsspråk innan jag byter till andra sätt PowerShell använder dem.

en array är en datastruktur som fungerar som en samling av flera objekt., Du kan iterera över thearray eller komma åt enskilda objekt med hjälp av ett index. Matrisen skapas som en sekventiell Bit avminne 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 meddem i PowerShell.,

skapa en matris

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

PS> $data = @()PS> $data.count0

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.count4PS> $dataZeroOneTwoThree

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, får vi 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ämnad.,

$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ärdu har flera objekt, det gör det också lättare att jämföra med tidigare versioner när du använder sourcecontrol.

annan syntax

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

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

skriv-utgång för att skapa matriser

ett coolt litet trick värt att nämna är att du kan användaWrite-Output för att snabbt skapa stringsat 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 accepterarsträ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. Det här ärhur vi får det första objektet i vår array:

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

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änderen 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 toskip det första objektet.

PS> $dataOne

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

PS> $dataThree

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 offsetbecause det är vad det verkligen är, men denna förskjutning kallas mer allmänt som ett index. Anindex 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 överindex kan vi välja flera objekt.

PS> $dataZeroTwoThree

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

PS> $dataThreeZeroThree

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

PS> $dataOneTwoThree

detta fungerar även i omvänd ordning.

PS> $dataThreeTwoOne

Du kan använda negativa 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> $dataThree

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 returnerar tyst ingenting.

PS> $null -eq $dataTrue

kan inte indexeras till en null-matris

om din variabel är$null och du försöker indexera den som en matris får du ettSystem.Management.Automation.RuntimeException undantag med meddelandetCannot index into a null array.,

PS> $empty = $nullSP> $emptyError: 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.count4

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

PS> $date = Get-DatePS> $date.count1

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

PS> $null.count0

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

Off-by-one fel

ett vanligt programmeringsfel skapas eftersom arrayer startar vid index 0. Off-by-one fel kan varaintroduceras på två 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 tänka att du har fyra objekt och du vill ha sista objektet, så du använder countto tillgång till 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> $dataThree

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

PS> $dataThree

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

PS> $data.GetUpperBound(0)3PS> $dataThree

det näst vanligaste sättet är när man itererar listan och inte stoppar vid rätt tidpunkt. I ’ llrevisit detta när vi talar om att använda for loop.

Uppdatera objekt

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

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

om vi försöker uppdatera ett objekt som är förbi det sista elementet får vi ettIndex 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 kan du behöva gå eller iterera hela listan och utföra vissa åtgärder för eachitem i matrisen.

rörledning

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

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

om du inte har sett$PSItem innan, vet du bara att det är samma sak som$_., Du kan använda eitherone 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 tillåter dig attring .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 Barage scriptblocket.

$data.foreach{"Item "}

detta är en mindre känd syntax men det fungerar precis samma. Dennaforeach metod lades inPowerShell 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 theindex med 1. I det här fallet är$index++ kort för$index = $index + 1.

När du använder enfor loop, var särskilt uppmärksam på villkoret. Jag använde$index -lt $data.count här. Det är lätt att få villkoret lite fel att få en off-by-oneerror i din logik., Använda $index -le $data.counteller$index -lt ($data.count - 1) är någonsin soslightly fel. Det skulle orsaka ditt resultat att bearbeta för många eller för få objekt. Detta är den klassiska off-by-one fel.

Switch loop

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

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

det finns många coola saker som vi kan göra med switch-satsen. Jag har en annan artiklededicated till 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 kanske du vill toupdate värdena i matrisen när du slingrar över dem. De flesta slingorna ovan använder en variabel islinga som innehåller en kopia av värdet. Om du uppdaterar den variabeln är det ursprungliga värdet i matriseninte uppdaterat.

undantaget från detta uttalande ärfor – slingan., Om du vill gå en array och uppdatera valuesinside det, då for loop är 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 tillbaka.

matriser av objekt

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

$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ågradetaljer 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> $dataFirstName LastName----- ----Kevin Marquette

Vi kan komma åt och uppdatera egenskaper direkt.,

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

Array egenskaper

normalt måste du räkna upp hela listan så här för att komma åt alla egenskaper:

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

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

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

men PowerShell ger oss möjlighet att begäraLastName direkt. PowerShell räknar upp themall för oss och returnerar en ren lista.

PS> $data.LastNameMarquetteDoe

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

where-Object filtering

det är därWhere-Object kommer in så att vi kan filtrera och välja vad vi vill ha ut av matrisenbaserat på objektets egenskaper.

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

Vi kan skriva samma Fråga 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 theindex 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 $data – matrisen. Eftersom objekt är referenstyper refererar variabeln$person exakt samma objekt som finns i matrisen. Så uppdateringar av itsproperties uppdaterar 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 kan 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å låt oss titta på det först., Jag gillar -join – operatören och använder den ofta. Det förenar alla element i matrisen med tecknet eller strängen somdu anger.

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $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 alltingutan en avgränsare, istället för att göra detta:

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

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

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

-Ersätt och-dela

de andra operatörerna som-replace och-split kör 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-01LAX-SQL-02LAX-SQL-03

-innehåller

-contains operatören kan du kontrollera en rad värden för att se om den innehåller en specifiedvalue.

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 duanvänd-in – operatören. Värdet skulle vara till vänster och matrisen på höger sida avoperatören.

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

detta kan bli dyrt om listan är stor. Jag använder ofta ett regex-mönster om jag kontrollerar mer ännågra värden.,

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

-EQ och-ne

jämlikhet och arrays kan bli komplicerade. När matrisen är på vänster sida får varje objektjämfört. Istället för att returneraTrue returnerar det objekt 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'redblue

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 ettFalse – värde. Båda dessa nästa uttalanden utvärderar 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.

-matcha

-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-01ATX-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 tittar närmare påSelect-String,-match och variabeln$matches I ett annat inlägg som kallasde 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 fleralitemer 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 array. Om du vet att du har en array, kontrolleratal av objekt i den., Om matrisen är $null är antalet 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

det finns ytterligare en fälla att se upp för här. Du kan användacount även om du har ett singleobject, 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 kan du slå in objektet i en matris innan du kontrollerar räkningen för att få en korrekt räkning.,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

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

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

All-EQ

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

$results = Test-Somethingif ( -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, dådu måste skapa en ny array och kopiera alla värden över från den gamla matrisen. Detta låter som många arbeten, men PowerShell döljer komplexiteten att skapa den nya matrisen. PowerShellimplements tilläggsoperatören (+) för matriser.

Obs

PowerShell implementerar inte en subtraktionsoperation. Om du vill ha ett flexibelt alternativ till anarray måste du använda ett generiskt List – objekt.,

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 + $secondZeroOneTwoThree

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 du duplicerar och skapar en ny array. Detta är en 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 är en array om den innehåller multipleitems.

$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-linersna. Vi kangenomsnitta rörledningen medforeach() uttalanden och andra slingor. Så istället för att lägga till objekt till anarray i en slinga, kan vi släppa objekt på rörledningen.

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

Array Types

som standard skapas en array i PowerShell som en] – typ., Detta gör det möjligt att innehållanå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 samlingarsom 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 array som isfaster att arbeta med. Det fungerar som ett objekt array varje plats som vi behöver det, men det hanterar addingitems 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 tillskapa den. Sedan kallar viAdd – metoden 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. Some.NET samtal gör 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å usingStringBuilder. Det är nästan samma sak men har några metoder som bara är för att hantera strängar. StringBuilder är speciellt utformad för prestanda.

det är vanligt att se människor flytta till ArrayList från arrayer. Men det kommer från en tid då c # didn ’ thave generiskt stöd., DenArrayList är föråldrad till 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 anger dedatatyper den använder när den skapas. Så om du vill ha en lista med siffror eller strängar, skulle du definieraatt 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 medusing namespace – uttalandet i PowerShell 5 och senare. Uttalandetusing måste vara den första raden i ditt skript. Genom att deklarera ett namnområde, PowerShelllets du lämnar den utanför 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 element som andra matriser.

PS> $myList10

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")ZeroOneThree

När du arbetar med värdetyper tar den bort den första från listan. Du kan kalla det över andover igen för att fortsätta ta bort det värdet. Om du har referenstyper måste du ange objektetatt du vill ta bort.,

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

borttagningsmetoden returnerartrue 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å thatmark Thatmark Kraus sätta ihop.

andra nyanser

nu när jag har täckt alla stora funktioner, här är några fler saker som jag ville hauppmärksamhet innan jag avslutar det här.,

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 aven förutbestämd storlek genom att ringa den med konstruktören new($size).

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

multiplicera arrayer

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

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

initiera med 0

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

PS> ]::new(4)0000

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

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

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

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

kapslade matriser

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

här är två sätt vi kan skapa en två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 vanlig matris 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 = 0PS> $inside = 2PS> $data3

Lägg till en uppsättning fäste för varje nivå av array nesting., Den första uppsättningen parentes är för det yttersta arrayen 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 thepipeline 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, itgets unwrapped och Get-medlem ser medlemmarna i matrisen och inte den faktiska arrayen.,

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

för att förhindra att arrayen öppnas kan du använda Write-Object -NoEnumerate.

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

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

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

returnera en array

denna upprullning av arrayer händer också när du matar ut eller returnerar värden från en funktion. Du kanfortfarande få en array om du tilldelar utdata till en variabel så detta är inte ofta ett problem.

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

något annat?