PowerShell is een krachtige taal. Maar wat maakt deze scripttaal zo krachtig? PowerShell-objecten. Wat zijn deze magische objecten en hoe werkt PowerShell ermee? Blijf kijken om erachter te komen.
PowerShell is een objectgeoriënteerde taal en shell. Dit is een breuk met de traditionele shells zoals cmd en Bash. Deze traditionele shells richtten zich op tekst, ook wel bekend als strings, en hoewel ze nog steeds nuttig zijn, zijn ze beperkt in hun mogelijkheden. Bijna alles in PowerShell is een object.
In dit artikel leer je enkele belangrijke concepten als het gaat om objecten in PowerShell. Tegen het einde van dit artikel heb je geleerd hoe je deze kennis kunt toepassen op je eigen scripting via behulpzame voorbeeldcode en visualisaties.
Als je meer een visuele leerling bent, kun je gerust de bijbehorende video van dit artikel hieronder bekijken.
Dus maak je klaar! Je staat op het punt een gedenkwaardige ervaring tegemoet te gaan die je zal helpen het concept van objecten in PowerShell onder de knie te krijgen!
Vereisten
In dit artikel ga je aan de slag met het leren over objecten in PowerShell via een praktische aanpak. Als je ervoor kiest om mee te doen en de voorbeeldcode te proberen, zou Windows PowerShell 5.1 of enige versie van PowerShell 6+ moeten werken. Alle voorbeelden die je ziet, worden echter uitgevoerd op Windows 10 build 1903 met Windows PowerShell 5.1.
Begrip van de Anatomie van een Object
Objecten zijn overal in PowerShell. Misschien vraag je jezelf af “Hoe ziet een object eruit?” In deze eerste sectie krijg je een overzicht van waar een object uit bestaat. Zodra je een breed beeld hebt van wat een object tot een object maakt, kun je vervolgens wat voorbeelden van code bekijken!
Het ontdekken van objectleden met Get-Member
Objecten hebben veel verschillende soorten informatie die ermee geassocieerd worden. In PowerShell wordt deze informatie soms leden genoemd. Een objectlid is een generieke term die verwijst naar alle informatie die met een object geassocieerd is.
Om informatie over een object (leden) te ontdekken, kun je de Get-Member
-cmdlet gebruiken. De Get-Member
-cmdlet is een handige opdracht waarmee je beschikbare eigenschappen, methoden en dergelijke voor elk object in PowerShell kunt vinden.
Bijvoorbeeld, stel dat je leden wilt bekijken voor een specifiek object dat wordt teruggegeven via de Get-Service
-cmdlet. Dit kun je doen door de uitvoer van de Get-Service
-opdracht te leiden naar de Get-Member
-cmdlet zoals hieronder te zien is.
Wen eraan om de Get-Member
-cmdlet te gebruiken. Je gaat het veel gebruiken in dit artikel.
Elke opdracht in PowerShell die uitvoer produceert, kan worden geleid naar
Get-Member
. Onthoud alleen dat je deze cmdlet als allerlaatste in de pijplijn moet plaatsen, omdat deze de uitvoer zal overschrijven met zijn eigen uitvoer.
Objecttypes en klassen
Zonder al te veel in detail te treden over object georiënteerd programmeren, heeft elk object een “schema”. Het “schema” van een object is als een sjabloon dat de blauwdruk bevat om een object te maken. Die blauwdruk wordt een type genoemd.
Elk object in PowerShell heeft een specifiek type. Elk object heeft een blauwdruk waar het van is gemaakt. Een objecttype wordt gedefinieerd door een klasse. Neem bijvoorbeeld dit voorbeeld; 9 is een nummer, Bluegill is een vis, Labrador is een hond, etc. De klasse komt voor het type.
Objecten zijn instanties van klassen met een specifiek type.
Maak je geen zorgen over het diep ingaan op dit onderwerp. Tenzij je een softwareontwikkelaar bent, hoef je je waarschijnlijk niet te veel zorgen te maken over de semantiek op dit punt. Het is echter een belangrijk concept om op een basisniveau te kennen.
Eigenschappen
Het belangrijkste concept dat je moet begrijpen over objecten zijn eigenschappen. Eigenschappen zijn kenmerken die een object beschrijven. Een object kan veel verschillende eigenschappen hebben die verschillende kenmerken vertegenwoordigen.
Een van de gemakkelijkste manieren om te ontdekken welke eigenschappen er op objecten bestaan, is het gebruik van de Get-Member
cmdlet. Je kunt hieronder zien dat door de MemberType
parameter te gebruiken, Get-Member
de uitvoer beperkt tot alleen objecten. Je ziet ook dat het het objecttype van System.ServiceProcess.ServiceController weergeeft.

