ofta när du skriver PowerShell-skript behöver du ett sätt att lagra en uppsättning objekt. Ett vanligt sätt att uppnå detta är med en array eller specifik typ som kallas en ArrayList. Men vad är en array egentligen? En array är en datastruktur som är utformad för att lagra en samling objekt. Detta kan inkludera både samma och olika typer av objekt.

arrayer används i många olika programmeringsspråk och PowerShell är inte annorlunda. Det finns många sätt att skapa, manipulera och optimera arrays., I den här artikeln kommer du att lära dig om arraylister, Arrays och samlingar samt några bästa praxis när du använder dem med PowerShell.

Innehållsförteckning

förutsättningar/krav

eftersom du bara arbetar med själva PowerShell-språket finns det inga miljökrav. Du behöver bara ha en Windows-dator med PowerShell. Mer specifikt:

  • Windows PowerShell 3 eller senare
  • . NET Framework 4.5 eller senare

vill du ha fler tips så här?, Kolla in min personliga PowerShell blogg på:https://nkasco.com/FriendsOfATA

skapa matriser med PowerShell

det finns många olika sätt att skapa matriser med PowerShell. Låt oss anta att du har en lista med namn som du behöver bearbeta på något sätt som visas nedan.

JohnSusieJimJohnnyCarrie

Building Arrays via kommaseparerade element

det mest grundläggande sättet att skapa en array är att helt enkelt tilldela kända ingångar, kommaseparerade, till en variabel som visas nedan.,

$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"

om du kör metoden GetType() som finns tillgänglig på alla objekt i PowerShell ser du att du har skapat en array som anges av egenskapen BaseType nedan.

PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array

använda Underuttrycksoperatören

Du kan också skapa matriser i PowerShell via en underuttrycksoperatör. Detta koncept används ofta när du inte vet hur många objekt kommer att läggas till din array. Resultatet kan innehålla noll eller många objekt när de skapas.,

Observera under en array som heter$MyArray har skapats med noll element inuti.

#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0

använda Range Operator

arrayer är inte bara förpassas till lagring av strängar som visas ovan. Du kan också skapa matriser med andra objekttyper som heltal.

om du behöver en rad heltal i sekventiell ordning kan du ta en genväg och använda intervallet .. – operatören. Nedan kan du se en array skapades med heltal 2 till 5 med en enda rad kod.,

PS51> $NumberedArray = 2..5PS51> $NumberedArray2345

skapa PowerShell ArrayList Samlingar

använda en PowerShell ArrayList är också ett sätt där du kan lagra en lista över objekt med PowerShell. Arraylistklassen är en del av systemet.Genom att skapa ett nytt objekt av den här typen kan du sedan lagra objekt i en ArrayList.

nedan kan du se att du uttryckligen måste skapa ett Arraylistobjekt med hjälp av New-Object cmdlet eller genom att gjuta en standardmatris till ett Arraylistobjekt.,

Observera att i detta fall ärBaseType ett objekt medan ovanstående exempel har Basatyper av arrayer som uppvisar arv från Objektklassen. I slutändan ger PowerShell tillgång till.NET-typsystemet.

lägga till objekt i en Array

När du skapar en array kan du antingen definiera alla element vid skapande tid eller lägga till dem Ad-hoc.

för att lägga till element i en befintlig samling kan du använda += – operatören eller Add – metoden. Men vet att det finns stora skillnader i hur de fungerar.,

När du skapar en standardmatris med @()använder du += – operatören men för att lägga till element i en ArrayList använder du Add – metoden. Dessa metoder skiljer sig åt eftersom+= – operatören faktiskt förstör den befintliga matrisen och skapar en ny med det nya objektet.

för att visa, ser du nedan kan du referera till egenskapenIsFixedSize för en array eller ArrayList att veta vilken som är oföränderlig och vilken som inte är.,

PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse

eftersom en grundläggande array är en samling av fast storlek kan du inte ändra den.

försök att använda metodenAdd() med en matris som är fast storlek kommer att resultera i ett fel på grund av den fasta storleken. Nedan kan du se några exempel där du framgångsrikt kan lägga till objekt i en array.

#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"

ta bort objekt från en Array

