PowerShell script to display Notification balloon and take action only works in ISE gui, not from commandline

Jordan W. picture Jordan W. · Mar 21, 2011 · Viewed 8.5k times · Source

I've seen a bunch of closely related posts so I know i'm not alone, but none have given me the answer I'm looking for. Apologies if this has been asked and answered and I couldn't find it.

this script creates a custom notification area balloon, which, if clicked on is meant to open a new IE window to some URL. Works great from the PowerShell ISE GUI that I've been working with it in. Can't get it to work from command-line using any of the options i've seen suggested in other posts. Specifically, can't get the IE window to open. The notification appears no problem, but no IE window...?? Tried with:

  • powershell . script.ps1
  • powershell -file script.ps1
  • command
  • &

etc.

Thoughts?

My script:

#Load the required assemblies
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
#Remove any registered events related to notifications
Remove-Event BalloonClicked_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier BalloonClicked_event -ea silentlycontinue
Remove-Event BalloonClosed_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier BalloonClosed_event -ea silentlycontinue
Remove-Event Disposed -ea SilentlyContinue
Unregister-Event -SourceIdentifier Disposed -ea silentlycontinue

#Create the notification object
$notification = New-Object System.Windows.Forms.NotifyIcon 
#Define various parts of the notification
$notification.Icon = [System.Drawing.SystemIcons]::Information
$notification.BalloonTipTitle = “**Reminder**”
$notification.BalloonTipIcon = “Warning”
$title = “message to user”
$notification.BalloonTipText = $title

#Make balloon tip visible when called
$notification.Visible = $True

## Register a click event with action to take based on event
#Balloon message clicked
register-objectevent $notification BalloonTipClicked BalloonClicked_event -Action {
    Start-Process 'c:\Program Files\Internet Explorer\iexplore.exe' -ArgumentList 'http://someURL.com' -WindowStyle Maximized -Verb Open
    #Get rid of the icon after action is taken
    $notification.Dispose()
    } | Out-Null

#Balloon message closed
register-objectevent $notification BalloonTipClosed BalloonClosed_event -Action {$notification.Dispose()} | Out-Null

#Call the balloon notification
$notification.ShowBalloonTip(1000)

Answer

Fernando Madruga picture Fernando Madruga · Jun 14, 2011

The reason why it doesn't work in non-interactive prompts is that powershell has already finished processing when the user clicks the balloon.

You can fix that in one of two ways:

  • add a sleep(1) at the end of the script, so it doesn't end before the user clicking the balloon; (increase the value if needed, although I tested w/ 1 sec just fine)
  • use the -noexit commandline parameter and then close powershell programatically upon the user clicking the notification or after some delay (I tested that it would launch IE with no changes to your code, didn't bother coding the exit part.)