Programmeren met PowerShell
- Introductie
- Starten van PowerShell, scripts en commando's
- Instellingen van de PowerShell-omgeving
- Het gebruik van het '|'-teken (piping)
- Het uitvoeren en gebruiken van scripts
- Sneltoetsen (shortcut keys)
- Het gebruik van alias-ses in PowerShell
- Help informatie
- Geïnstalleerde versie van PowerShell
- Links
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
.
Links
- 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.
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op: 04-02-23 16:46:56