xlucipher

Powershell BalloonTip - Name anpassen

Mahlzeit die Damen und Herren,

ich wünsche zunächst einen guten Morgen, Mittag oder Abend.

Ich setze mich gerne mit PowerShell auseinander, gerade was so kleinere Skripte angeht.
Nun habe ich mir ein Skript geschrieben, welches einen BalloonTip erzeugt und das funktioniert absolut reibungslos.
Mein Problem ist nur, oben im BalloonTip steht ein mich störender Name. Ich frage mich jetzt, wie kann ich den anpassen?
Google hat mir da nicht so wirklich weiter geholfen, könnte aber auch sein, dass meine Frage evtl. nicht richtig dafür formuliert war.

Anbei ein Screenshot, damit ihr wisst, was ich meine.
Vielleicht ist das ja sogar nur ein Einzeiler, den ich einfach übersehen habe.
Ich danke für eure Hilfe!
passwdrequest_1
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 1739206501

Url: https://administrator.de/forum/powershell-balloontip-name-anpassen-1739206501.html

Ausgedruckt am: 15.05.2025 um 06:05 Uhr

TK1987
TK1987 19.01.2022 um 11:34:24 Uhr
Goto Top
Moin,

das geht über die BalloonTipTitle-Eigenschaft.

Gruß Thomas
xLucipher
xLucipher 19.01.2022 um 15:27:26 Uhr
Goto Top
Hallo TK1987,

danke für deine schnelle Antwort.
Deine Lösung ist leider nicht korrekt oder zumindest jetzt nicht mehr zutreffend.
Ich habe dir im angehangenen Screenshot markiert, welche Bereiche durch was gesteuert werden.
Die Variablen habe ich dafür bereits gesetzt.
passwdrequest_2
		$balloon.BalloonTipText = "$Nachricht"  
		$balloon.BalloonTipTitle = "Achtung! $userinfo"  
		$balloon.Visible = $true
		$balloon.ShowBalloonTip(3000)
		$balloon.Dispose()
TK1987
TK1987 19.01.2022 aktualisiert um 16:54:52 Uhr
Goto Top
Ok stimmt, habs gerade mal getestet.

