Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell:dotnet:gui

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

PowerShell 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.

Benötigte .Net-Assemblies laden

Die ersten beiden Befehle laden die .NET-Erweiterungen (Assemblies) für die Gestaltung der grafischen Oberfläche in den Arbeitsspeicher:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

Elemente definieren

Fenster

Ein Fenster wird danach wie folgt erzeugt und hier im Beispiel als Objekt in der Variablen $objForm gespeichert:

## Fenster definieren ##
$objForm = New-Object System.Windows.Forms.Form                                                               # Fenster erzeugen
#$objForm.BackgroundImageLayout = 2                                                                           # Hintergrundbild für Fenster 
#$objForm.BackgroundImage =[System.Drawing.Image]::FromFile('C:\programdata\skripte\etc\vbw-logo.png')        # Hintergrundbild auswählen
$objForm.Backcolor="white"                                                                                    # Hintergrundfarbe des Fensters
$objForm.StartPosition = "CenterScreen"                                                                       # Fensterposition
$objForm.Size = New-Object System.Drawing.Size(800,500)                                                       # Fenstergröße (Breite x Höhe)
$objForm.Text = "Mein neues Fenster"                                                                          # Fenster-Titel


Fensterelemente werden ähnlich als Objekte erzeugt und in Variablen gespeichert. Nach Erzeugung können sie dem Fenster-Objekt (Beispiel $objForm) zugefügt werden.

Das Fenster selbst wird nach seiner Gestaltung und dem Hinzufügen der benötigten Elemente über den folgenden Aufruf angezeigt:
[void] $objForm.ShowDialog()

Lable

Lable = Etikett, dient zur Anzeige eines passiven Schriftfelds.

$objLabel = New-Object System.Windows.Forms.Label                 # Lable erzeugen
$objLabel.Location = New-Object System.Drawing.Size(50,60)        # Position des Lables
$objLabel.Size = New-Object System.Drawing.Size(200,20)           # Größe des Lables
$objLabel.Text = "Bitte geben sie einen Text ein:"                # Inhalt des Lables
$objForm.Controls.Add($objLabel)                                  # Lable dem Fenster hinzufügen

Textbox

Textbox, dient als Eingabefeld

$objTextBox = New-Object System.Windows.Forms.TextBox             # Eingabefeld erzeugen
$objTextBox.Location = New-Object System.Drawing.Size(50,80)      # Position des Eingabefeldes
$objTextBox.Size = New-Object System.Drawing.Size(200,20)         # Größe des Eingabefeldes
$objForm.Controls.Add($objTextBox)                                # Eingabefeld dem Fenster hinzufügen

Listbox

Listet vorgegebene Elemente zur Auswahl in einem statischen Fenster auf.

$objListbox = New-Object System.Windows.Forms.Listbox             
$objListbox.Location = New-Object System.Drawing.Size(300,80)
$objListbox.Size = New-Object System.Drawing.Size(260,20)
$objListbox.SelectionMode = "MultiExtended"
[void] $objListbox.Items.Add("1. User")
[void] $objListbox.Items.Add("2. Computer")
[void] $objListbox.Items.Add("3. E-Mail")
$objListbox.Height = 70
$objForm.Controls.Add($objListbox)

ComboBox

Listet vorgegebene Elemente zur Auswahl in einem DropDown-Feld auf.

$objCombobox = New-Object System.Windows.Forms.Combobox
# Die nächsten beiden Zeilen legen die Position und die Größe des Buttons fest
$objCombobox.Location = New-Object System.Drawing.Size(300,200)
$objCombobox.Size = New-Object System.Drawing.Size(200,20)
$objCombobox.Height = 70
$objForm.Controls.Add($objCombobox)
$objForm.Topmost = $True
[void] $objCombobox.Items.Add("1. User")
[void] $objCombobox.Items.Add("2. Computer")
[void] $objCombobox.Items.Add("3. Email")
$objCombobox.Add_SelectedIndexChanged({ })

Buttons

Zeigt einen Knopf mit einer vordefinierten Funktion. Beispiel „Cancel-Button“

