KB » Computer » Programmeren met PowerShell

Programmeren met PowerShell

    Tweeten

Introductie

Op dit moment kan je met VBScript nog bijna alles doen wat je met PowerShell kan doen.

PowerShell is moderner, en in de toekomst zullen steeds meer dingen alleen nog daarmee gedaan kunnen worden.

Installatie

Het zou kunnen zijn dat je niet de nieuwste versie hebt. Of je onder jouw versie van Windows de nieuwste versie kan installeren hangt weer samen met de versie van het Windows Management Framework

En hoe bepaal je dan welke versie je daarvan hebt? Door op de commandoregel van PowerShell het volgende in te tikken:
$PSVersionTable.WSManStackVersion.Major
Je krijgt nog meer cryptische informatie door het laatste stuk weg te laten:
$PSVersionTable
Zie deze pagina van serverfault.com

Met het volgende commando kan je je execution policy bepalen:
Get-ExecutionPolicy


Starten van PowerShell, scripts en commando's

PowerShell starten

Als PowerShell geïnstalleerd is, is de simpelste methode om het te starten (en werkt onder alle versies van Windows, ook zonder Start-knop): Win+R, gevolgd door het intikken van PowerShell en Enter

Commando's

Je kan veel van de oude DOS-commando's nog uitvoeren, zoals bv. cd (change directory), om naar een andere map (directory) te gaan.

De echte PowerShell-commando's hebben vaak langere naam. Het equivalent van cd is bv. Set-Location

M.b.v. het commando Get-Commands krijg je een lijst van commando's en afkortingen ervan.

Omdat voor veel commando's de informatie niet op 1 regel past kan je ook het commando Get-Commands | Format-List gebruiken (zie hier voor uitleg over het '|'-teken). Elk onderdeel van het commando (parameters e.d.) komt dan op een aparte regel.

Besparen van tikwerk

Dat lijkt dus te leiden tot heel veel tikwerk, maar net als in de DOS-omgeving kan je op allerlei manieren gebruik maken van het automatisch aanvullen van commando's.

Als je intikt: Set-L, gevolgd door Tab, dan staat er ineens Set-Location op het scherm. Je zou zelfs alleen Se kunnen intikken gevolgd door Tab, maar dan moet je nog een heleboel keer Tab doen voordat het goede commando er staat.

Commando's kunnen ook vaak afgekort worden. Zo is sl een verkorting voor Set-Location, en gci een afkorting van Get-ChildItem

Je kan al deze afkortingen te weten komen m.b.v. het commando Get-Alias, zelf weer af te korten tot gal

Naamgeving

Je ziet dat er ook logica zit in de naam van de commando's. Zo begint een commando om informatie weer te geven vaak met 'Get', en een commando om wijzigingen aan te brengen vaak met 'Set'.

Commando's zijn case-insensitive, d.w.z. je kan hoofd- en kleine letters door elkaar gebruiken.

Parameters

Commando's kunnen natuurlijk ook, net als in DOS, parameters hebben.

Bij veel DOS-commando's staat -s voor: neem ook de subdirectories mee (zoals bv. in dir -s).

Hetzelfde commando in PowerShell zou Get-ChildItem -recurse zijn.

En opnieuw kan je je een hoop tikwerk besparen. Je hoeft nl. maar zoveel letters van de parameter in te tikken tot hij uniek is. Stel dat er ook een parameter -release zou zijn, dan is het voldoende om gci -rec in te tikken.

Help-informatie over commando's

M.b.v. het commando Get-Help (in allerlei variaties) kan je veel (alle) informatie over de mogelijkheden van een commando krijgen.

Voor *alle* informatie doe je Get-Help commando-naam -full | more (zie hier voor uitleg over het '|'-teken).

Als je alleen voorbeelden wilt zien doe je Get-Help commando-naam -examples | more

Scripts

Scripts zijn verzamelingen commando's in een bestand, die achter elkaar worden uitgevoerd.

PowerShell scripts hebben als extensie .PS1

Scripts uitvoeren

Je kan vanaf de commandoregel het volgende doen: powershell script_naam.ps1

Of je kan eerst powershell starten, en dan de naam van het script intikken.


