PowerShell-arrays, ArrayLists & Collecties: Beste praktijken

Vaak is het nodig om bij het schrijven van PowerShell-scripts een manier te hebben om een set items op te slaan. Een veelvoorkomende manier om dit te bereiken, is met behulp van een array of een specifiek type dat bekend staat als een ArrayList. Maar wat is een array eigenlijk? Een array is een gegevensstructuur die is ontworpen om een verzameling items op te slaan. Dit kan zowel dezelfde als verschillende soorten items bevatten.

Arrays worden gebruikt in veel verschillende programmeertalen, en PowerShell is daarop geen uitzondering. Er zijn veel manieren om arrays te maken, te manipuleren en te optimaliseren. In dit artikel leer je over ArrayLists, Arrays en Collecties, evenals enkele beste werkwijzen bij het toepassen ervan met PowerShell.

Vereisten

Aangezien je alleen met de PowerShell-taal zelf zult werken, zijn er geen omgevingsvereisten. Je moet alleen een Windows-pc met PowerShell hebben. Meer specifiek:

  • Windows PowerShell 3 of later
  • .NET Framework 4.5 of later

Wil je meer tips zoals deze? Bekijk mijn persoonlijke PowerShell-blog op: https://nkasco.com/FriendsOfATA

Arrays maken met PowerShell

Er zijn veel verschillende manieren om arrays te maken met PowerShell. Laten we aannemen dat je een lijst met namen hebt die je op de een of andere manier moet verwerken, zoals hieronder weergegeven.

John
Susie
Jim
Johnny
Carrie

Arrays bouwen via door komma’s gescheiden elementen

De meest basale manier om een array te maken, is eenvoudigweg bekende invoerwaarden, gescheiden door komma’s, toewijzen aan een variabele zoals hieronder weergegeven.

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

Als u de GetType() methode uitvoert die beschikbaar is op alle objecten in PowerShell, zult u zien dat u met succes een array heeft aangemaakt zoals aangegeven door de BaseType eigenschap hieronder weergegeven.

PS51> $BasicArray.GetType()

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     Object[]                                 System.Array

Gebruik van de Sub-Expressie Operator

U kunt ook arrays maken in PowerShell via een sub-expressie operator. Dit concept wordt vaak gebruikt wanneer u niet weet hoeveel items aan uw array zullen worden toegevoegd. Het resultaat kan nul of veel items bevatten bij het maken ervan.

Merk hieronder op dat een array genaamd $MyArray is aangemaakt met nul elementen erin.

# Maak een lege array met de sub-expressie operator
PS51> $MyArray = @()
PS51> $MyArray.count
0

Gebruik van de Range Operator

Arrays zijn niet alleen beperkt tot het opslaan van strings zoals hierboven getoond. U kunt ook arrays maken met andere objecttypen zoals integers.

Als u een array van integers in sequentiële volgorde nodig heeft, kunt u een snelkoppeling nemen en de bereik .. operator gebruiken. Hieronder ziet u een array die is aangemaakt met de integers 2 tot 5 met slechts één regel code.

PS51> $NumberedArray = 2..5
PS51> $NumberedArray
2
3
4
5

Het maken van PowerShell ArrayList-collecties

Het gebruiken van een PowerShell ArrayList is ook een manier waarop u een lijst van items met PowerShell kunt opslaan. De ArrayList-klasse maakt deel uit van de System.Collections-namespace binnen .NET. Door een nieuw object van dit type te maken, kunt u vervolgens objecten opslaan binnen een ArrayList.

Hieronder kunt u zien dat u expliciet een ArrayList-object moet maken met behulp van de New-Object cmdlet of door een standaard array te casten naar een ArrayList-object.

Merk op dat in dit geval de BaseType een object is, terwijl de bovenstaande voorbeelden BaseTypes hebben van Arrays die overerven van de klasse Object. Uiteindelijk biedt PowerShell toegang tot het .NET-type systeem.

PS51> $MyArrayList = New-Object -TypeName "System.Collections.ArrayList"
# Een array casten als een ArrayList is ook een haalbare optie
PS51> $MyArrayList = [System.Collections.ArrayList]@()
PS51> $MyArrayList.GetType()

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     ArrayList                                System.Object

Items Toevoegen aan een Array

Bij het maken van een array kun je ofwel alle elementen bij creatie definiëren, of ze ad-hoc toevoegen.

Om elementen toe te voegen aan een bestaande collectie, kun je de +=-operator of de Add-methode gebruiken. Maar weet dat er grote verschillen zijn in hoe ze werken.

Als je een standaard array maakt met @(), gebruik je de +=-operator om elementen toe te voegen. Maar om elementen toe te voegen aan een ArrayList, zou je de Add-methode gebruiken. Deze methoden verschillen doordat de +=-operator eigenlijk het bestaande array vernietigt en een nieuw array maakt met het nieuwe item.

Om dit te demonstreren, kun je hieronder zien dat je de eigenschap IsFixedSize kunt raadplegen voor een array of ArrayList om te weten welke onveranderlijk is en welke niet.

PS51> $BasicArray.IsFixedSize
True

PS51> $MyArrayList.IsFixedSize
False

Aangezien een basisarray een verzameling van vaste grootte is, kun je deze niet wijzigen.

Proberen om de methode Add() te gebruiken met een array van vaste grootte zal leiden tot een fout als gevolg van de vaste grootte. Hieronder zie je een paar voorbeelden waarin je met succes items aan een array kunt toevoegen.

#Werkt NIET
$BasicArray.Add("Nate")

#Werkt
$BasicArray += "Nate"
$MyArrayList.Add("Nate")
$MyArrayList += "Nate"

