Tags: PowerShell
PowerShell ist sicher nicht das bevorzugte Werkzeug, um komplexe grafische Oberflächen zu entwickeln. Hin und wieder dürfte es aber hilfreich sein, wenn Benutzer ein Script über eine GUI steuern können. Das gilt etwa dann, wenn Anwender nicht mit PowerShell vertraut sind oder für Parameter zahlreiche Werte aus einer Abfrage erhalten.
Die Interaktion mit Cmdlets oder Scripts spielt sich normalerweise auf der Kommandozeile ab. Eine der wenigen Ausnahmen ist Out-GridView, das Daten in tabellarischer Form auf der GUI ausgibt. Dieses Cmdlet lässt sich auch einsetzen, um ein einfaches Auswahlmenü zu präsentieren oder um Elemente aus einer längeren Liste auszuwählen.
Dialog mit .NET-Klassen entwickeln
Wenn die begrenzten Möglichkeiten von Out-GridView nicht reichen oder man einfach eine individuelle Oberfläche haben möchte, dann kann man dafür auf .NET-Klassen zurückgreifen. In diesem Artikel zeige ich, wie sich in wenigen Schritten eine PowerShell-GUI erstellen lässt. Zusatzprogramme sind hierzu nicht erforderlich, die PowerShell ISE reicht.
Die ersten beiden Befehle laden die .NET-Erweiterungen (Assemblies) für die Gestaltung der grafischen Oberfläche in den Arbeitsspeicher:
Mit der nächsten Zeile wird aus der Forms-Bibliothek das eigentliche Fensterobjekt erstellt:
$objForm = New-Object System.Windows.Forms.Form
Ans Ende des Skriptes setze ich folgende Zeile:
[void] $objForm.ShowDialog()
Diese Anweisung sorgt dafür, dass unser Fenster überhaupt angezeigt wird.
Ein erster Test sollte jetzt so ausschauen:
Der bisherige Code erzeugt ein leeres Fenster ohne irgendeine Funktion.
Schön wäre ein weißer statt eines grauen Hintergrunds, so wie man es von vielen Windows-Anwendungen her kennt:
$objForm.Backcolor="white"
Alle, die es gerne etwas bunter haben möchte, können alternativ ein Hintergrundlogo einsetzen:
Das BackgroundImageLayout=2 gibt die Formatierung des Bildes an. Spielen Sie hier gerne etwas mit verschiedenen Werten herum, es ist für jeden Geschmack etwas dabei.
Position und Größe des Fensters festlegen
Momentan öffnet sich unser Fenster beim Ausführen des Skriptes an beliebiger Stelle. Auch hat es noch keine vorgegebene Größe.
Die Position des Fensters wird festgelegt mit dem Befehl:
$objForm.StartPosition = "CenterScreen"
In diesem Beispiel erscheint es zentriert auf dem Bildschirm. Alternativ könnte man, wie weiter unten für Textelemente beschrieben, mit der Eigenschaft Location die genauen Koordinaten angeben.
Folgende Anweisung bestimmt die Größe des Fensters:
$objForm.Size = New-Object System.Drawing.Size(800,500)
Titelleiste bearbeiten
Die Überschrift in der Fensterleiste sollte Aufschluss darüber geben, welche Aufgabe unser Script erfüllt.
$objForm.Text = "Mein neues Fenster"
Für alle, die es etwas bunter mögen, lässt sich hier das Icon austauschen.
$objForm.Icon="C:\PowerShell\logos\xxxx.ico"
Text und Combobox
Text und Combobox erkläre ich zusammen, da es so mehr Sinn ergibt, und man das Ergebnis sofort prüfen kann.
Bei einem Text wird die Objektklasse "Label" aus der Forms-Assembly gebraucht. Dies schaut beispielsweise so aus:
Das Textelement kann etwa als Erläuterung über einem Eingabefeld stehen oder als Infotext irgendwo am Rand des Fensters. Folgendes Fragment erzeugt ein Eingabefeld, das man mit einem solchen Text-Label versehen könnte:
Combo/Listbox/Dropdown lässt sich ebenfalls ganz leicht erstellen und mit Hilfe des Textes um eine Überschrift ergänzen. Hier zuerst ein Beispiel für eine Listbox:
Und hier eines für eine ComboBox:
Den Inhalt einer solchen Listbox kann man entweder durch eine Abfrage füllen, die zum Beispiel alle Benutzer aus dem Active Directory zurückgibt, oder aber mit festen Parametern.
Buttons
Ohne Buttons ist die beste GUI nutzlos. In der Regel wird zumindest ein Button gebraucht, der einen Dialog wieder schließt oder eine Aktion ausführt, für die der Dialog geschaffen wurde.
Einen OK-Button erzeugt man nach dem gleichen Muster, wobei man dann für das Klick-Ereignis jene Funktion einträgt, für die der Dialog letztlich dient. Das könnte eine WMI-Abfrage, das Löschen von Dateien oder das Öffnen einer Remote-Session mit einem Computer aus der Listbox sein.
Beispiel-Script für Uptime
Auf Basis der hier beschriebenen GUI-Elemente habe ich ein Script erstellt, das alle Computer aus dem Active Directory ausliest und sie in ein Listenfeld einfügt. Wählt man von dort einen Namen aus, dann zeigt das Script die Uptime des betreffenden Rechners an.
Sie können das Script von hier herunterladen.
Täglich Know-how für IT-Pros mit unserem Newsletter
Roland Eich ist gelernter Fachinformatiker für Systemintegration und in der IT seit über 14 Jahren zu Hause. Roland deckt aufgrund seiner Erfahrungen ein breites Spektrum der Microsoft-Produktpalette ab.
Zudem besitzt er verschiedene Zertifizierungen (MCITP, MCSA und MCSE, ITIL, PRINCE2).
// Kontakt: E-Mail //
Verwandte Beiträge
Weitere Links
2 Kommentare
Hi, mir ist aufgefallen dass Sie die Textboxbreite auf "1000" eingestellt haben obwohl Sie die Fensterbreite nur auf "800" gesetzt haben. Dies ist erstmal grundsätzlich kein Problem da bei dem oben von Ihnen beschriebenen Anwendungszweck alles normal dargestellt wird. Versucht man allerdings, wie ich, zwei Textboxen nebeneinander einzustellen führt es zu einer ziemlich frustrierenden Fehlersuche. Es wäre schön wenn Sie dies für spätere Nutzer ändern könnten, falls nicht, steht es jetzt zumindest in den Kommentaren für die nächsten die genauso verzweifelt nach der Fehlerquelle suchen wie ich.
Guten Tag Herr Conrad,
vielen Dank für die Info. Das Skript wurde entsprechend angepasst.
Grüße
Roland Eich