プログラムの処理が一時中断されてしまいます。
に関しては以下の箇所で10秒待機しているので、「されてしまいます」というのはちょっとニュアンスが違うように思います。
powershell
1 #1秒待ってからタスクトレイアイコン非表示
2 Start-Sleep -Seconds 10
質問の意図を「バルーン通知の終了を待たずに次の処理に進みたい、ただし、バルーン通知自体の後片付けはしたい」とした場合、
NotifyIconのイベントを使うのが良いでしょう。
PowerShellでイベントを扱う方法はいくつかありますが、今回はRegister-ObjectEvent
コマンドレットが適していると思います。
以下のように対象オブジェクトとイベント名、イベント処理を指定することで、特定イベント発生時に処理を行えます。
powershell
1 # バルーンチップが閉じられたときの処理を予約
2 Register-ObjectEvent -InputObject $balloon -EventName BalloonTipClosed -Action {
3 [Windows.Forms.NotifyIcon]$notify = [Windows.Forms.NotifyIcon]$Sender
4 $notify.Visible = $False
5 $notify.Dispose()
6 } > $null
このあたりを踏まえるとBalloon関数は以下のような感じになるでしょう。
powershell
1#System.Windows.FormsクラスをPowerShellセッションに追加
2Add-Type -AssemblyName System.Windows.Forms
3
4Function Show-Balloon2 {
5 param(
6 [Parameter(Mandatory=$True)]
7 [string]$Msg
8 ,
9 <# 元の処理でも以下のようにValidateSet属性を付けるとPowerShell3以降なら入力補完が効く
10 [ValidateSet('Error', 'Info', 'None', 'Warning')]
11 [string]$IconType
12 #>
13 [Windows.Forms.ToolTipIcon]$IconType = [Windows.Forms.ToolTipIcon]::None
14 )
15
16 #System.Windows.FormsクラスをPowerShellセッションに追加
17 Add-Type -AssemblyName System.Windows.Forms
18 #NotifyIconクラスをインスタンス化
19 [Windows.Forms.NotifyIcon]$balloon = New-Object System.Windows.Forms.NotifyIcon
20
21 #powershellのアイコンを抜き出す
22 $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe')
23 #特定のTipIconのみを使用可
24 #[System.Windows.Forms.ToolTipIcon] | Get-Member -Static -Type Property
25 $balloon.BalloonTipIcon = $IconType
26 #表示するメッセージ
27 $balloon.BalloonTipText = $Msg
28 #表示するタイトル
29 $balloon.BalloonTipTitle = 'TimeManeger'
30 #タスクトレイアイコン表示
31 $balloon.Visible = $True
32
33 # バルーンチップが閉じられたときの処理を予約
34 Register-ObjectEvent -InputObject $balloon -EventName BalloonTipClosed -Action {
35 [Windows.Forms.NotifyIcon]$notify = [Windows.Forms.NotifyIcon]$Sender
36 $notify.Visible = $False
37 $notify.Dispose()
38 } > $null
39
40 #5000ミリ秒表示
41 $balloon.ShowBalloonTip(5000)
42
43}