Der Titel den du ändern willst ist wohl der Titel des Porgramms, dass den Balloontip erzeugt (in meinem Fall daher immer "Windows PowerShell".

Die einzige Möglichkeit, wie ich es auf die schnelle hinbekommen habe, diesen Titel zu beeinflussen war das Skript mit PS2EXE zu konvertieren - hierbei kann dann ein Titel festgelegt werden.

back-to-topZuerst muss dafür einmalig das PS2EXE-Modul in Powershell installiert werden:
# Entweder für alle Benutzer (benötigt Adminrechte)
Install-Module -Name ps2exe -Force

# Alternativ: Nur für den angemeldeten Benutzer (geht ohne Adminrechte)
Install-Module -Scope CurrentUser -Name ps2exe -Force

back-to-topSkripte in EXE konvertieren geht damit so:
ps2exe -InputFile "C:\Pfad\zum\Skript.ps1" -OutputFile "C:\Pfad\zum\Programm.exe" -Title "Hier dann dein Titel" -NoConsole -NoOutput  

Das Skript könnte in etwa so aussehen:
[CmdletBinding()]
Param(
  [int]$Timeout,
  [String]$Text,
  [String]$Title,
  [ValidateSet('None','Info','Warning','Error')]$Icon  
)

Add-Type -A System.Windows.Forms

$Balloon = New-Object System.Windows.Forms.NotifyIcon -p @{
  Icon            = [System.Drawing.Icon]::New( [IO.MemoryStream](iwr -useb 'Administrator.de/favicon.ico').Content )  
  Visible         = $true
}

$Balloon.ShowBalloonTip($Timeout, $Title, $Text, $Icon)

Damit könntest du dann wie folgt Nachrichten kreieren:
C:\Pfad\zu\deinem\Programm.exe -Timeout 1000 -Text "Hallo Leute" -Title "Nachricht" -Icon Info  

# Oder natürlich auch in kurz durch Parameterauslassung:
C:\Pfad\zu\deinem\Programm.exe 1000 "Hallo Leute" "Nachricht" "Info"  

falls du dies jedoch auch auf anderen Computern nutzen willst, solltest du die EXE mit einem Codesigning-Zetifikat signieren, da das Programm sonst u.U. als nicht vertrauenswürdig eingestuft wird.

Gruß Thomas
colinardo
Lösung colinardo 19.01.2022 aktualisiert um 18:46:15 Uhr
Goto Top
Servus @xLucipher,
BallonTips sind eigentlich eine Technik von Gestern und werden aus Kompatibilitätsgründen von den aktuellen Windows-Versionen in die neue Technik für solche Benachrichtigungen umgewandelt, namentlich sind das Toast-Messages (Da hat der MS Entwickler wohl gerade gefrühstückt face-smile). Per Default nutzt Windows dazu die AppUserModelID die es aus der aufrufenden App extrahiert.

Toast-Messages lassen sich auch nativ mit der Powershell erzeugen und dabei lässt sich auch der App-Title für den Toast beliebig anpassen. In den Toasts lassen sich auch benutzerdefinierte Grafiken oder Buttons einblenden wenn man möchte, damit hat man viel mehr Gestaltungsmöglichkeiten ...
function Show-ToastNotification {
    param(
        [parameter(mandatory=$false)][ValidateSet('Title+Text','Image+Text')][string]$type = 'Title+Text',  
        [parameter(mandatory=$false)][string]$apptitle = "Powershell",  
        [parameter(mandatory=$false)][string]$message,
        [parameter(mandatory=$false)][System.DateTimeOffset]$expiration = [DateTimeOffset]::Now.AddMinutes(60),
        [parameter(mandatory=$false)][switch]$expiresOnReboot,
        [parameter(mandatory=$false)][Windows.UI.Notifications.ToastNotificationPriority]$priority = 'Default',  
        [parameter(mandatory=$false)][switch]$suppressPopup,
        [parameter(mandatory=$false)][switch]$includeCloseButton,
        [parameter(mandatory=$false)][switch]$includeDismissButton
    )
    DynamicParam {
        $attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
        $paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary
        $attr = new-object System.Management.Automation.ParameterAttribute
        switch($type){
            'Title+Text'{  
                $attr.ParameterSetName = "A"  
                $attr.Mandatory = $false
                $attrCollection.Add($attr)
                $paramDic.Add("title", (new-object System.Management.Automation.RuntimeDefinedParameter("title", [String], $attrCollection)))  
            }
            'Image+Text'{  
                $attr.ParameterSetName = "B"  
                $attr.Mandatory = $false
                $attrCollection.Add($attr)
                $paramDic.Add("image", (new-object System.Management.Automation.RuntimeDefinedParameter("image", [String], $attrCollection)))  
            }
        }
        return $paramDic
    }
    begin{}
    process{}
    end{
        [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | out-null
        [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | out-null
        $xml = $null
        switch($type){
            'Title+Text' {  
                $xml = [xml]([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)).GetXML()
                # set toast content
                $xml.SelectSingleNode('/toast/visual/binding/text[@id=1]').InnerText = $PSBoundParameters.title  
                $xml.SelectSingleNode('/toast/visual/binding/text[@id=2]').InnerText = $message  
             }
             'Image+Text' {  
                $xml = [xml]([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastImageAndText01)).GetXML()
                # set toast content
                $xml.SelectSingleNode('/toast/visual/binding/text[@id=1]').InnerText = $message  
                $xml.SelectSingleNode('/toast/visual/binding/image[@id=1]').src = $PSBoundParameters.image  
             }
        }

        # add command buttons
        if($includeCloseButton.IsPresent -or $includeDismissButton.IsPresent){
            $commands = $xml.CreateElement('commands')  
            if ($includeCloseButton.IsPresent){
                $command = $xml.CreateElement('command')  
                $command.SetAttribute('id','dismiss') >$null  
                $commands.AppendChild($command) >$null
            }
            if($includeDismissButton.IsPresent){
                $command = $xml.CreateElement('command')  
                $command.SetAttribute('id','snooze') >$null  
                $commands.AppendChild($command) >$null
            }
            $xml.DocumentElement.AppendChild($commands) >$null
        }
        # convert xml object to DOM XML
        $dom = New-Object Windows.Data.Xml.Dom.XmlDocument
        $dom.LoadXml($xml.OuterXml)
        # create toast
        $toast = New-Object Windows.UI.Notifications.ToastNotification $dom -Property @{
            Tag = [System.Web.Security.Membership]::GeneratePassword(15,0)
            Group = "PowerShell"  
            ExpirationTime = $expiration
            ExpiresOnReboot = $expiresOnReboot.IsPresent
            Priority = $priority
            SuppressPopup = $suppressPopup.IsPresent
        }
        # create notifier and show toast
        [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($apptitle).Show($toast)
    }
}

back-to-topAnwendungsbeispiele für die Funktion


back-to-topTitel + Text

Show-ToastNotification `
        -type Title+Text `
        -Title "Das ist meine Überschrift" `  
        -apptitle "Das ist meine App" `          
        -message "Hallo das ist ein Test, oder was auch immer." `  
        -includeCloseButton `
        -expiresOnReboot

screenshot

back-to-topImage + Text

Show-ToastNotification `
        -type Image+Text `        
        -image 'C:\Windows\WinSxS\amd64_microsoft-windows-mediaplayer-core_31bf3856ad364e35_10.0.22000.282_none_069016efd47610d8\DMR_120.jpg' `  
        -apptitle "Das ist meine App" `          
        -message "Hallo das ist ein Test, oder was auch immer." `  
        -includeCloseButton `
        -expiration ([DatetimeOffset]::Now.AddMinutes(1))

screenshot

Grüße Uwe
xLucipher
xLucipher 20.01.2022 um 11:41:37 Uhr
Goto Top
Vielen Dank für eure Antworten. Beide sehr hilfreich und ausführlich beschrieben.
@TK1987 leider ist das konvertieren für mich keine Option.
@colinardo sehr interessant! Da ist mir wohl etwas entfallen. Ich habe diese Option leider gar nicht beachtet und werde mein Skript dann wohl mal überarbeiten. Ich danke euch sehr und werde das Thema hier vorerst als "beantwortet" markieren, oder wie man das hier nennt.

Sollten weitere Fragen auftauchen hört, sieht man sich bestimmt erneut. face-smile

Gruß Dominic