Nu nemen we het voorbeeld van de eerder behandelde BITS-service en bekijken we de specifieke waarden van de eigenschappen van dat object met behulp van de onderstaande code. De Get-Member
-cmdlet stelt je in staat om de namen van de eigenschappen te vinden, maar niet de waarden. Met de Select-Object
-cmdlet van PowerShell kun je echter de eigenschapswaarden inspecteren.
Hieronder kun je zien dat StartType
een eigenschap is van het object. Het object dat wordt teruggegeven, heeft veel verschillende leden, maar door de Select-Object
-cmdlet te gebruiken, beperk je de uitvoer tot alleen die eigenschap.

Eigenschappen zijn veruit het meest voorkomende onderdeel van een object waarmee je in PowerShell zult werken.
Aliassen
Sommige eigenschappen hebben een MemberType
van Alias
. Aliassen zijn pseudoniemen voor eigendomsnamen. Ze kunnen eigenschappen soms een intuïtievere naam geven.
Je kunt een voorbeeld zien van een object met aliassen met behulp van de Get-Service
-cmdlet, zoals hieronder getoond. De eigenschap Name
is aliased naar ServiceName
en RequiredServices
is aliased naar de ServicesDependedOn
-eigenschap.

Wanneer een eigenschap een alias heeft, kun je naar de waarde van die eigenschap verwijzen met behulp van de aliannaam in plaats van de daadwerkelijke eigenschapsnaam. In dit voorbeeld is een beschrijvend attribuut zoals Name
en RequiredServices
intuïtiever en gemakkelijker te typen dan ServiceName
en ServicesDependedOn
.
Je kunt hieronder een voorbeeld zien van het verwijzen naar deze aliassen.
Je zou de volgende uitvoer moeten zien. Let op dat je de code kort, schoon en beknopt houdt. De informatie is hetzelfde, ongeacht of je de alias gebruikt of niet:

Methoden
Eigenschappen zijn slechts een onderdeel dat een object creëert; methoden zijn ook een belangrijk concept om te begrijpen. Methoden zijn de handelingen die op een object kunnen worden uitgevoerd. Net als eigenschappen kun je methoden op een object ontdekken door de Get-Member
-cmdlet te gebruiken.
Om de uitvoer van Get-Member
te beperken tot alleen methoden, stel je de waarde van de parameter MemberType
in op Method
, zoals hieronder weergegeven.

