Doe het met tekst: beheer je computer met PowerShell
Iedereen heeft ongetwijfeld het Windows-onderdeel PowerShell weleens gezien, maar lang niet iedereen gebruikt het. Wat kun je er eigenlijk mee? In dit artikel praten we je bij.
Als je dit artikel gelezen hebt, weet je alles over PowerShell. We behandelen onder meer:
- Actieve processen opvragen, bewaren en vergelijken
- Logboeken uitlezen
- Map met onderliggende mappen naar andere locatie kopiëren of verplaatsen
- Inhoud van een map verwijderen
Ook interessant: 15 handige commando's in Windows Opdrachtprompt
Microsoft biedt met de tool PowerShell al jaren een veelzijdigere manier om het systeem door middel van getypte opdrachten te beheren. PowerShell pakt de zaken weer heel anders aan en biedt ook andere mogelijkheden.
Geschiedenis
De eerste versie van PowerShell dateert al uit 2006 en is ontwikkeld vanuit de behoefte om een gereedschap voor beheer en automatisering te bieden met meer mogelijkheden dan de Opdrachtprompt. Die laatste was immers nog gebaseerd op het aloude MS-DOS en kent daarom geen functies die betrekking hebben op de vele aanvullende mogelijkheden van een grafisch besturingssysteem.
Al sinds Windows 7 wordt PowerShell meegeleverd en vanwege het algemene karakter van het product zijn er ook versies voor macOS en verschillende Linux-distributies.
Sinds zijn ontstaan is PowerShell nog volop doorontwikkeld en inmiddels zit het op versie 7.3.
Windows-licenties koop je bij Bol.com
Upgraden naar Windows 11, of van Home naar Pro?
Eerste blik
Wie slechts incidenteel gebruikmaakt van de Opdrachtprompt en nooit eerder aandacht heeft geschonken aan PowerShell, zal het idee hebben in een vertrouwde omgeving terecht te komen. Om de tool te starten, klik je met rechts op de startknop en open je Windows PowerShell.
Net als bij de Opdrachtprompt begin je in een map – in dit geval die van de ingelogde gebruiker – en het enige wat afwijkt, is de blauwe achtergrondkleur en de letters PS voor de mapnaam om aan te duiden dat je je in PowerShell bevindt. Iets wat de venstertitel natuurlijk ook al verraadt.
Probeer je het vertrouwde commando dir, dan ziet ook de uitvoering daarvan er best vertrouwd uit. Oké, de volgorde van de kolommen is wat anders en PowerShell toont standaard de bestandsattributen, maar op het eerste gezicht lijkt het op de Opdrachtprompt. Schijn bedriegt echter. Dat merk je wanneer je probeert de weergave van een map met veel bestanden na elk scherm te pauzeren met de vertrouwde opdracht dir /p. In plaats van het gewenste resultaat zie je nu een foutmelding. Help!
Help!
Waar de Opdrachtprompt bij de opdracht help een lijst met beschikbare commando’s toont, geeft PowerShell je een tamelijk algemeen verhaal. Vraag je specifiek hulp voor een enkel commando, bijvoorbeeld met help dir, dan krijg je een tekst te zien over iets dat Get-ChildItem heet. Hoe zit dat?
PowerShell kent een groot aantal opdrachten die cmdlets (lees: commandlets) worden genoemd. Voor zover deze overeenkomen met bekende functies in Opdrachtprompt zijn ze daarmee niet compatibel. Om toch een mate van vertrouwdheid te creëren, biedt PowerShell een systeem van aliassen. Daarin kan een commando onder meerdere namen beschikbaar zijn.
In ons voorbeeld zie je dat dir een alias is voor Get-ChildItem, de cmdlet waarmee je inhoud van mappen kunt opvragen. Ook kun je zien dat hetzelfde commando door het leven gaat onder de aliassen gci en ls. Om een en ander nog verwarrender te maken, kun je ook nog zelf aliassen voor opdrachten toevoegen.
Voor alle duidelijkheid werken wij vanaf nu met de officiële namen van cmdlets.
Hulp online
Dezelfde hulp die we krijgen bij help dir, krijgen we ook bij dit volledige commando:
Get-Help Get-ChildItem
Dat ziet er nog altijd niet al te informatief uit voor beginners. Dat komt omdat PowerShell standaard alleen een beknopte lokale helpfunctie biedt. Voegen we aan ons commando de parameter -Online toe, dan opent PowerShell onze browser en krijgen we wél de uitgebreide hulp die we mogen verwachten.
Wil je uitgebreidere hulp lokaal beschikbaar hebben, dan kun je het best PowerShell sluiten met het commando exit en opnieuw starten als Administrator. Vervolgens geef je de opdracht Update-Help.
Als de installatie klaar is, verschijnt de gevraagde hulp voortaan binnen het PowerShell-venster. Dat gebeurt overigens wel in losse segmenten. Om alles in één keer te zien, voeg je de parameter -full toe, en ben je alleen geïnteresseerd in gebruiksvoorbeelden dan is er -examples.
Afwijkend
Dat Get-ChildItem de officiële naam is voor een opdracht die ook als dir kan worden aangeroepen, maakt al duidelijk dat het om een veel algemener soort commando gaat.
In ons eerste voorbeeld zag je de standaardweergave van de inhoud van een map. Net als bij het commando dir in Opdrachtprompt biedt Get-ChildItem allerlei manieren om de uitvoer te filteren met een jokerteken (*) of uit te breiden naar onderliggende mappen met de parameter -recurse.
Je kunt de cmdlet ook voor andere doeleinden gebruiken, bijvoorbeeld door rechtstreeks vanuit PowerShell een registersleutel uit te lezen. Geef als voorbeeld daarvan deze opdracht:
Get-ChildItem -Path HKLM:\HARDWARE
Inhoudsopgave
We hebben nu een globaal idee van het verschil tussen PowerShell en Opdrachtprompt, en we weten hoe we hulp kunnen vragen. Maar hoe zit het eigenlijk met de opdrachten die we kunnen geven? Anders gezegd: welke cmdlets heeft PowerShell in huis?
Om daar achter te komen, gebruik je de opdracht Get-Command. Je krijgt dan een enorme lijst aan beschikbare opdrachten. Een deel van deze lijst wordt gevormd door aliassen en ook zie je naast de cmdlets een categorie die Function heet. Tussen cmdlets en functions zit een technisch onderscheid dat hier niet van belang is.
Uiteraard is het onmogelijk om de vele honderden opdrachten uit deze lijst te behandelen. We beperken ons dan ook tot een kleine selectie om je een beeld te geven van de kracht en veelzijdigheid.
Veiligheid
Zelfs al begrijp je maar een fractie van de lijst met beschikbare opdrachten, dan heb je vast wel gezien dat ze heel krachtig zijn en betrekking hebben op elk onderdeel van je systeem. Waar je via de beschikbare commando’s in de Opdrachtprompt alleen algemene schade kunt aanrichten (zoals het formatteren van een schijf), kunnen opdrachten en zeker scripts in PowerShell al dan niet opzettelijk zeer subtiele problemen veroorzaken (denk aan hacks). Om die reden is er een veiligheidssysteem actief dat de mogelijkheden standaard beperkt.
Geef het commando Get-ExecutionPolicy. Je zou als antwoord Restricted moeten krijgen. Dit is het hoogste beveiligingsniveau waarin je alleen losse commando’s kunt geven en geen scripts kunt uitvoeren. Dit beveiligingsniveau kun je alleen wijzigen wanneer je PowerShell als Administrator uitvoert. Wijzigen doe je met Set-ExecutionPolicy waarbij je vier veiligheidsniveaus hebt, zie ook deze opdracht:
Get-Help Set-ExecutionPolicy -full
Informatie
PowerShell biedt verschillende opdrachten die een alternatief vormen voor functies die je doorgaans via Windows zou gebruiken. Neem bijvoorbeeld het opvragen van een lijst met actieve processen waarvoor je anders Taakbeheer zou openen. In PowerShell kun je zo’n lijst opvragen met Get-Process.
Maar waarom zou je dat willen wanneer Taakbeheer voldoet? Taakbeheer geeft je een momentopname die je hooguit zou kunnen bewaren door een reeks schermafdrukken van het venster te maken. Vraag je zo’n lijst op in PowerShell, dan kun je hem ook bewaren en later vergelijken met een soortgelijke lijst die je op een ander moment maakt.
Geef deze opdracht:
Get-Process | convertto-html > processen-230427.htm
Hiermee maak je een lijst met alle processen inclusief alle beschikbare informatie daarover, converteer je die naar html en sla je hem op als bestand. Processen stoppen (pas op!) kan met Stop-Process en dan zal het je niet verrassen dat je ze ook kunt starten met Start-Process.
Op vergelijkbare wijze kun je bijvoorbeeld actieve en gestopte services achterhalen (Get-Service), logboeken van het systeem uitlezen (Get-EventLog) en meer. Uitvoer van dit soort opdrachten kun je bovendien op basis van allerlei criteria filteren met Where-Object.
Bestandsbeheer
Net als in Opdrachtprompt heb je in PowerShell de beschikking over opdrachten voor bestandsbeheer. De syntax vraagt vaak wat meer typewerk wanneer je de volledige vorm gebruikt, maar dat komt de begrijpelijkheid van instructies alleen maar ten goede. Vind je de opdrachten te lang, dan kun je altijd nog de aliassen opzoeken of zelf nieuwe maken.
Deze opdracht gebruik je om een map naar een andere locatie te kopiëren waarbij de toevoeging -Recurse ervoor zorgt dat ook onderliggende mappen worden verwerkt:
Copy-Item "C:\map1" -Destination "D:\map1" -Recurse
Vervang je het woord Copy door Move, dan verplaats je mappen en bestanden. Uiteraard is er ook de mogelijkheid om bestanden en mappen te verwijderen. Dat doe je met Remove-Item. Hernoemen gebeurt door middel van Rename-Item.
Tot slot kun je met Clear-Item de inhoud van een object verwijderen maar het object zelf bewaren. Denk bijvoorbeeld aan de inhoud van een map.
Stapje verder
Het feit dat je in al deze namen van cmdlets het woord Item tegenkomt, geeft de indruk dat ze veelzijdiger zijn dan hun tegenhangers in de Opdrachtprompt en dat is ook zo. Zoals je ook al kon zien bij Get-ChildItem, hebben opdrachten zoals Copy-Item een breder bereik dan alleen bestanden en mappen en zou je deze opdracht ook kunnen gebruiken om bijvoorbeeld registersleutels te kopiëren.
De PowerShell-opdrachten werken niet alleen op een lokale computer, maar ook op een andere machine in het netwerk. Dat maakt ze ideaal voor systeembeheerders (en thuisgebruikers met een bescheiden lokaal netwerk) om vanaf een centrale locatie aanpassingen op alle machines te doen via één script.
Scripts
Zoals we al zeiden in de paragraaf ‘Veiligheid’ kun je standaard alleen losse commando’s geven binnen PowerShell. Tussen de vele beschikbare opdrachten zitten ook instructies die programmeurs herkennen als lus-opdracht, bijvoorbeeld ForEach-Object, waarmee je dezelfde reeks commando’s op een heleboel objecten kunt loslaten. De typische plek waar je dat doet is binnen een script, de tegenhanger van het batch-bestand bij de Opdrachtprompt.
Vanwege hun kracht kennen scripts, net als gewone programma’s (exe-bestanden) een systeem van certificaten, zodat je zeker kunt weten of een script uit een betrouwbare bron komt.
Het zal duidelijk zijn dat PowerShell vooral bedoeld is voor (zeer) ervaren computergebruikers. Ook zul je begrijpen dat het veel meer studiemateriaal vereist dan dit artikel kan bieden. Dé plek om je studie te vervolgen is de online documentatie van Microsoft en de website PowerShell Gallery.