Door Yoeri Lauwers

Eindredacteur

Een introductie tot Windows PowerShell

19-09-2006 • 13:51

47

Singlepage-opmaak

Het hoe en wat van Cmdlets

De kern van de Powershell wordt gevormd door de zogenaamde Cmdlets. Dit zijn ingebouwde commando's die allen gebaseerd zijn op dezelfde .NET-klasse en dus ook over een basisset eigenschappen en functies beschikken. Bovendien is het mogelijk om zelf Cmdlets te schrijven en deze aan de Powershell toe te voegen. De naam van de commando's is over het algemeen zelfbeschrijvend gekozen en bestaat uit een werkwoord gevolgd door een zelfstandig naamwoord. Met het commando set-date, is het dus bijvoorbeeld mogelijk om de huidige datum in te stellen, terwijl get-process een lijstje met draaiende processen teruggeeft. Met de opdracht get-command krijgt men een overzicht van de beschikbare Cmdlets.

PS> Get-Command

CommandType Name Definition
----------- ---- ----------
Cmdlet Add-Content Add-Content [-Path] Cmdlet Add-History Add-History [[-InputObject] ...
Cmdlet Add-Member Add-Member [-MemberType] <PS...
Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <String...
Cmdlet Clear-Content Clear-Content [-Path] ...
Cmdlet Get-Process Get-Process [[-Name] Cmdlet Get-PSDrive Get-PSDrive [[-Name] ...
Cmdlet Write-Progress Write-Progress [-Activity] <...
Cmdlet Write-Verbose Write-Verbose [-Message] <St...
Cmdlet Write-Warning Write-Warning [-Message] <St...

Deze opdracht is echter niet beperkt tot ingebouwde Cmdlets, maar kan ook informatie verschaffen over commando's die niet tot de Powershell behoren. Zo is het door gebruik te maken van de parameter *.com mogelijk een overzicht te krijgen van de commando's met .com-extensie. In dat geval krijgt men echter geen lijstje met de beschikbare parameters voor dit commando, omdat deze niet vanuit de Powershell bepaald kunnen worden, maar het volledige pad naar het bestand voorgeschoteld.

* Werken met parameters

Zoals bij het gebruik van het commando Get-Commands al duidelijk werd, is het mogelijk om parameters mee te geven met Cmdlets. Deze parameters worden voorafgegaan door een koppelteken en de naam van de parameter. Om bijvoorbeeld de gegevens van het proces explorer.exe op te vragen kan de parameter ProcessName als volgt gebruikt worden: Get-Process -ProcessName explorer. Om typwerk te besparen is het echter niet nodig de volledige parameternaam te hanteren. Het volstaat de eerste karakters te gebruiken, zodoende dat er geen twijfel meer kan bestaan over welke parameter bedoeld wordt. In het eerder genoemde geval zijn er geen andere parameters die met de letter 'p' beginnen, dus zou Get-Process -p explorer volstaan. Daarnaast zijn er ook Cmdlets die 'position sensitive' parameters hebben. Dit betekent dat de naam van de parameter helemaal weggelaten kan worden, zodat Get-Process explorer volstaat.

PS> Get-Process -ProcessName explorer

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
574 20 26104 41596 140 232,92 540 explorer


PS> Get-Process -p explorer

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
574 20 26104 41596 140 232,95 540 explorer


PS> Get-Process explorer

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
574 20 26104 41596 140 232,95 540 explorer

Verder zijn er een aantal parameters die bij elke Cmdlet gebruikt kunnen worden, de zogenaamde 'Common Parameters'.

ParameterFunctie
Debug Geeft meer informatie over de acties die ondernomen worden tijdens het uitvoeren van het commando.
ErrorAction Controleert het gedrag van het commando als er een fout optreedt.
ErrorVariable De naam van de variabele waarin objecten waarbij zich een fout voordoet moeten opgeslagen worden.
OutVariable Naam van de variabele waarin de uitvoer van het commando moet opgeslagen worden. Equivalent aan het pipen van de uitvoer door middel van | set-variable <naam> -passthru true.
Confirm Vraagt de gebruiker om bevestiging alvorens wijzigingen in het systeem aan te brengen.
Verbose Geeft gedetailleerde informatie over het verloop van het commando.
WhatIf Geeft informatie over aanpassingen die het commando zou uitvoeren, maar voert deze niet effectief uit.
* Zelf Cmdlets maken

Naast het gebruik van de ingebouwde Cmdlets, is het dankzij de .NET-funderingen mogelijk om zelf Cmdlets te schrijven die vervolgens in de Powershell gebruikt kunnen worden. Een gedetailleerde omschrijving van de werkwijze hiervoor valt buiten het bestek van deze feature, maar programmeurs die aan de slag willen met .NET kunnen terecht op MSDN voor een uitleg over hoe Cmdlets te schrijven.

* Een alias voor Cmdlets creëren

Om gebruikers van andere shells, als cmd.exe of bash, tegemoet te komen hebben de ontwikkelaars van de Powershell ervoor gezorgd dat er standaard reeds een aantal veelgebruikte aliassen voor bepaalde Cmdlets aanwezig zijn. Deze zitten overigens niet in de shell zelf ingebakken, maar worden gedefinieerd in een zogenaamd profile-bestand. Zo kunnen Bash-gebruikers er bijvoorbeeld voor opteren ls in te typen, waarna achter de schermen eigenlijk Get-ChildItem uitgevoerd wordt, wat resulteert in een lijstje met bestanden en subdirectories in de huidige map. Daarnaast is het mogelijk om met behulp van het commando set-alias zelf een of meerdere aliassen voor een veelgebruikt commando te definiëren.

PS> set-alias plist get-process
PS> plist

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
105 5 1284 3592 33 0,08 3380 alg
93 4 3448 6620 43 1,73 484 BTTray
50 3 1804 2204 21 0,03 1572 btwdins
218 5 9328 13328 59 5,86 1600 CLCapSvc
89 34 8772 8280 47 12,77 1616 CLMLServer
...