Als beginner zul je methoden veel minder vaak gebruiken dan eigenschappen.
Andere MemberTypes
Eigenschappen, methoden en aliassen zijn niet de enige soorten leden die een object kan hebben. Ze zullen echter verreweg de meest voorkomende soorten leden zijn waarmee je zult werken.
Ter volledigheid volgen hieronder nog een paar andere soorten leden die je tegen zou kunnen komen.
- Script-eigenschap – Deze worden gebruikt om eigenschapswaarden te berekenen.
- Notitie-eigenschap – Deze worden gebruikt voor statische eigenschapsnamen.
- Property Sets – Dit zijn als aliassen die precies bevatten wat de naam aangeeft; sets van eigenschappen. Bijvoorbeeld, je hebt een aangepaste eigenschap genaamd
Specs
gemaakt voor je functieGet-CompInfo
.Specs
is eigenlijk een subset van de eigenschappen Cpu, Mem, Hdd, IP. Het primaire doel van eigenschapsets is om een enkele eigenschapsnaam te bieden om een groep eigenschappen te concatenaten.
It is ook belangrijk om het concept van objectgebeurtenissen te vermelden. Gebeurtenissen vallen buiten de reikwijdte van dit artikel.
Werken met Objecten in PowerShell
Nu je een basisbegrip hebt van waaruit een object bestaat, laten we onze handen vuilmaken en wat code schrijven.
Veel PowerShell-opdrachten produceren uitvoer, maar soms hoef je niet alle uitvoer te zien. Je moet die uitvoer op de een of andere manier beperken of manipuleren. Gelukkig heeft PowerShell een paar verschillende opdrachten die je dat laten doen.
Laten we beginnen met een voorbeeld van het opsommen van alle services op de lokale computer met behulp van de Get-Service
-cmdlet zoals hieronder getoond. Je kunt aan de uitvoer zien dat er veel verschillende services (objecten) worden geretourneerd.

Beheer van Teruggestuurde Objecteigenschappen
Als we doorgaan met het voorbeeld van Get-Service
, wil je misschien niet elke eigenschap zien. In plaats daarvan wil je alleen de eigenschappen Status
en DisplayName
zien. Om eigenschappen te beperken, zou je de Select-Object
-cmdlet gebruiken.
De Select-Object
-cmdlet “filtert” verschillende eigenschappen zodat ze niet worden teruggegeven aan de PowerShell-pijplijn. Om objecteigenschappen te “filteren” en niet terug te geven, kunt u de Property
-parameter gebruiken en een door komma’s gescheiden reeks van één of meer eigenschappen opgeven.
Hieronder ziet u een voorbeeld van het alleen teruggeven van de eigenschappen Status
en DisplayName
.

Objecten sorteren
Misschien bouwt u een rapport om services en hun status te tonen. Voor gemakkelijke informatieverwerking wilt u de objecten gesorteerd zien op basis van de waarde van de Status
-eigenschap. U kunt de Sort-Object
-cmdlet gebruiken om dit te doen.
De Sort-Object
-cmdlet stelt u in staat om alle teruggegeven objecten te verzamelen en deze vervolgens uit te voeren in de door u gedefinieerde volgorde.
Bijvoorbeeld, met behulp van de Property
-parameter van Sort-Object
, kunt u een of meer eigenschappen opgeven op de binnenkomende objecten van Get-Service
om op te sorteren. PowerShell zal elk object doorgeven aan de Sort-Object
-cmdlet en ze vervolgens gesorteerd retourneren op basis van de waarde van de eigenschap.
Hieronder ziet u een voorbeeld van het retourneren van alle service-objecten gesorteerd op hun Status
-eigenschap in aflopende volgorde met behulp van de Descending
-schakelparameter van Sort-Object
.

De pijp [
|
] in PowerShell is een van de weinige technieken voor regelcontinuatie die u moet gebruiken wanneer dat nodig is. Gebruik het in plaats van backticks.
Filteren van objecten
Misschien besluit je dat je niet alle services op een machine wilt zien. In plaats daarvan moet je de uitvoer beperken op basis van specifieke criteria. Een manier om het aantal teruggegeven objecten te filteren, is door gebruik te maken van de Where-Object
cmdlet.
Terwijl de Select-Object
cmdlet de uitvoer van specifieke eigenschappen beperkt, beperkt de Where-Object
cmdlet de uitvoer van gehele objecten.
De Where-Object
cmdlet is vergelijkbaar in functie met de SQL WHERE clause. Het fungeert als een filter van de oorspronkelijke bron om alleen bepaalde objecten terug te geven die aan specifieke criteria voldoen.
Misschien heb je besloten dat je alleen objecten wilt terugkrijgen met een Status
eigenschapswaarde van Running
en alleen die met een DisplayName
eigenschapswaarde die begint met A
.
Je kunt zien in het volgende codefragment dat een Where-Object
referentie is ingevoegd tussen Select-Object
en Sort-Object
in de pijplijnvolgorde. Door een scriptblokwaarde te gebruiken met een vereiste voorwaarde gecreëerd voor elk object om aan te voldoen via de FilterScript
parameter, kun je elke gewenste query maken.
Bekijk de
Format-Table
cmdlet als je wilt manipuleren hoe de uitvoer wordt geretourneerd naar de console.

