Grafische Oberfläche (GUI) für PowerShell-Scripts erstellen


    Tags:

    GUI mit PowerShell erstellenPowerShell ist sicher nicht das bevor­zugte Werk­zeug, um kom­plexe grafische Ober­flächen zu ent­wickeln. Hin und wieder dürfte es aber hilf­reich sein, wenn Benutzer ein Script über eine GUI steuern können. Das gilt etwa dann, wenn An­wender nicht mit Power­Shell vertraut sind oder für Parameter zahl­reiche 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. Zusatz­programme 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:

    Fenster für GUI in PowerShell erstellen

    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:

    Textfeld mit Label, das die Eingabe durch den Benutzer erläutert.

    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:

    Listbox in PowerShell erstellen

    Und hier eines für eine ComboBox:

    Beispiel für eine Combobox mit PowerShell

    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.

    Schaltfläche zum Abbrechen des Dialogs

    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.

    Script zum Anzeigen der Uptime für Computer, die Mitglied in einer AD-Domäne sind.

    Sie können das Script von hier herunterladen.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Roland Eich

    Roland Eich ist gelernter Fach­infor­matiker für System­inte­gration und in der IT seit über 14 Jahren zu Hause. Roland deckt auf­grund seiner Erfah­rungen ein breites Spek­trum der Microsoft-Produkt­palette ab.
    Zudem besitzt er ver­schiedene Zertifi­zierungen (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