$CancelButton = New-Object System.Windows.Forms.Button
# Die nächsten beiden Zeilen legen die Position und die Größe des Buttons fest
$CancelButton.Location = New-Object System.Drawing.Size(600,420)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Abbrechen"
$CancelButton.Name = "Abbrechen"
$CancelButton.DialogResult = "Cancel"
#Die folgende Zeile ordnet dem Click-Event die Schließen-Funktion für das Formular zu
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

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

Das Beispiel-Skript liest auf Basis der hier beschriebenen GUI-Elemente, alle Computer aus dem Active Directory aus und fügt sie in ein Listenfeld ein. Wählt man von dort einen Namen aus, dann zeigt das Script die Uptime des betreffenden Rechners an.

Get-GuiUptime.ps1
# Load ActiveDirectory module
Import-Module ActiveDirectory
 
'Programm wird ausgeführt bitte warten bis Eingabe erscheint.'
 
# Die ersten beiden Befehle holen sich die .NET-Erweiterungen (sog. Assemblies) für die grafische Gestaltung in den RAM.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
 
# Die nächste Zeile erstellt aus der Formsbibliothek das Fensterobjekt.
$objForm = New-Object System.Windows.Forms.Form
 
# Hintergrundfarbe für das Fenster festlegen
$objForm.Backcolor=“white“
 
# Icon in die Titelleiste setzen
# $objForm.Icon="C:\Powershell\XXX.ico"  #kann selbst definiert werden
 
# Hintergrundbild mit Formatierung Zentral = 2
#$objForm.BackgroundImageLayout = 2
#$objForm.BackgroundImage = [System.Drawing.Image]::FromFile('C:\Powershell\xxxx.jpg')  #kann selbst definiert werden
 
# Position des Fensters festlegen
$objForm.StartPosition = "CenterScreen"
 
# Fenstergröße festlegen
$objForm.Size = New-Object System.Drawing.Size(800,500)
 
# Titelleiste festlegen
$objForm.Text = "Windows Uptime anzeigen lassen"
 
#############################################################################################################
 
# Vorhandene Computer auslesen
$Computer = Get-ADComputer -Filter * -Properties * | select * -ExpandProperty name
 
#############################################################################################################
 
#Computer aus dem Ad anzeigen
 
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(300,60) 
$objLabel.Size = New-Object System.Drawing.Size(1000,20) 
$objLabel.Text = "Bitte Computernamen wählen:"
$objForm.Controls.Add($objLabel) 
 
$objCombobox = New-Object System.Windows.Forms.Combobox 
$objCombobox.Location = New-Object System.Drawing.Size(300,80) 
$objCombobox.Size = New-Object System.Drawing.Size(200,20) 
$objCombobox.Height = 70
$objForm.Controls.Add($objCombobox) 
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
$objCombobox.Items.AddRange($computer) #Computer werden aus der Variable geladen und angezeigt
$objCombobox.SelectedItem #ausgewählter Computername wird übernommen
$objCombobox.Add_SelectedIndexChanged({ })
 
#OK Button anzeigen lassen
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(500,420)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Name = "OK"
#$OKButton.DialogResult = "OK" # Ansonsten wird Fenster geschlossen
$OKButton.Add_Click
    ({
    $wmi=Get-WmiObject -computername $objCombobox.SelectedItem -Class Win32_OperatingSystem 
    $wmi2 = $wmi.converttodatetime($wmi.lastbootuptime) 
    [void] [Windows.Forms.MessageBox]::Show($wmi2)
    })
 
$objForm.Controls.Add($OKButton) 
 
#Abbrechen Button
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(600,420)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Abbrechen"
$CancelButton.Name = "Abbrechen"
$CancelButton.DialogResult = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton) 
 
######################################################################################################
# Die letzte Zeile sorgt dafür, dass unser Fensterobjekt auf dem Bildschirm angezeigt wird.
[void] $objForm.ShowDialog()
powershell/dotnet/gui.txt · Zuletzt geändert: 2024/05/27 08:36 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki