トップ回答者
バックグラウンドジョブの終了通知

質問
-
お世話になっております。
以下の様なスクリプトをタスクスケジューラに登録し、SYTEMで実行させ、その終了結果をポップアップで表示したいと考えております。
背景としては
夜間にバックアップを実施し、翌朝出勤者がポップアップでその結果を確認したいというものになります。
[move.ps1]--------------------------------------
$FILE1 = 'D:\log\test.log'
$FILE2 = 'D:\backup\test_backup.log'
Move-Item -Path $FILE1 -Destination $FILE2
$(New-Object -comobject Wscript.Shell).popup("処理が終了しました",0,"result",64)
--------------------------------------------------
バックグラウンドで実行したスクリプトから、ポップアップを表示させることは出来ますでしょうか。
よろしくお願いいたします。- 編集済み Yoshinori Endo 2014年8月29日 4:16
回答
-
タスクスケジューラのタスクでウィンドウを表示するには、「ユーザーがログオンしているときのみ実行する」のオプションを有効にする必要があります。すなわち、SYSTEMアカウントでの実行はできません。
バックアップタスクはSYSTEMアカウントで実施する必要があるのであれば、通知の仕組みを別途考える必要があるかと思います。
スクリプトだけで行うなら、以下の様な方法が考えられます。
①move.ps1側では、処理が終了したことを何らかの形(ファイル、イベントログ等)で出力しておく。
②別途、通知用スクリプトnotify.vbsを作成する。
notify.vbsは実行時に①の出力を読み込み、もし処理が終了したとの情報があれば、それをダイアログを表示する。処理が終了したとの情報は削除する。
③notify.vbsはタスクスケジューラに「ユーザーがログオンしているときのみ実行する」のオプションを付けて登録し、ログオン時あるいは10分間隔等で実行する。
通知用スクリプトをPowerShellで作ってもいいのですが、実行時に一瞬PowerShell.exeのコンソールウィンドウが表示されるのをたぶん抑制する方法がないので、vbsで作ったほうが無難かと思います。
他の方法として、move.ps1内でダイアログを表示させるのではなく、msg.exeを使ってメッセージを送る方法もあるかと思います。msg.exeはRPCサービスを使って通知を送るので、通知先に通知ダイアログが正しく表示されます。
通知の送り方については以下を参照してください。
- 回答としてマーク Yoshinori Endo 2014年8月29日 7:00
すべての返信
-
タスクスケジューラのタスクでウィンドウを表示するには、「ユーザーがログオンしているときのみ実行する」のオプションを有効にする必要があります。すなわち、SYSTEMアカウントでの実行はできません。
バックアップタスクはSYSTEMアカウントで実施する必要があるのであれば、通知の仕組みを別途考える必要があるかと思います。
スクリプトだけで行うなら、以下の様な方法が考えられます。
①move.ps1側では、処理が終了したことを何らかの形(ファイル、イベントログ等)で出力しておく。
②別途、通知用スクリプトnotify.vbsを作成する。
notify.vbsは実行時に①の出力を読み込み、もし処理が終了したとの情報があれば、それをダイアログを表示する。処理が終了したとの情報は削除する。
③notify.vbsはタスクスケジューラに「ユーザーがログオンしているときのみ実行する」のオプションを付けて登録し、ログオン時あるいは10分間隔等で実行する。
通知用スクリプトをPowerShellで作ってもいいのですが、実行時に一瞬PowerShell.exeのコンソールウィンドウが表示されるのをたぶん抑制する方法がないので、vbsで作ったほうが無難かと思います。
他の方法として、move.ps1内でダイアログを表示させるのではなく、msg.exeを使ってメッセージを送る方法もあるかと思います。msg.exeはRPCサービスを使って通知を送るので、通知先に通知ダイアログが正しく表示されます。
通知の送り方については以下を参照してください。
- 回答としてマーク Yoshinori Endo 2014年8月29日 7:00