Tellen en Gemiddelden van Teruggegeven Objecten
De opdracht Get-Service
retourneert vele verschillende objecten. Door gebruik te maken van de Where-Object
cmdlet, heb je een deel van die objecten gefilterd, maar hoeveel? Maak kennis met de Measure-Object
cmdlet.
De Measure-Object
cmdlet is een PowerShell-opdracht die, naast andere wiskundige bewerkingen, kan tellen hoeveel objecten het ontvangt via de pipeline.
Misschien wil je weten hoeveel objecten uiteindelijk worden geretourneerd op het moment dat je gecombineerde opdrachten worden uitgevoerd. Je kunt de uiteindelijke output doorsturen naar de Measure-Object
cmdlet om het totale aantal geretourneerde objecten te vinden zoals hieronder getoond.
Zodra de opdrachten klaar zijn met verwerken, zie je, in dit geval, dat er oorspronkelijk 21 objecten zijn geretourneerd die zijn gemaakt met de Get-Service
cmdlet.

Misschien ben je alleen geïnteresseerd in het totale aantal geretourneerde objecten. Omdat de Measure-Object
opdracht het totale aantal gevonden objecten retourneert via een Count
eigenschap, kun je opnieuw verwijzen naar de Select-Object
cmdlet. Maar dit keer, alleen de Count
eigenschap retourneren.

Actie ondernemen op objecten met Loops
Terwijl elk object wordt verwerkt via de pipeline, kun je actie ondernemen op elk object met een loop. Er zijn verschillende soorten loops in PowerShell, maar om bij de pipeline-voorbeelden te blijven, laten we eens kijken naar de ForEach-Object
cmdlet.
De ForEach-Object
cmdlet stelt je in staat om actie te ondernemen op elk object dat erdoorheen stroomt. Dit gedrag wordt het beste uitgelegd aan de hand van een voorbeeld.
Verdergaand met een voorbeeld van Get-Service
, misschien wilt u alle services op een Windows-computer vinden met een naam die begint met “Windows” en die actief zijn. Met behulp van de Where-Object
cmdlet kunt u de voorwaarden creëren zoals u eerder hebt gedaan.
Maar nu in plaats van volledige objecten of zelfs een paar eigenschappen terug te geven, wilt u de string <ServiceName> is running retourneren voor elk object met behulp van de code **Write-Host -ForegroundColor 'Yellow' <ServiceName> "is running"
.
U manipuleert nu de output en maakt uw eigen string aan. De enige manier om dat te doen is door de ForEach-Object
cmdlet te gebruiken zoals hieronder wordt getoond. Hieronder kunt u zien dat voor elk object dat wordt geretourneerd via Where-Object
, PowerShell de code uitvoert Write-Host -ForegroundColor 'Yellow' $_.DisplayName "is running"
.

