Daten|teiler
Kopieren als Kulturtechnik

MessageBox und PowerShell

4. Juni 2011 von Christian Imhorst

Wenn ich auf der Arbeit ein Skript an die Fachabteilungen verteile, damit die Benutzer dort mehr oder weniger automatisiert beispielsweise ein Programm installieren oder einen Netzwerkpfad ändern oder ihre Outlook-Signatur schnell bearbeiten können, habe ich die Erfahrung gemacht, dass die Anwender sich Infos darüber wünschen, was das Programm gerade so macht. Besonders Rückmeldungen darüber, dass das Skript die Änderungen durchgeführt hat und nun zu Ende ist, sind sehr beliebt. Solche kleinen Werkzeuge von der IT wirken auf ihre Nutzer in den Fachabteilungen einfach professioneller, wenn sie kurze Nachrichtenfenster erzeugen.

Vor der PowerShell habe ich mit VBScript eine Messagebox erzeugt, die dann zum Beispiel das Programmende angezeigt hat. Entweder war das Skript gleich in VBScript für den Windows Script Host geschrieben, oder es wurde mit ähnlichen Mitteln über einen Trick aus einer Batch-Datei heraus erzeugt:

:: Test mit Messagebox - MessageBox.bat
 
@echo off
echo msgbox "Die Datei wird ausgeführt.", VbInformation + VbOKOnly, "Der Test hat geklappt!" >%TEMP%\Test.vbs 
start %TEMP%\Test.vbs
pause
del %TEMP%\Test.vbs

Der Nachteil dieses Tricks liegt auf der Hand, es muss zumindest temporär eine neue Datei erzeugt werden.

Im Gegensatz zu VBScript kann die PowerShell allerdings nicht direkt eine Messagebox erzeugen, das geht nur über den Umweg, ein COM-Objekt zu instanziieren. Dafür spart man sich aber die temporäre Datei, wie in der Batch-Datei.

$wshshell = new-object -comobject wscript.shell
$Answer = $wshshell.popup("Die Datei wird ausgeführt.",5,"Der Test hat geklappt!",0)

Das Popup-Fenster funktioniert wie in WScript mit VBScript: Wenn die erste Zahl größer Null ist, sind das die Anzahl der Sekunden, nach denen sich das Popup-Fenster wieder schließt. Also im oberen Beispiel schließt sich das Fenster nach 5 Sekunden. Die zweite Zahl bestimmt die Anzahl der Buttons. Die „0“ steht für den „OK“-Button, die „1“ für die Button „OK“ und „Abbrechen“, „4“ für „Ja“ und „Nein“ und so weiter.

Dann kann man sich für die Darstellung einer Messagebox auch mit Windows Forms aus dem .Net-Framework bedienen:

[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
[windows.forms.messagebox]::Show("Die Datei wird ausgeführt.","Der Test hat geklappt!", `
[Windows.Forms.MessageBoxButtons]::OK ,[Windows.Forms.MessageBoxIcon]::Information)

Das erinnert nicht von ungefähr an eine stark verkürzte Darstellung eines einfachen C#-Programms, das die Windows Forms-Bibliothek nutzt:

// ButtonMitWindowsForms.cs
 
using System;
using System.Windows.Forms;
 
public class HalloWelt
{
   [STAThread]
   public static void Main()
   {
      MessageBox.Show("Die Datei wird ausgeführt.","Der Test hat geklappt!");
   }
}

Kompilieren und ausführen kann man das kleine Beispiel-Programm mit folgenden Befehlen in der Konsole:

%windir%\Microsoft.NET\Framework\v3.5\csc ButtonMitWindowsForms.cs
ButtonMitWindowsForms.exe

Man kann auch Nachrichtenfenster mithilfe der Windows Presentation Foundation (WPF) in der PowerShell erzeugen, was aber ein bisschen komplexer ist, und das nicht nur, weil man die Powershell in die Single Thread-Betriebsart zwingen muss, dem STA-Mode. Dazu ruft man die PowerShell mit folgendem Befehl auf:

powershell.exe -sta

Den Thread-Status kann man dann mit folgendem Befehl abfragen:

[System.Management.Automation.Runspaces.Runspace]::DefaultRunspace

Die Bildschirmausgabe sollte dann in etwa so aussehen (vgl. dazu auch MSXFAQ.DE):

Da der Wechsel in den STA-Modus leider noch nicht dazu führt, dass die WPF-Assemblies automatisch geladen werden, muss man das noch händisch nachholen:

Add-Type -assemblyName PresentationFramework
Add-Type -assemblyName PresentationCore
Add-Type -assemblyName WindowsBase

Anschließend kann man endlich damit loslegen, ein neues Fenster-Objekt zu erzeugen und das Fenster zeichnen zu lassen:

$window = New-Object Windows.Window
$window.Title = "Der Test hat geklappt!"
$window.Content = "Die Datei wird ausgeführt."
$window.SizeToContent = "WidthAndHeight"
$null = $window.ShowDialog()

Geschrieben in Powershell, Windows