Het grote Powershell topic
Wat?
Powershell is een scripting taal die standaard aanwezig is in alle Windows versies vanaf Windows 7 en Windows Server 2008R2. Voor eerdere versies (post-2000) is het als applicatie te downloaden, zowel in 32- als 64-bit versie.
De mensen uit de Unix wereld hadden steeds medelijden met Windows administrators omdat zij bash hebben en wij het met batch moesten doen. Daar kwam verandering in met WSH in Windows 98 dat .JS en .VBS ondersteunde (en uitgebreid kon worden naar andere talen), maar ideaal was het toch nog niet.
Enter Powershell: op de nieuwere versies van Windows is dit de basis van alles. Windows, en alle applicaties, draaien op Powershell en niet vica versa. Meer zelfs: van vele applicaties is de functionaliteit niet ten volle beschikbaar via de GUI en moet men sowieso Powershell gebruiken (zie oa. Exchange en de verschillende System Center producten).
Het voordeel van Powershell ten opzichte van VBS, de vorige standaard in Windows scripting, is dat het de positieve elementen overgenomen heeft (Object-Oriented, gebaseerd op .NET) maar de taal zelf intuïtiever gemaakt heeft en commando's - cmdlets geheten - voorziet bij elk product die er voor zorgen dat men veel compactere doch leesbaardere code kan schrijven dan voorheen. Vergelijk zelf:
De mensen uit de Unix wereld hadden steeds medelijden met Windows administrators omdat zij bash hebben en wij het met batch moesten doen. Daar kwam verandering in met WSH in Windows 98 dat .JS en .VBS ondersteunde (en uitgebreid kon worden naar andere talen), maar ideaal was het toch nog niet.
Enter Powershell: op de nieuwere versies van Windows is dit de basis van alles. Windows, en alle applicaties, draaien op Powershell en niet vica versa. Meer zelfs: van vele applicaties is de functionaliteit niet ten volle beschikbaar via de GUI en moet men sowieso Powershell gebruiken (zie oa. Exchange en de verschillende System Center producten).
Het voordeel van Powershell ten opzichte van VBS, de vorige standaard in Windows scripting, is dat het de positieve elementen overgenomen heeft (Object-Oriented, gebaseerd op .NET) maar de taal zelf intuïtiever gemaakt heeft en commando's - cmdlets geheten - voorziet bij elk product die er voor zorgen dat men veel compactere doch leesbaardere code kan schrijven dan voorheen. Vergelijk zelf:
Visual Basic .NET:
1
2
3
4
| Dim nextSec Set nextSec = CreateObject("WbemScripting.SWbemDateTime") nextSec.SetVarDate(DateAdd("s", 1, currentTime)) strNext = "'" & nextSec.Value & "'" |
PowerShell:
1
| $strNext = "`'$([management.managementDateTimeConverter]::ToDmtfDateTime(($currentTime.AddSeconds(1))))`'" |
Historiek van PoSh
Powershell is eigenlijk ontstaan in 2003 onder de naam Monad. Het is echter niet bijzonder gekend geweest aangezien het een soort alpha-versie was van wat later Powershell zou worden. Dat kwam er 3 jaar later.
Versie 1.0 werd uitgebracht in 2006 en is beschikbaar voor Windows XP SP2, Windows Server 2003, Windows Vista en zit als een optionele feature in Windows Server 2008.
Versie 2.0 is geïntegreerd in Windows 7 en Windows Server 2008 R2. Het is beschikbaar als een aparte installatie voor Windows XP met Service Pack 3, Windows Server 2003 met Service Pack 2 en Windows Vista met Service Pack 1.
Versie 3.0 is geïntegreerd in Windows 8 en Windows Server 2012. Het is beschikbaar als een aparte installatie voor Windows 7 met Service Pack 1, voor Windows Server 2008 met Service Pack 1 en voor Windows Server 2008 R2 met Service Pack 1 hier. Belangrijke opmerking evenwel:
Het verschil tussen de versies is voornamelijk het aantal cmdlets, al zat er tussen 1.0 en 2.0 ook een groot verschil in de error handling (in 1.0 moest alles nog met ErrorTrapping, in 2.0 is Try-Catch toegevoegd)
Versie 1.0 werd uitgebracht in 2006 en is beschikbaar voor Windows XP SP2, Windows Server 2003, Windows Vista en zit als een optionele feature in Windows Server 2008.
Versie 2.0 is geïntegreerd in Windows 7 en Windows Server 2008 R2. Het is beschikbaar als een aparte installatie voor Windows XP met Service Pack 3, Windows Server 2003 met Service Pack 2 en Windows Vista met Service Pack 1.
Versie 3.0 is geïntegreerd in Windows 8 en Windows Server 2012. Het is beschikbaar als een aparte installatie voor Windows 7 met Service Pack 1, voor Windows Server 2008 met Service Pack 1 en voor Windows Server 2008 R2 met Service Pack 1 hier. Belangrijke opmerking evenwel:
Versie 4.0 zal zitten in de releases van Windows 8.1 en Windows Server 2012 R2. Ongetwijfeld zal het ook apart te downloaden zijn.IMPORTANT: Windows Management Framework 3.0 is not currently compatible with the following applications:Systems that are running the above server applications should not run Windows Management Framework 3.0 at this time. WMF 3.0 is otherwise supported on Windows 7 SP1, Windows Server 2008 R2 SP1, and Windows Server 2008 SP2.
- System Center 2012 Configuration Manager. For more information, see KB 2796086.
- System Center Virtual Machine Manager. For more information, see KB 2795043.
- Microsoft Exchange Server 2007 and Microsoft Exchange Server 2010. For more information, see Windows Management Framework 3.0 on Exchange 2007 and Exchange 2010.
- Microsoft SharePoint 2010. For more information, see Windows PowerShell 3.0 and SharePoint 2010.
- Windows Small Business Server 2008 and Windows Small Business Server 2011. For more information, see Windows Management Framework 3.0 applicability on Windows Small Business Server 2008/2011 Standard.
Het verschil tussen de versies is voornamelijk het aantal cmdlets, al zat er tussen 1.0 en 2.0 ook een groot verschil in de error handling (in 1.0 moest alles nog met ErrorTrapping, in 2.0 is Try-Catch toegevoegd)
Cmdlets, WTF zijn dat?
Cmdlets is een verkleinvorm van commando dat in de Powershell-context gebruikt wordt voor, tja, commando's. Elk commando heeft een specifieke naamgeving: 'verb-noun' (werkwoord streepje zelfstandig naamwoord).
Enkele voorbeelden: Start-Service, Get-ExecutionPolicy, ...
Dit systeem maakt het gemakkelijk om cmdlets te raden. Hoe zou je een service stoppen of een ExecutionPolicy wijzigen? Je kan het raden op basis van de voorbeelden - dat is de intuïtiviteit waar ik het eerder over had.
Er zijn meer dan 2000 cmdlets, exclusief de cmdlets die met bepaalde producten meekomen (ActiveDirectory, BitLocker, Exchange, SCDPM, SCOM, SCCM, SCO, SCVMM, SCSM, SQL, ...), dus het is maar goed ook dat het systeem zo logisch opgebouwd is - maar natuurlijk is dat niet voldoende om de taal ten volle te benutten. Daarvoor bestaat de cmdlet Get-Command.
Met Get-Command kan je op zoek gaan naar het commando dat je nodig hebt. Je wil bijvoorbeeld wat doen met een process, maar je weet het commando niet. Weet dat Get-Command twee belangrijke parameters heeft: -Verb en -Noun. Door deze lijn vinden we alle cmdlets die met processen te maken hebben
Voor elke cmdlet is er een tevens help-commando beschikbaar. Enige idee hoe dat heet? Rara: Get-Help.
Met het volgende vraag je de de help voor Start-Service:
Je hebt hier drie belangrijke parameters die je kan gebruiken: -Full, -Detailed, -Examples. Afhankelijk van je keuze krijg je meer of minder informatie terug. De parameternamen zijn zelfverklarend vermoeden we. Er is trouwens ook nog een -Online parameter, maar we laten het aan jou over te raden waar die voor dient.
Als je de cmdlets Get-Help en Get-Command kent kan je eigenlijk beginnen met Powershell. Om echte scripts te schrijven komt er natuurlijk nog meer bij te kijken: variabelen, parameters, functions, statements, enz. Deze thread dient echter niet als inleidende cursus Powershell, wel als teaser.
Enkele voorbeelden: Start-Service, Get-ExecutionPolicy, ...
Dit systeem maakt het gemakkelijk om cmdlets te raden. Hoe zou je een service stoppen of een ExecutionPolicy wijzigen? Je kan het raden op basis van de voorbeelden - dat is de intuïtiviteit waar ik het eerder over had.
Er zijn meer dan 2000 cmdlets, exclusief de cmdlets die met bepaalde producten meekomen (ActiveDirectory, BitLocker, Exchange, SCDPM, SCOM, SCCM, SCO, SCVMM, SCSM, SQL, ...), dus het is maar goed ook dat het systeem zo logisch opgebouwd is - maar natuurlijk is dat niet voldoende om de taal ten volle te benutten. Daarvoor bestaat de cmdlet Get-Command.
Met Get-Command kan je op zoek gaan naar het commando dat je nodig hebt. Je wil bijvoorbeeld wat doen met een process, maar je weet het commando niet. Weet dat Get-Command twee belangrijke parameters heeft: -Verb en -Noun. Door deze lijn vinden we alle cmdlets die met processen te maken hebben
PowerShell:
1
| Get-Command -Noun Process |
code:
1
2
3
4
5
6
7
| CommandType Name ModuleName ----------- ---- ---------- Cmdlet Debug-Process Microsoft.PowerShell.Management Cmdlet Get-Process Microsoft.PowerShell.Management Cmdlet Start-Process Microsoft.PowerShell.Management Cmdlet Stop-Process Microsoft.PowerShell.Management Cmdlet Wait-Process Microsoft.PowerShell.Management |
Voor elke cmdlet is er een tevens help-commando beschikbaar. Enige idee hoe dat heet? Rara: Get-Help.
Met het volgende vraag je de de help voor Start-Service:
PowerShell:
1
| Get-Help Start-Service |
Je hebt hier drie belangrijke parameters die je kan gebruiken: -Full, -Detailed, -Examples. Afhankelijk van je keuze krijg je meer of minder informatie terug. De parameternamen zijn zelfverklarend vermoeden we. Er is trouwens ook nog een -Online parameter, maar we laten het aan jou over te raden waar die voor dient.
Als je de cmdlets Get-Help en Get-Command kent kan je eigenlijk beginnen met Powershell. Om echte scripts te schrijven komt er natuurlijk nog meer bij te kijken: variabelen, parameters, functions, statements, enz. Deze thread dient echter niet als inleidende cursus Powershell, wel als teaser.
Voor de Unix mensen
In vele bedrijven gebeurt het wel dat een Unix-server overgezet wordt naar Windows tot onvrede van de Unixmensen, zeker als die mensen zelf geen generische Unixmensen zijn maar verantwoordelijken voor een bepaald product en bijgevolg moeten verhuizen van een Unixomgeving naar een Windowsomgeving.
Geen nood: ik heb enkele interne trainingen gegeven aan zulke mensen en tot mijn eigen verwondering was er zelfs bij de meest hardcore Unix-adepten enig enthousiasme over Powershell. In deze context is "enig enthousiasme" spectaculair - normaal gezien stopt men met luisteren zodra het woord Windows valt.
Powershell is namelijk beter dan bash moesten ze schoorvoetend toegeven. Het is object-georiënteerd (al zijn er blijkbaar manieren om bash ook OO te maken) en eenvoudiger. Stel dat Exchange zou draaien op linux en je moet alle services stoppen. In Powershell ziet dat er als volgt uit:
Geen nood: ik heb enkele interne trainingen gegeven aan zulke mensen en tot mijn eigen verwondering was er zelfs bij de meest hardcore Unix-adepten enig enthousiasme over Powershell. In deze context is "enig enthousiasme" spectaculair - normaal gezien stopt men met luisteren zodra het woord Windows valt.
Powershell is namelijk beter dan bash moesten ze schoorvoetend toegeven. Het is object-georiënteerd (al zijn er blijkbaar manieren om bash ook OO te maken) en eenvoudiger. Stel dat Exchange zou draaien op linux en je moet alle services stoppen. In Powershell ziet dat er als volgt uit:
PowerShell:
1
| Get-Service *Exchange* | Stop-Service |
In bash (de meest gebruikte shell in Unix. In andere shells is het mogelijk makkelijker):
Bash:
1
| ps uax | grep exchange | awk '{print $2}' | xargs kill |
Als we de factor 'gewoonte' buiten beschouwing laten moeten men toch bekennen dat de PoSh-manier eenvoudiger, eleganter én efficiënter is.
Daar stop het evenwel niet voor de Unix-admins: het team achter PoSh is zo vriendelijk geweest om voor de meest courante Unix-commando's een alias te maken. Een voorbeeld: we willen de inhoud van een map zien. Dat kunnen we doen met de volgende commando's:
Daar stop het evenwel niet voor de Unix-admins: het team achter PoSh is zo vriendelijk geweest om voor de meest courante Unix-commando's een alias te maken. Een voorbeeld: we willen de inhoud van een map zien. Dat kunnen we doen met de volgende commando's:
- gci
- dir
- ls
Zowel de batch als de bash versie werken in PoSh! Deze drie aliassen - de eerste verklaart zichzelf nu - zijn van de cmdlet Get-ChildItem. Dit systeem met aliassen is redelijk uitgebreid, waardoor iemand die uit de Unix-wereld komt (of nog uit de DOS-wereld) vrij snel zijn weg kan vinden. Als een alias niet bestaat kan je hem altijd zelf maken trouwens. Er is een cmdlet Select-String waar out-of-the-box (vreemd genoeg) geen alias grep voor bestaat. Dat is dan meteen een van de eerste dingen die menig Unixer zal aliassen.
Toch nog een kleine doch belangrijke opmerking over die aliassen: de parameters die het aanvaardt zijn die van Powershell, niet van Unix (of DOS). Voor de meeste taken is dat geen probleem, maar voor exotischere dingen kan dat wel eens fout lopen.
Toch nog een kleine doch belangrijke opmerking over die aliassen: de parameters die het aanvaardt zijn die van Powershell, niet van Unix (of DOS). Voor de meeste taken is dat geen probleem, maar voor exotischere dingen kan dat wel eens fout lopen.
OK, klinkt aardig. Hoe leer ik het nu?
Al doende uiteraard! Maar wat extra hulp is altijd handig
Vroeger was er online de geweldige Mastering PowerShell in your Lunch Break, maar die webpagina is offline gehaald omdat ze er een boek van wilden maken. Misschien vind je er wel nog ergens een kopij van terug op het internet.
Vroeger was er online de geweldige Mastering PowerShell in your Lunch Break, maar die webpagina is offline gehaald omdat ze er een boek van wilden maken. Misschien vind je er wel nog ergens een kopij van terug op het internet.
Keith Hill heeft op zijn blog een interessante reeks als introductie:
- 01: The Four Cmdlets That are the Keys to Finding Your Way Around PowerShell
- 02: Use the Objects Luke. Use the Objects!
- 03: Know Your Output Formatters
- 04: Commenting Out lines in a Script File
- 05: Use Set-PSDebug -Strict In Your Scripts - Religiously
- 06: Know What Objects Are Flowing Down the Pipe
- 07: Understanding Output
- 08: Output Cardinality - Scalers, Collections and Empty Sets - Oh My!
- 09: Regular Expressions - One of the Power Tools in PowerShell
- 10: Understanding PowerShell Parsing Modes
- 11: Understanding ByPropertName Pipeline Bound Parameters
- 12: Understanding ByValue PipeLine Bound Parameters
- 13: Comparing Arrays in Windows PowerShell
Wie liever boeken heeft bevelen we zelf van harte JONES, Don, HICKS, Jeffrey; Windows Powershell: TFM; SAPIEN Press, 2007 aan. Binnenkort komt er misschien een nieuwe versie uit voor 3.0 aangezien dit boek nog 2.0 is (maar de verschillen zijn klein).
IDEs
Notepad is in principe al voldoende, maar Notepad++ heeft syntax highlighting voor PoSh. Standaard zit in Windows de Powershell ISE ingebakken, maar wie wat meer wil kan terecht bij PowerGUI
voor een freeware IDE. Als het wat geld mag kosten raadt YellowOnline Powershell Studio van Sapien aan. Wie een recente versie van Visual Studio heeft kan daarmee natuurlijk ook aan de slag.Bedoeling van deze thread
In deze thread kan je zowel algemeen babbelen over PoSh als je problemen aanbrengen. Het combineren van PoSh en .NET met Office, WMI, SQL en dergelijke kan soms te ingewikkeld worden om alleen op te zoeken.
Het is in dit topic vooral niet de bedoeling om een flameware te hebben tussen Bash-ers en PoSh-ers.
Het is in dit topic vooral niet de bedoeling om een flameware te hebben tussen Bash-ers en PoSh-ers.
[ Voor 13% gewijzigd door YellowOnline op 28-08-2017 11:28 . Reden: Intussen is er al lang een PoSh-lexer ]