De ForEach-Object
cmdlet is op vele manieren nuttig. Als voorbeeld zou u extra logica kunnen inbouwen om door elk gevonden service-object te enumereren en op basis van een eigenschapwaarde de kleur en bewoording van de outputstring te wijzigen of zelfs een aanvullende actie uit te voeren, zoals het starten van een gestopte service.
Stel u de mogelijkheden voor die dit voor u biedt! Met een beetje nadenken en planning zou u een script kunnen maken dat één commando neemt en moeiteloos over vele objecten uitvoert.
Vergelijken van objecten
Soms moet u naar twee objecten kijken en eigenschapswaarden vergelijken.
Misschien heb je twee systemen op je netwerk die bijna identiek zijn. Echter, je ervaart wat je verwacht dat een configuratieprobleem is met een service op een van de twee systemen.
Je concludeert dat aangezien deze systemen zich in verschillende delen van je netwerk bevinden, je externe opdrachten moet gebruiken om de informatie te verzamelen in een PowerShell-sessie. Je opent je favoriete editor en maakt een script. Dit script, zoals je hieronder kunt zien, maakt verbinding met twee verschillende servers en somt alle processen op elk van hen op.
Je hebt nu alle processen op elke computer vastgelegd in de variabelen $ProcA
en $ProcB
. Je moet ze nu vergelijken. Je zou handmatig door elke set processen kunnen gaan, of je zou het op de makkelijke manier kunnen doen en een cmdlet genaamd Compare-Object
kunnen gebruiken.
Compare-Object
stelt je in staat om de eigenschapswaarden van twee verschillende objecten te vergelijken. Deze cmdlet leest elke eigenschap in elk object, kijkt naar hun waarden en retourneert vervolgens wat anders is, standaard en ook wat hetzelfde is.
Om Compare-Object
te gebruiken, specificeer je een ReferenceObject
en een DifferenceObject
-parameter en geef je elk object op als de parameterwaarden zoals hieronder weergegeven.
Standaard retourneert Compare-Object
alleen verschillen in de objecten die worden aangegeven door de eigenschap SideIndicator
. De symbolen of zij-indicatoren die worden gebruikt zijn >
, <
, en =
om de overeenkomsten van de vergeleken objecten te tonen.

U kunt de schakelparameter
IncludeEqual
gebruiken metCompare-Object
om objecteigenschappen terug te geven die hetzelfde zijn. Als dat het geval is, ziet u==
als de zijindicator. Op dezelfde manier kunt uExcludeDifferent
gebruiken om verschillen uit te sluiten.
De Compare-Object
cmdlet is een zeer nuttige cmdlet. Als u meer wilt leren, moet u zeker de online documentatie raadplegen.
Werken met aangepaste objecten
Nu u een goed begrip heeft van wat objecten zijn en hoe u ermee kunt werken, is het tijd om uw eigen objecten te maken!
Het maken van aangepaste objecten van hashtables
Één manier om uw eigen objecten te maken is door hashtables te gebruiken. Hashtables zijn sets van sleutel/waarde-paren precies wat u nodig heeft voor het maken van eigenschappen voor een object.
Laten we beginnen met het maken van een aangepast PowerShell-object met enkele sleutel/waarde-paren met behulp van een hashtable. In het onderstaande voorbeeld maakt u een hashtable. Deze hashtable vertegenwoordigt een enkel object en de eigenschappen ervan. Zodra de hashtable $CarHashtable
is gedefinieerd, kunt u vervolgens de PsCustomObject
type accelerator.
Het typeversneller ‘pscustomobject’ is een snelle manier om een instantie van de klasse ‘pscustomobject’ te maken. Deze gedraging wordt casting genoemd.
Tegen het einde van de onderstaande codefragment, heb je een object ($CarObject
) van het type pscustomobject met vijf toegewezen eigenschappen.
Je kunt ook de cmdlet New-Object
gebruiken. Met dezelfde hashtable, in plaats van de pscustomobject typeversneller te gebruiken, kun je het op de lange manier doen met New-Object
. Een voorbeeld hiervan wordt hieronder getoond.
Wanneer $CarObject
is gemaakt, kun je nu hieronder zien dat je naar elke eigenschap kunt verwijzen alsof het afkomstig is van een ingebouwde PowerShell-cmdlet zoals Get-Service
.