Instellingen van de PowerShell-omgeving

Je roept de eigenschappen van het PowerShell-venster op door te klikken op het icoontje helemaal linksboven, en dan op Properties

Hieronder behandel ik de verschillende tabbladen, en daarna ook nog de mogelijkheid om met een script instellingen te veranderen.

Tabblad Options

Tekst knippen/copiëren en plakken

Copiëren doe ik via de toetsen Alt+Spatie, gevolgd door E (van Edit) en dan Enter (Mark)

Ik kan dan met de muis de gewenste tekst selecteren en na Enter zit het in de buffer van Windows.

Maar als je een vinkje zet voor QuickEdit Mode, kan je onmiddellijk met de muis selecteren, en door met rechts te klikken komt de geselecteerde tekst achter de command prompt te staan.

Ik doe plakken via de toetsen Alt+Spatie, gevolgd door E (van Edit) en dan P (van Paste).

Het is een kwestie van smaak (of je liever met de muis werkt of niet).

Invoegen vs. overschrijven

Door een vinkje te zetten voor Insert Mode wordt invoegen mogelijk.

Maar volgens mij is het ook mogelijk zonder vinkje, en kan je heen en weer schakelen tussen overschrijven en invoegen m.b.v. de Insert-toets.

Tabblad Font

In het standaardvenster vind ik het lettertype veel te klein, dus kies ik op dit tabblad altijd voor Size 12 x 16.

Tabblad Colors

Ik hou ook niet van de standaard witte letters op een zwarte achtergrond. Dus kies ik voor een donkerblauwe achtergrond, met gele tekst.

De achtergrond stel je bv. in door te klikken op Screen Background, en dan op de gewenste kleur (in mijn geval op 1 na de meest linkse).

Voor de tekst kies ik de op 1 na meest rechtse.

In DOS kan je de kleurinstellingen ook veranderen met het simpele commando color 1e, maar dat lijkt in PowerShell niet te werken.

Instellingen met een script aanpassen

Daarvoor gebruik je het Get-Host-commando.

Dit commando heeft nl. een eigenschap UI (User Interface), en kijk maar eens wat voor informatie je krijgt als je het commando Get-Host.UI.RawUI uitvoert.

In mijn geval was dat:

ForegroundColor : Yellow BackgroundColor : DarkBlue CursorPosition : 0,299 WindowPosition : 0,256 CursorSize : 25 BufferSize : 80,300 WindowSize : 80,44 MaxWindowSize : 80,44 MaxPhysicalWindowSize : 85,44 KeyAvailable : False WindowTitle : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e xe

Je ziet op de 1e 2 regels de kleuren die ik al eerder noemde.

Verder gegevens over de grootte en positie van het venster, de grootte en positie van de cursor, etc.

Als mijn kleuren anders waren geweest, en ik had ze als boven willen hebben, dan had ik het volgende script kunnen gebruiken:

$a = (Get-Host).UI.RawUI $a.BackgroundColor = "DarkBlue" $a.ForegroundColor = "Yellow"

Dat vergt enige uitleg. Het commando Get-Host wordt eerst uitgevoerd, omdat het tussen haakjes staat, en levert een object op. Dat object heeft een eigenschap, UI, die weer een object is, en RawUI is weer een object. Dat object zit in de 'object reference' $a, en daarna kunnen we de eigenschappen daarvan veranderen.

Als je op deze manier de venstergrootte wilt veranderen werkt het nog weer iets anders, omdat WindowSize niet een gewone eigenschap met een waarde is, maar weer een object. Je moet het op de volgende manier aanpakken:

$a = (Get-Host).UI.RawUI $b = $a.WindowSize $b.Width = 40 $b.Height = 10 $a.WindowSize = $b

$b is een nieuwe referentie naar een object, en heeft als eigenschappen Width (breedte) en Height (hoogte).

Profielen: instellingen automatisch laden

Als je helemaal gelukkig bent met de veranderingen die je hebt aangebracht in de instellingen van PowerShell, dan kan je die instellingen opslaan in een bestand dat automatisch wordt uitgevoerd bij het starten van PowerShell.

Dat bestand heet als volgt:
\Users\gebruikersnaam\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1



