- 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 - 1
eller-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.count
eller$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.
Lämna ett svar