Items Verwijderen Uit Een Array

Nu je een beter begrip hebt van hoe je items aan een array kunt toevoegen, laten we een paar manieren bespreken waarop je items uit een array kunt verwijderen.

Aangezien een basisarray vast is, kun je geen items uit de array verwijderen. In plaats daarvan moet je een geheel nieuwe array maken. Bijvoorbeeld, je kunt een enkel element uit een array verwijderen door een voorwaardelijke verklaring te maken die alleen overeenkomt met die elementen die je wilt behouden. Een voorbeeld wordt hieronder getoond.

$NewBasicArray = $BasicArray -ne "Nate"

Aangezien een ArrayList niet vast is, kun je elementen eruit verwijderen met de methode Remove(). Dit is een scenario waarin het gebruik van een ArrayList je kan helpen als je vaak items wilt toevoegen/verwijderen.

$MyArrayList.Remove("Nate")

Specifieke Items Ophalen Uit Een Array of ArrayList

Om specifieke items uit een array of ArrayList op te halen, kun je veel verschillende methoden gebruiken. Net als bij andere objecten in PowerShell kun je alle elementen van een array benaderen door eenvoudigweg het object aan te roepen.

PS51> $BasicArray
John
Susie
Jim
Johnny
Carrie

Misschien moet je alleen het eerste element ophalen; arrays hebben altijd een oorsprong van 0, wat het eerste element van de array vertegenwoordigt. Om het eerste element van een array op te halen, geef je het indexnummer op tussen vierkante haken zoals hieronder getoond.

PS51> $BasicArray[0]
John

Omgekeerd kun je ook refereren naar indexen achteruit door een streepje (negatieve indicator) te gebruiken om de laatste X aantal elementen uit de array te halen. Een veelvoorkomende manier om het laatste element in een array te vinden is door -1 te gebruiken zoals hieronder getoond.

PS51> $BasicArray[-1]
Carrie

De bereikoperator die je hierboven hebt geleerd, kan ook worden gebruikt om objecten van een array op te halen door dezelfde methode te volgen om de elementen aan te roepen. Laten we zeggen dat je de eerste vier namen in de $BasicArray array wilt ophalen.

Je kunt hieronder zien dat je een bereik van indexen 0-3 kunt specificeren, wat de eerste vier elementen zal retourneren.

PS51> $BasicArray[0..3]
John
Susie
Jim
Johnny

Optimaliseren van Arrays met PowerShell

Nu je een goede basis hebt van hoe je arrays kunt maken en manipuleren, welke moet je dan gebruiken? Om daar antwoord op te geven, laten we een paar voorbeelden doornemen met behulp van het Measure-Command cmdlet. Door het Measure-Command cmdlet te gebruiken, zul je beter begrijpen hoe lang commando’s nodig hebben om elementen te verwerken terwijl ze worden doorgegeven via de pijplijn.

Over het algemeen, als je een kleine verzameling objecten hebt, zul je waarschijnlijk niet veel verschil opmerken in hoe je je arrays manipuleert. Als je echter een grote verzameling objecten hebt, is het belangrijk om de verschillen te begrijpen om optimale resultaten te behalen.

Laten we toepassen wat je zojuist hebt geleerd in de vorige sectie over het verschil tussen += en het gebruik van de Add() methode met een lus van 50.000 items.

Eerst, maak een lege array en een lege ArrayList zoals hieronder weergegeven.

PS51> $MyArray = @()
PS51> $MyArrayList = [System.Collections.ArrayList]@()

Vervolgens, vul 50.000 elementen in elke collectie in met behulp van de bereikoperator en een foreach-lus zoals hieronder weergegeven.

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

Tenslotte, wikkel je commando’s in een expressie en geef die expressie door aan de Measure-Command cmdlet. Door de expressie uit te voeren met Measure-Command, kunt u zien hoe lang elk proces daadwerkelijk duurt om uit te voeren.

Houd er rekening mee dat, zoals je eerder hebt geleerd, += eigenlijk een nieuwe array creëert in plaats van toe te voegen aan een vaste.

PS51> Measure-Command -Expression {@(0..50000).foreach({$MyArray += $_})}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 59
Milliseconds      : 58
Ticks             : 590585963
TotalDays         : 0.000683548568287037
TotalHours        : 0.0164051656388889
TotalMinutes      : 0.984309938333333
TotalSeconds      : 59.0585963
TotalMilliseconds : 59058.5963

PS51> Measure-Command -Expression {@(0..50000).foreach({$MyArrayList.Add($_)})}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 139
Ticks             : 1399989
TotalDays         : 1.62035763888889E-06
TotalHours        : 3.88885833333333E-05
TotalMinutes      : 0.002333315
TotalSeconds      : 0.1399989
TotalMilliseconds : 139.9989

Het resultaat? Bijna 60 seconden versus 139 milliseconden!

Zoals je kunt zien, is het veel sneller om een ArrayList te gebruiken voor grote collecties in plaats van een array met een vaste grootte.

Hoewel dit een basisvoorbeeld is, benadrukt het het belang van begrijpen wat je code doet tijdens de verwerking. Als het niet goed wordt begrepen, kan dit resulteren in een slechte gebruikerservaring.

Als je een bestaand script hebt dat zou kunnen profiteren van het gebruik van een ArrayList in plaats van een array, dan zou dit een fantastische kans zijn om ’s nachts een verbetering door te voeren!

Verder lezen

Wil je meer tips zoals deze? Bekijk mijn persoonlijke PowerShell-blog op: https://nkasco.com/FriendsOfATA.

Source:
https://adamtheautomator.com/powershell-array/