Het gebruik van het '|'-teken (piping)

Het pipeline-teken wordt vaak als volgt gebruikt. Je begint de regel met een commando dat een verzameling gegevens opvraagt. Met de pipeline sluis je die verzameling door naar het commando dat erna komt, en dat voert er een bepaalde bewerking op uit.

We hebben elders op deze pagina bv. het volgende commando gezien:
Get-Help commando-naam -full | more

Het stuk voor de pipeline vraagt de volledige help-informatie over een bepaald commando op, maar dat is vaak veel meer dan op 1 scherm past. Dus de informatie vliegt over je scherm, en alleen het laatste scherm kun je nog bekijken, of je moet de schuifbalk rechts naar boven schuiven.

Het commando more, na de pipeline, heeft als enige functie om een verzameling informatie pagina voor pagina te laten zien.

Het commando na de pipeline heeft vaak 1 van de volgende functies: groeperen, sorteren, filteren (bv. alleen bestandsnamen die aan een bepaalde voorwaarde voldoen), etc.

En je bent niet beperkt tot 1 pipeline per regel. Misschien wil je eerst een filter om alle bestandnamen te krijgen die met 'f' beginnen, en die vervolgens sorteren op datum. Je voert dus 2 keer na elkaar een bewerking toe op de oorspronkelijke gegevens.

Voorbeeld: het volgende commando haalt eerst alle bestanden op in de map C:\Scripts die kleiner zijn dan 200 KB, en sorteert ze vervolgens op file grootte:
Get-ChildItem C:\Scripts | Where-Object {$_.Length -gt 200KB} | Sort-Object Length

Nog een voorbeeld: het volgende commando haalt een lijst met alle services op, die worden vervolgens gesorteerd op Status, en tenslotte worden ze netjes als een tabel weergegeven:
Get-Service | Sort-Object Status | Format-Table

De uitvoer ziet er dan als volgt uit (dit is maar een heel klein stukje ervan):

Status Name DisplayName ------ ---- ----------- Stopped RasMan Remote Access Connection Manager Stopped RasAuto Remote Access Auto Connection Manager Stopped RpcLocator Remote Procedure Call (RPC) Locator Stopped RemoteAccess Routing and Remote Access Stopped PNRPAutoReg PNRP Machine Name Publication Service Stopped pla Performance Logs & Alerts Stopped QWAVE Quality Windows Audio Video Experience

Een fout commando zou bv. het volgende zijn:
Sort-Object | Get-Process

Het is fout, omdat Sort-Object niets te sorteren heeft. Je begint (bijna?) altijd met een commando om gegevens op te halen, en dan laat je daar na de 1e, 2e, etc. pipeline een aantal bewerkingen op los. Omgekeerd zou dus wel kunnen.

Maar zelfs als Sort-Object nog wel zinvol zou zijn, dan nog slaat het totale commando nergens op. Want wat moet het Get-Process-commando met de info die het via de pipeline doorkrijgt. Het commando haalt juist *zelf* informatie op.

Kan je dit soort dingen alleen maar doen met een pipeline? Nee. Je zou ook het volgende commando kunnen uitvoeren:
Sort-Object -inputobject $a

In dit geval heb je van tevoren de gegevens in $a gezet. Niets mis mee, maar zeker voor beginners werkt piping simpeler.

Stel nu dat je de resultaten van een piping-operatie wilt opslaan. Kan dat? Ja, bv. als volgt:
$a = (Get-Process | Sort-Object ID)

PowerShell voert altijd dingen tussen haakjes eerst uit, dus de opgehaalde procesinformatie wordt gesorteerd, en dan in de variabele $a gestopt.

Als je meer informatie wilt over piping kan je het volgende commando gebruiken:
Get-Help About_pipeline


Het uitvoeren en gebruiken van scripts

Het uitvoeren van scripts

Om te beginnen wat in elk geval *niet* kan: dubbelklikken op een bestand met extensie PS1 heeft tot gevolg dat het bestand in je editor (bv. Kladblok (Notepad)) wordt geopend.

Vanuit PowerShell

Er zijn meerdere manieren om dit te doen, afhankelijk van de waarde van de omgevingsvariabele PATH en de plek waar je script staat.

