Graag zou ik een algemeen topic over Powershell beginnen. Waarom? Omdat het zo'n belangrijke taal is. Het is onontbeerlijk deze taal te kennen als men met Windows-servers bezig is. Vele mensen snappen dat nog niet echt, maar wie binnen nu en pakweg 3 jaar geen PoSh kent kan het schudden als Windows System Engineer. VBS is dood, leve PoSh.
Momenteel zijn de threads over PoSh verspreid over Programming, Windows Clients en Serversoftware en Windows Servers.
Mijn voorstel is om het in PRG te zetten, aangezien het zowel over clients als servers gaat en de lijn tussen scripten en programmeren flinterdun is. Qua complexiteit moet een Powershell-script niet onderdoen voor mening Java-script en veel extra functionaliteit is gewoon .NET programmeren. Behalve dat het OS-afhankelijk is en dat het niet compiled moet worden zie ik niet in waarom het niet in PRG thuis zou horen.
Dat gezegd zijnde, hieronder de TS. Als het goedgekeurd wordt, dan werk ik het wel verder uit.
In bash:
Keith Hill heeft op zijn blog een interessante reeks als introductie:
Momenteel zijn de threads over PoSh verspreid over Programming, Windows Clients en Serversoftware en Windows Servers.
Mijn voorstel is om het in PRG te zetten, aangezien het zowel over clients als servers gaat en de lijn tussen scripten en programmeren flinterdun is. Qua complexiteit moet een Powershell-script niet onderdoen voor mening Java-script en veel extra functionaliteit is gewoon .NET programmeren. Behalve dat het OS-afhankelijk is en dat het niet compiled moet worden zie ik niet in waarom het niet in PRG thuis zou horen.
Dat gezegd zijnde, hieronder de TS. Als het goedgekeurd wordt, dan werk ik het wel verder uit.
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))))`'" |
Er is nog geen Powershell-lexer op T.net, dus voorlopig gebruik je best de C#-lexer al gaat die soms compleet de mist in.
C#:
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.
Version 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.
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.
Version 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.
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 vermoed ik. Er is trouwens ook nog een -Online parameter, maar ik laat 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
C#:
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:
C#:
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 vermoed ik. Er is trouwens ook nog een -Online parameter, maar ik laat 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:
C#:
1
| Get-Service *Exchange* | Stop-Service |
In bash:
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?
[justify]Al doende uiteraard! Maar wat extra hulp is altijd handigVroeger 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 beveel ik 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).
En verder...
Op mijn eigen blog gaat het over vele onderwerpen, technisch en niet technisch, maar Powershell komt toch vaak aan bod - vooral in combinatie met SC producten.
Momenteel organiseert PowerShell.org in samenwerking met Microsoft en SAPIEN The Scripting Games: elke week een nieuwe opgave om iets te scripten, met twee moeilijkheidsniveau's. het is meer een oefening dan een echte wedstrijd, maar er zijn toch enkele leuke prijzen. Stem op mijn code als je mij ziet opduiken
Momenteel organiseert PowerShell.org in samenwerking met Microsoft en SAPIEN The Scripting Games: elke week een nieuwe opgave om iets te scripten, met twee moeilijkheidsniveau's. het is meer een oefening dan een echte wedstrijd, maar er zijn toch enkele leuke prijzen. Stem op mijn code als je mij ziet opduiken
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.
[ Voor 100% gewijzigd door YellowOnline op 02-05-2013 14:21 ]