Applicatieontwikkeling met PowerShell, WPF en XAML

Frank Loffeld

Is het volgende scenario misschien herkenbaar? Je bent lekker bezig alle bedrijfsprocessen te automatiseren en hebt een geweldig PowerShell-script geschreven. Die maakt op basis van naam, functie en datum van indiensttreding automatisch een gebruikersaccount en mailbox aan en koppelt op basis van de afdeling automatisch de juiste active directory-rechten aan groepen, waarna het account pas actief wordt op de dag van indiensttreding. Superhandig voor HR! Ze hoeven alleen inline de code van het PowerShell-script aan te passen. In de code hoeven ze alleen maar de naam, functie en datum van indiensttreding aan te passen. Supersimpel toch?!?

Je laat je oplossing zien aan HR en krijgt als opmerking: “Dit kan ik toch niet! Ik ben geen programmeur! Ik snap hier niets van. Goed idee, maar heb je hier geen programmaatje voor?” Daar sta je dan met je geweldige PowerShell-script…

Hier komt WPF en XAML om de hoek kijken. Met behulp van deze technologieën kun je van een PowerShell-script een applicatie maken. Et voilà, u vraagt, wij draaien:

unnamed file - Applicatieontwikkeling met PowerShell, WPF en XAML
Afbeelding3 - Applicatieontwikkeling met PowerShell, WPF en XAML

Maar wat is nu WPF en XAML?
Windows Presentation Foundation (WPF) is een UI-raamwerk voor het bouwen van Windows-bureaubladtoepassingen. Het gebruikt de eXtensible Application Markup Language (XAML) om op een declaratieve manier weergaven te definiëren. XAML is de XML-variant van Microsoft voor het beschrijven van een GUI. Het heeft ingebouwde ondersteuning voor bronnen, grafische afbeeldingen, gegevensbinding en nog veel meer. Het is een zeer gebruikersvriendelijk UI-framework.

Leuke intro, maar hoe werkt dit?
Geloof het of niet, PowerShell beperkt je niet tot de op tekst gebaseerde interface die bijna synoniem is geworden met een PowerShell-omgeving. Microsoft maakt het mogelijk om een GUI-interface te maken voor je PowerShell-scripts. Op die manier kun je, als je een script hebt dat je aan een eindgebruiker moet geven (of als je zelf liever naar een grafische interface kijkt), loskomen van de standaard blauwe tekstinterface.

Wat is er nodig om een PowerShell GUI te maken?
Toen ik voor het eerst ontdekte dat het mogelijk was om een PowerShell GUI te bouwen, flitsten mijn gedachten meteen terug naar mijn oude Commodore 64-computer, die ik in de jaren negentig gebruikte om programma’s te schrijven. Die computer startte, zoals zoveel andere van die tijd, op naar een op tekst gebaseerde BASIC-programmeeromgeving. Deze omgeving was gebaseerd op de opdrachtregel. Maar als je naar de grafische modus wilde overschakelen, kon je dat doen door een aantal PEEKs en POKEs in te voeren.

Ik verwachtte dat PowerShell een opdracht met de naam Set-GraphicMode zou aanbieden of iets dergelijks, dat zou kunnen worden gebruikt om over te schakelen naar de GUI-modus. Helaas bestaat zo’n commando niet. Hoewel het maken van een GUI voor PowerShell-scripts niet super moeilijk is, kan het zijn dat je een beetje buiten je comfortzone moet gaan, omdat je enkele externe hulpmiddelen zult moeten gebruiken.

Concreet zul je bijvoorbeeld Visual Studio moeten gebruiken. Je hebt ook de Microsoft .NET Framework-versie 4.x nodig en je hebt natuurlijk PowerShell nodig. Voor de nerds onder ons: PowerShell, WPF en XAML-code kan natuurlijk ook gewoon in PowerShell ISE of een andere editor worden geschreven.

Hoe ziet het bouwproces van een PowerShell GUI eruit?
PowerShell wordt geleverd met assembly’s, waarmee native .NET-classes kunnen worden begrepen. Echter, WPF is daar niet één van. Om met WPF in PowerShell te werken, moet je eerst de assembly toevoegen aan de huidige sessie. Dit kan met behulp van de opdracht Add-Type.

afbeelding 4 - Applicatieontwikkeling met PowerShell, WPF en XAML

Nadat de assembly is geladen, kun je beginnen met het maken van een basisvenster. Om het meest eenvoudige venster in WPF te maken, maak ik een XML-string. Deze kun je naar een XML-object casten met [xml]:

Afbeelding5 - Applicatieontwikkeling met PowerShell, WPF en XAML

Nadat de XAML-reeks is gemaakt, moet er een object worden gemaakt die de klasse XamlReader begrijpt. Om dat te doen, moet het doorgegeven worden aan de klasse XmlNodeReader als een argument. Hiermee creëer je een XmlNodeReader-object.

Afbeelding6 - Applicatieontwikkeling met PowerShell, WPF en XAML

Dit XmlNodeReader-object geef je door aan de statische methode Load () in de klasse XamlReader om een venster te maken. Vervolgens gebruik je de ShowDialog ()-methode om het venster op het scherm weer te geven.

Afbeelding7 - Applicatieontwikkeling met PowerShell, WPF en XAML
Afbeelding8 - Applicatieontwikkeling met PowerShell, WPF en XAML

De basis is nu gelegd. Hierna kun je elementen aan dit venster toevoegen. Hieronder volgt een voorbeeld van een venster met een tekstblok:

Afbeelding9 - Applicatieontwikkeling met PowerShell, WPF en XAML

Nu je het standaard frame hebt gemaakt, kun je helemaal losgaan met het toevoegen van tekstblokken, knoppen, radiobuttons, stijl, tabbladen, etc. Eigenlijk alles wat je ook zou kunnen toevoegen aan een webpagina. De laatste stap kan zijn om de losstaande PowerShell-commando’s te koppelen aan functies/knoppen of andere elementen in de XAML-code:

Afbeelding10 - Applicatieontwikkeling met PowerShell, WPF en XAML
Afbeelding11 - Applicatieontwikkeling met PowerShell, WPF en XAML

Ik heb een drietal demo-applicaties gemaakt, waarin dit alles samenkomt:

Afbeelding12 - Applicatieontwikkeling met PowerShell, WPF en XAML
Afbeelding13 - Applicatieontwikkeling met PowerShell, WPF en XAML
Afbeelding14 - Applicatieontwikkeling met PowerShell, WPF en XAML

Laat je in het volgende filmpje verrassen met wat er allemaal mogelijk is met PowerShell, WPF en XAML.

https://youtu.be/g8RwmarRQ8I

Hopelijk heb ik jullie enthousiast kunnen maken en gaan jullie hiermee aan de slag!

Voor vragen weet je mij te vinden!

PowerShell, makkelijk met Frank