Je kan altijd het volledige pad naar het script opgeven, maar als je het anders wilt doen, en je loopt tegen problemen aan, kijk dan hier.

Via Start - Uitvoeren (Run)

Na bovenstaande 2 acties tik je in:
powershell.exe -noexit c:\scripts\test.ps1

De parameter -noexit is optioneel, en houdt alleen in dat het PowerShell-venster open blijft nadat het script is afgelopen. Dat is wel handig, want anders heb je geen idee wat de uitvoer is.

Als er een spatie in de padnaam van het script zit moet je hem tussen quotes zetten en er een ampersand (&) voor zetten:
powershell.exe -noexit &'c:\my scripts\test.ps1'

Je kan op deze zelfde manier trouwens ook losse commando's uitvoeren:
powershell.exe -noexit get-childitem c:\scripts

Als onderdeel van een logon script

Als je een PowerShell-script wilt uitvoeren bij het starten van de PC, dan moet dat via een VBScript.

Zie het volgende voorbeeld:

Set objShell = CreateObject("Wscript.Shell") objShell.Run("powershell.exe -noexit c:\scripts\test.ps1")

Scope van variabelen in scripts (dot sourcing)

Je voert het volgende *script* uit (dus niet als losse commando's):

$A = 5 $B = 10 $C = $A + $B

Daarna voer je het commando $C uit.
Je ziet niets (je zou misschien verwachten dat de waarde van $C afgedrukt zou worden).

De oorzaak is dat net als in (vrijwel) elke programmeertaal variabelen alleen in een bepaalde context (scope) blijven bestaan.

In dit geval heb je de scope van het script (waarin $C de waarde 15 krijgt) en de scope van PowerShell zelf. Maar omdat het script is afgelopen bestaat $C niet meer.

Met de volgende curieuze notatie kan je dit probleem verhelpen:
. c:\scripts\test.ps1
(de 3 commando's zitten in test.ps1).

Als je nu $C intikt verschijnt er wel 15 op het scherm. Door de punt en spatie voor de aanroep van het script blijft de variabele $C na afloop van het script gewoon bestaan. Het is een globale variabele geworden, die ook in andere scripts kan worden gebruikt.

Als je ooit een globale variabele weer kwijt wilt raken kan je dit commando uitvoeren:
Remove-Variable C
(let op: geen dollarteken!!!).

Problemen

Veiligheid: execution of scripts is disabled

Het zou kunnen zijn dat je een script wilt uitvoeren en de volgende melding krijgt:

File C:\scripts\test.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details. At line:1 char:19 + c:\scripts\test.ps1 <<<<

Dat ligt aan de veiligheidsinstellingen die zijn ingebouwd in PowerShell, de zgn. execution policy. Standaard staat die op Restricted, en dan krijg je bovengenoemd probleem.

Je kan zelf bekijken hoe de instelling op jouw systeem staat, door het volgende commando uit te voeren: Get-ExecutionPolicy

Je kan de execution policy op RemoteSigned zetten als je je eigen scripts gewoon wilt kunnen uitvoeren, maar externe scripts door een betrouwbare uitgever ondertekend moeten zijn.

De meest onveilige optie is Unrestricted, wat betekent dat alle scripts onbelemmerd hun gang kunnen gaan.

Het commando om de execution policy te veranderen is:
Set-ExecutionPolicy RemoteSigned

Als je meer wilt weten over de betekenis van het ondertekenen van scripts, dan doe je Get-Help About_Signing

Vinden van scripts: padnaam

Je kan ook een melding als de volgende krijgen:

The term 'test.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. At line:1 char:7 + test.ps1 <<<<

Normaal gesproken moet je de volledige padnaam naar een script intikken. Maar er zijn uitzonderingen.

Als je in de map zit waar het script staat kan je ook intikken:
.\test.ps1

En als een script in je pad zit, dan wordt het gewoon uitgevoerd als je de naam intikt.

Dat laatste brengt wel gevaren met zich mee. Als de map met je script niet in het pad zit, maar een andere map met dezelfde scriptnaam *wel*, dan wordt *dat* script uitgevoerd (met misschien volledig onbedoelde effecten).

Met het volgende commando kan je je pad op een nette manier bekijken:
$a = $env:path; $a.Split(";")

Spaties in je script- en/of padnaam

Je kan een foutmelding krijgen als de volgende:

The term 'C:\Mijn' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. At line:1 char:8 + C:\Mijn <<<< Scripts\Test.ps1

Het is logisch dat als je een script probeert uit te voeren in de map Mijn Scripts, dat PowerShell dan niet kan raden of het script 'Mijn' heet en 'Scripts' een parameter is, of dat het 1 mapnaam is.

Normaal zou je verwachten dat het voldoende zou zijn om de padnaam of scriptnaam tussen dubbele quotes te zetten, maar dan vat PowerShell de regel op als een tekenreeks (string) en drukt hem gewoon nog een keer af.

In PowerShell moet je het als volgt doen:
& "C:\Mijn Scripts\Test.ps1"

De ampersand (&) is de Call-operator (aanroepen van scripts e.d.).

Met het volgende commando kan je een map aan je pad toevoegen:
$env:path = $env:path + ";c:\scripts"
(het stuk na de ';' kan je natuurlijk vrij kiezen).


Sneltoetsen (shortcut keys)

Navigeren door al eerder ingetikte commando's

Pijltje naar boven / beneden: Ga 1 commando naar boven / beneden.

PgUp / PgDn: Ga naar het langst geleden ingetikte commando / Ga naar het laatst ingetikte commando.

Navigeren binnen een commando

Pijltje naar links / rechts: Ga 1 teken naar links / rechts.

Home / End: Ga naar het begin / eind van de regel.

Ctrl + pijltje naar links / rechts: Ga 1 "woord" naar links rechts.
Woorden worden gescheiden door spaties.

F5: Vergelijkbaar met pijltje naar boven.

Bewerken van het huidige commando

Ctrl+C: Regel wordt schoongepoetst.

F4: Je krijgt de vraag Enter char to delete up to:
Als je ergens midden in een commando staat, en je geeft als antwoord een komma, dan worden alle tekens vanaf de cursor tot de komma gewist.

Een vorig commando herhalen of gedeeltelijk overnemen

F2: Je krijgt de vraag Enter char to copy up to:
Als je bv. een komma intikt, wordt de tekst van het vorige commando *tot* de komma gekopiëerd op een nieuwe regel.

F3: Geeft het laatste commando opnieuw weer.

F7: Je krijgt een venster met daarin de laatste 10 commando's, voorafgegaan door een nummer.
Met de pijltjes naar boven en beneden kan je door de lijst navigeren.
Als je dan Enter geeft wordt het commando uitgevoerd, als je pijltje naar rechts intikt wordt het commando op de commandoregel gezet zonder uit te voeren (zodat je het evt. nog kunt bewerken).
Als het helemaal een vergissing was doe je (natuurlijk) gewoon Esc

F8: Hiermee kan je door alle commando's heengaan die een bepaalde tekst bevatten.
Eerst tik je de tekst in, bv. 'get'. Dan ga je terug in de tijd door alle commando's die je eerder hebt ingetikt en waar 'get' in zit.

F9: Kan je gebruiken als je het nummer weet van een commando dat je eerder hebt ingetikt. Je krijgt de vraag Enter command number:, en het commando dat correspondeert met het nummer dat je intikt wordt uitgevoerd.


Het gebruik van alias-ses in Powershell

Wat is het nut van het alias-ses?

Hoeveelheid typen

Het belangrijkste nut is het besparen van een hoop tikwerk.

Het volgende commando:
get-childitem C:\*.txt | sort-object -property length | select-object -last 5
kan bv. ook geschreven worden als:
ls C:\Scripts\*.txt | sort -p length | select -l 5

Gebruiken van commando's uit andere besturingssystemen

Een ander voordeel is dat je commando's kan gebruiken waar je aan gewend bent.

Het echte PowerShell-commando om de bestanden in een map te laten zien is Get-ChildItem, wat afgekort kan worden tot gci

Maar je kan ook equivalente commando's uit DOS (dir) of Unix (ls) gebruiken.

Ingebouwde alias-ses

Er zijn ongeveer 100 ingebouwde alias-ses in PowerShell, en je kan ze te zien krijgen met het commando Get-Alias

Dit zijn dus gewoon afkortingen van bestaande commando's. Ook Get-Alias zelf kan je afkorten tot gal

Overal waar je het normale commando zou kunnen gebruiken, kan je ook de alias gebruiken.

Het vinden van alias-ses

Lijsten

Je kan een mooie lijst krijgen van alias-ses met het commando
get-alias | sort-object

Het vervelende is dat die lijst gesorteerd is op de verkorte naam, terwijl je denk ik vaker de verkorte naam van het commando wilt weten.

Je kan een lijst krijgen die gesorteerd is op het lange commando, m.b.v.
get-alias | sort-object definition

Individueel

Je kan ook opvragen waar bv. cd voor staat met
get-alias cd

Helaas is de omgekeerde weg, die interessanter is, ingewikkelder:
get-alias | where-object {$_.Definition -match "Get-Childitem"}

Nieuwe alias-ses maken

Daarvoor bestaat het Set-Alias-commando, bv.:
Set-Alias d Get-Date

Daarna hoef je alleen nog maar d intikken om de datum en tijd te krijgen.

Eventuele parameters die je aan het originele commando kan meegeven kan je ook aan de alias meegeven.

Alias-ses voor functies

Stel je hebt de volgende functie gemaakt:

function FindDefaultPrinter { Get-WMIObject -query "Select * From Win32_Printer Where Default = TRUE" }

Deze functie kan je aanroepen met FindDefaultPrinter

Maar je kan ook een alias definieren:
Set-Alias dp FindDefaultPrinter

Alias-ses voor commando's

In PowerShell kan je ook normale programma's uitvoeren, als volgt:
."C:\Program Files (x86)\Microsoft Office\Office14\Excel.exe"

(De punt aan het begin is nodig omdat PowerShell anders denkt dat het een tekenreeks (string) is die hij gewoon moet afdrukken.)

Je kan dus een alias definiëren met bv.
Set-Alias xc "C:\Program Files\Microsoft Office\Office12\Excel.exe"

Je alias-sen opslaan!!

In een willekeurig bestand

Als je PowerShell verlaat ben je ook je alias-sen kwijt, tenzij je ze van tevoren in een bestand opslaat.

Dat doe je met het commando
Export-Alias Mijn-aliassen.txt,
maar je kan natuurlijk ook een volledige padnaam opgeven voor het bestand.

In het bestand worden eerst de ingebouwde alias-ses gezet, en daarna de door jezelf aangemaakte.

Dat kan een klein probleempje opleveren als je de alias-sen weer importeert, want de ingebouwde bestaan al en leveren foutmeldingen op. Je eigen worden trouwens wel correct geïmporteerd.

Je kan die foutmeldingen voorkomen door na het exporteren de ingebouwde alias-sen, die toch allemaal bovenaan staan, er uit te slopen, of door je alias-sen 1 voor 1 te exporteren (als het er niet te veel zijn).

Het exporteren van 1 alias gaat bv. als volgt:
Export-Alias Mijn-aliassen.txt dp -append

De parameter -append is niet perse nodig, maar als je hem weglaat wordt bij elk Export-Alias-commando het bestand overschreven. *Met* de parameter wordt de nieuwe alias aan het eind toegevoegd.

Het importeren gaat als volgt:
Import-Alias Mijn-aliassen.txt

In je profiel

Alle dingen die je automatisch wilt laten uitvoeren bij het starten van PowerShell kan je ook in je profiel-bestand zetten.

Dat kan dus met Set-Alias-commando's, maar ook met functies die je definieert.

Beperkingen wat betreft alias-ses

Parameters

Je kan niet een alias maken voor een PowerShell-commando inclusief parameters.

Het volgende lukt dus niet:
Set-Alias OudeScr (Set-Location C:\Scripts\oud)

De enige manier om zoiets toch te bereiken is een functie te maken van het commando, en dan een alias voor de functie.

Piping

Zie evt. eerst de sectie over piping.

Het volgende lukt ook niet:
Set-Alias as (Get-Alias | Sort-Object)

Opnieuw zal je een functie moet maken om het probleem te omzeilen.


Help informatie

Commando's bestaan uit een werkwoord (verb) en een object.

Het is dus om te beginnen handig om te weten welke verbs er zijn. Dat kan je zien met get-verb (evt. gevolgd door | more, om de informatie scherm voor scherm te kunnen bekijken).

De volgende stap is om te zien welke commando's er met dat verb zijn: get-command -verb verb, bv. get-command -verb unblock

En tenslotte kan je met get-help commando uitvoerige info over dat commando krijgen.

Als je nou ook nog een aantal voorbeelden wil zien, doe je: get-help commando -examples | more

Ik kreeg onderstaande melding toen ik bovenstaand commando probeerde:

REMARKS Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help. -- To download and install Help files for the module that includes this cmdlet, use Update-Help. -- To view the Help topic for this cmdlet online, type: "Get-Help Unblo ck-File -Online" or go to http://go.microsoft.com/fwlink/?LinkID=217450.

Geïnstalleerde versie van PowerShell

Je kan in PowerShell het beste het commando $PSVersionTable (mag ook met kleine letters) intikken.

Je krijgt dan iets als:

PS S:\Scripts mas> $psversiontable Name Value ---- ----- PSVersion 5.0.10586.117 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.10586.117 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1

De 1e regel laat de waarde zien van de geïnstalleerde versie van PowerShell, in dit geval 5

De overige waarden betekenen het volgende (zou uit de help-informatie te krijgen moeten zijn, maar mij lukt het nog niet):

CLRVersion: The version of the common language runtime (CLR) BuildVersion: The build number of the current version PSVersion: The Windows PowerShell version number WSManStackVersion: The version number of the WS-Management stack PSCompatibleVersions: Versions of Windows PowerShell that are compatible with the current version SerializationVersion: The version of the serialization method PSRemotingProtocolVersion: The version of the Windows PowerShell remote management protocol

Een artikel op de site van Microsoft zegt min of meer dat dat de versie van PowerShell gelijk is aan die van Windows Management Framework.

Maar wat is WMF? Ik vermoed hetzelfde als .NET Framework.


Getting Started with Windows PowerShell
Een goede pagina om te beginnen als je niets afweet van PowerShell. Net als bijna alle materiaal op de Windows pagina's van de Scripting Guy(s), over VBScript en PowerShell, heel leuk en humoristisch geschreven.
Hey, Scripting Guy! Blog - Learn about Windows PowerShell
124 pagina's (mei 2013) met tientallen links naar blogs van de Scripting Guy waarin hij vragen van gebuikers beantwoordt. Deze link is naar de meest recente pagina. Op de oudere pagina's gaan de blogs over VBScript.
Windows PowerShell 2.0 Core Help - May 2011 Update
Grafische help file voor PowerShell. De help binnen PowerShell is wel uitgebreid, maar ook onoverzichtelijk, en woorden worden soms gewoon doormidden gehakt.
Windows PowerShell Week Script Samples
De naam van de pagina is verwarrend, want dit is een Word-document van 65 pagina's waarin uitgelegd wordt hoe je VBScript om kunt zetten naar PowerShell. Die informatie is ook wel in een hele serie pagina's online te vinden, maar alles in 1 document kan ook heel handig zijn.
A Task-Based Guide to Windows PowerShell Cmdlets
Als je geen idee hebt welke commando's je moet gebruiken voor een bepaalde taak, is dit een mooi startpunt. Je hebt hier categorieën als "Files and Folders", "Dates and Times" en "System Administration Tasks", om op die manier bij de goede commando's terecht te komen.
Windows PowerShell Owner's Manual
Een soort home page voor PowerShell. Vanuit hier kan je alle andere dingen over PowerShell vinden.
PowerShell Essentials for the Busy Admin
De 1e van een serie van 5 introductie-video's van ongeveer 1 uur per stuk, gemaakt door de Scripting Guys.
What do the contents of PowerShell's $PSVersionTable represent?
Vraag op een forum, over wat alle subvariabelen van $PSVersionTable betekenen. O.a. kan je hier de geïnstalleerde versie van PowerShell uit afleiden.


    Tweeten

© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)

Deze pagina is voor het laatst gewijzigd op: 04-02-23 16:46:56