Powershell: Balloon Message anzeigen
25. März 2022

Ich wollte wissen, wie man in Powershell eine kleine Balloon-Message unten rechts über der Taskleiste aufpoppen lassen kann. Das kann ganz praktisch sein und ersetzt öfter – besonders bei vollständig automatisierten Abläufen – eine lästige Standard-Messagebox.

Das ist eigentlich ganz einfach, hat bei mir aber erstmal einiges an grundlegendem Verständnis erfordert. Bei Powershell gibt es nämlich eine Besonderheit, die den Code von vielen anderen Strukturen unterscheidet.

Normalerweise definiert man eine Funktion und übergibt in Klammern die Parameter, die dann in der Funktion verarbeitet werden sollen. In etwa so:

function addiere_zahlen (a as INT, b as INT) {
    ergebnis = a + b
    return ergebnis
end

Damit werden zwei ganze Zahlen im Bereich INTEGER addiert und das Ergebnis wird zurückgegeben. Powershell hat hier eine böse Falle. Wenn Sie eine Funktion definieren, die nur einen Parameter hat – kein Problem. Zwei Parameter in der Klammr zu übergeben – das geht nicht. So müssen dann in Powershell einen kleinen “Vorspann” schreiben, der die Übergabe Parameter definiert. Darin legen Sie den Typ des Inputs fest und ob der Parameter “Mandatory”, also zwingend notwendig ist. Auch Validierungen sind möglich. In unserem Beispiel kann ein Info Balloon mit “Info”, “Warning” oder “Error” deklariert werden. Das alles geschieht nicht in der Klammer hinter dem Funktionsnamem. Wie gesagt, mit einem einzelnen Parameter funktioniert das, nicht aber mit zwei oder mehr – dumm, wenn man das nicht weiß und ewig rumrätselt, was falsch ist.

Hier ist die Funktion in Powershell, mit der Sie eine Balloon-Nachricht erzeugen können:

 function Show-BalloonTip {            
    [cmdletbinding()]            
    param(            
    [parameter(Mandatory=$true)]            
    [string]$Title,            
    [ValidateSet("Info","Warning","Error")]             
    [string]$MessageType = "Info",            
    [parameter(Mandatory=$true)]            
    [string]$Message,            
    [string]$Duration=10000            
    )            

    [system.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null            
    $balloon = New-Object System.Windows.Forms.NotifyIcon            
    $path = Get-Process -id $pid | Select-Object -ExpandProperty Path            
    $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)            
    $balloon.Icon = $icon            
    $balloon.BalloonTipIcon = $MessageType            
    $balloon.BalloonTipText = $Message            
    $balloon.BalloonTipTitle = $Title            
    $balloon.Visible = $true            
    $balloon.ShowBalloonTip($Duration) 
}

Aufgerufen wird die Funktion dann mit so einer Zeile, irgendwo in dem Script:

Show-BalloonTip -Title "Fertig." -MessageType Info -Message "Prozedur abgeschlossen."