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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Vervolgens, vul 50.000 elementen in elke collectie in met behulp van de bereikoperator en een foreach-lus zoals hieronder weergegeven.
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.
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.