nu när du har en bättre förståelse för hur du lägger till objekt i en array, låt oss täcka några sätt du kan ta bort objekt från en array.,

eftersom en grundläggande matris är fast kan du inte ta bort objekt från dem. Istället måste du skapa en helt ny array. Du kan till exempel ta bort ett enda element från en array genom att skapa ett villkorligt uttalande som bara matchar de element du vill inkludera. Ett exempel visas nedan.

$NewBasicArray = $BasicArray -ne "Nate"

eftersom en ArrayList inte är fixad kan du ta bort element från dem medRemove() – metoden. Detta är ett scenario där användning av en ArrayList kan gynna dig om du planerar att ofta lägga till/ta bort objekt.,

$MyArrayList.Remove("Nate")

hämta specifika objekt från en Array eller ArrayList

för att hämta specifika objekt från en array eller ArrayList kan du använda många olika metoder. Ungefär som andra objekt i PowerShell, kan du komma åt alla delar av en array genom att helt enkelt ringa objektet.

PS51> $BasicArrayJohnSusieJimJohnnyCarrie

Du kanske bara behöver hämta det första elementet, matriser kommer alltid att ha ett ursprung på 0 som representerar det första elementet i matrisen. Om du vill hämta det första elementet i en array anger du indexnumret inom parentes enligt nedan.,

PS51> $BasicArrayJohn

omvänt kan du också referera index bakåt genom att använda ett streck (negativ indikator) för att ringa det sista x-antalet element från matrisen. Ett vanligt sätt att hitta det sista elementet i en array är att använda -1 som visas nedan.

PS51> $BasicArrayCarrie

den range-operatör som du lärde dig om ovan kan också användas för att hämta objekt i en array genom att följa samma metod för att anropa elementen. Låt oss säga att du vill hämta de fyra första namnen i matrisen$BasicArray.,

Du kan se nedan kan du ange ett intervall av index 0-3 som kommer att returnera de fyra första elementen.

PS51> $BasicArrayJohnSusieJimJohnny

optimera matriser med PowerShell

Nu när du har en bra grund för hur du skapar och manipulerar arrays, vilken ska du använda? För att svara på det, låt oss gå igenom några exempel medMeasure-Command cmdlet. MedMeasure-Command cmdlet förstår du bättre hur lång tid kommandon tar för att bearbeta element när de skickas ner i rörledningen.,

generellt sett, om du har en liten samling objekt som du sannolikt inte kommer att märka stor skillnad med hur du manipulerar dina matriser. Men om du har en stor samling objekt är det viktigt att förstå skillnaderna för att uppnå optimala resultat.

låt oss tillämpa det du just lärt dig i föregående avsnitt om skillnaden mellan+= och användaAdd() – metoden med en slinga på 50 000 objekt.

först, skapa en tom array och en tom ArrayList som visas nedan.,

PS51> $MyArray = @()PS51> $MyArrayList = @()

därefter fyller du 50 000 element i varje samling med hjälp av intervalloperatören och en foreach-slinga som visas nedan.

@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})

slutligen, slå in dina kommandon i ett uttryck och skicka det uttrycket tillMeasure-Command cmdlet. Genom att köra uttrycket med Measure-Command kan du se hur lång tid varje process faktiskt tar att utföra.

tänk på att+= faktiskt skapar en ny array snarare än att lägga till en fast.,

resultatet? Nästan 60 sekunder mot 139 millisekunder!

som du kan se är det mycket snabbare att utnyttja en ArrayList för stora samlingar snarare än att använda en fast storlek array.

Även om detta är ett grundläggande exempel, betonar det vikten av att förstå vad din kod gör under bearbetningen. Om det inte är korrekt förstått kan det leda till en dålig användarupplevelse.,

om du har något befintligt skript som kan dra nytta av att använda en ArrayList snarare än en array, skulle detta innebära en fantastisk möjlighet att göra en övernattning förbättring!

Ytterligare läsning

  • jämföra matriser med PowerShell
  • hur man skapar matriser för prestanda i PowerShell (MCPmag)

vill du ha fler tips så här? Kolla in min personliga PowerShell blogg på: https://nkasco.com/FriendsOfATA.