Eigenschappen toevoegen & verwijderen
Niet alleen kun je aangepaste objecten maken, maar je kunt er ook aan toevoegen. Herinner je je het gebruik van de cmdlet Get-Member
? Get-Member
heeft een tegenhanger genaamd Add-Member
. De cmdlet Add-Member
enumereert geen leden, maar voegt ze toe.
Gebruikmakend van het eerder gemaakte aangepaste object als voorbeeld, wil je misschien een eigenschap voor het modeljaar aan dat object toevoegen. Dat kun je doen door een object naar Add-Member
te leiden en specificeren:
- Het type lid (in dit geval een eenvoudige `NoteProperty`)
- De naam van de eigenschap (`Year`)
- De waarde van de eigenschap (`Value`)
U kunt hieronder een voorbeeld hiervan zien.
U kunt hieronder opnieuw zien dat het eruitziet als elke andere eigenschap.

U kunt vergelijkbare technieken gebruiken om veel verschillende soorten leden toe te voegen. Als u zelf meer wilt ontdekken, bekijk dan de `Add-Member` documentatie.
U kunt net zo makkelijk een lid van een object verwijderen. Hoewel er geen `Remove-Member` cmdlet is, kunt u dit nog steeds laten gebeuren door de `Remove()` methode op het object aan te roepen zoals hieronder getoond. U leert over methoden in de volgende sectie.
Snelle introductie tot methoden
Gedurende dit artikel hebt u gewerkt met eigenschappen. U hebt eigenschapswaarden gelezen, uw eigen eigenschappen gemaakt en deze toegevoegd en verwijderd. Maar u heeft eigenlijk niet veel aan de omgeving gedaan. U heeft niets veranderd op de server. Laten we actie ondernemen met methoden.
Methoden voeren een soort actie uit. Objecten slaan informatie op terwijl methoden actie ondernemen.
Bijvoorbeeld, u bent misschien bekend met het `Stop-Service` commando. Dit commando stopt een Windows-service. Om dat te doen, kunt u een object van `Get-Service` rechtstreeks naar `Stop-Service` sturen om het te laten gebeuren.
Je kunt hieronder een voorbeeld zien van het stoppen van de BITS-service. Dit voorbeeld stopt de BITS-service en controleert vervolgens de status om er zeker van te zijn dat deze is gestopt. Je hebt twee acties uitgevoerd met cmdlets; het stoppen van de service en het controleren van de status.
In plaats van tweemaal `Get-Service` uit te voeren en een afzonderlijk commando uit te voeren, `Stop-Service`, kun je in plaats daarvan methoden gebruiken die rechtstreeks in de service-objecten zijn ingebouwd. Veel objecten hebben methoden. In dit geval is `Stop-Service` en die tweede `Get-Service` referentie zelfs niet nodig.

Door methoden op het service-object zelf aan te roepen, kun je stoppen en de bijgewerkte status ophalen, allemaal met één object. Hieronder zie je dit in actie. Let op dat je door de `Stop()` en `Start()` methoden te gebruiken, de service kunt manipuleren net zoals de commando’s deden.
Om ervoor te zorgen dat de waarde van de `Status` eigenschap up-to-date is nadat de servicestatus is gewijzigd, kun je de `Refresh()` methode aanroepen, die werkt als een andere oproep van `Get-Service` commando.
Je zou de volgende output moeten zien:

Voor meer informatie over methoden, bekijk het over_Methoden help onderwerp.
Conclusie
Er zijn veel dingen die je kunt doen met objecten in PowerShell. Dit artikel was slechts een inleiding om je op weg te helpen met leren. In dit artikel heb je wat basisprincipes geleerd over wat objecten zijn, hoe je actie onderneemt, ze manipuleert en maakt. Je hebt een paar verschillende scenario’s gezien die je lieten zien hoe je deze taken kunt uitvoeren met voorbeelden van code. Blijf rustig en leer PowerShell. Bedankt voor het lezen!