none
バックグラウンドジョブの終了通知 RRS feed

  • 質問

  • お世話になっております。


    以下の様なスクリプトをタスクスケジューラに登録し、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)
    --------------------------------------------------

    バックグラウンドで実行したスクリプトから、ポップアップを表示させることは出来ますでしょうか。


    よろしくお願いいたします。

    2014年8月29日 3:04

回答

  • タスクスケジューラのタスクでウィンドウを表示するには、「ユーザーがログオンしているときのみ実行する」のオプションを有効にする必要があります。すなわち、SYSTEMアカウントでの実行はできません。

    バックアップタスクはSYSTEMアカウントで実施する必要があるのであれば、通知の仕組みを別途考える必要があるかと思います。

    スクリプトだけで行うなら、以下の様な方法が考えられます。

    ①move.ps1側では、処理が終了したことを何らかの形(ファイル、イベントログ等)で出力しておく。

    ②別途、通知用スクリプトnotify.vbsを作成する。

    notify.vbsは実行時に①の出力を読み込み、もし処理が終了したとの情報があれば、それをダイアログを表示する。処理が終了したとの情報は削除する。

    ③notify.vbsはタスクスケジューラに「ユーザーがログオンしているときのみ実行する」のオプションを付けて登録し、ログオン時あるいは10分間隔等で実行する。


    通知用スクリプトをPowerShellで作ってもいいのですが、実行時に一瞬PowerShell.exeのコンソールウィンドウが表示されるのをたぶん抑制する方法がないので、vbsで作ったほうが無難かと思います。

    他の方法として、move.ps1内でダイアログを表示させるのではなく、msg.exeを使ってメッセージを送る方法もあるかと思います。msg.exeはRPCサービスを使って通知を送るので、通知先に通知ダイアログが正しく表示されます。

    通知の送り方については以下を参照してください。

    Blogs - フィールドSEあがりの安納です - Site Home - TechNet Blogs

    2014年8月29日 5:59
    モデレータ

すべての返信

  • ご提示のスクリプトを仮にmove.ps1として、PowerShell.exeコンソールから

    Start-Job {C:\script\move.ps1}

    のように実行すると、ポップアップが表示されました。(Windows8.1環境)

    このようにしても表示されないということでしょうか? それとも、別の意味なのでしょうか。

    2014年8月29日 3:50
    モデレータ
  • 牟田口さま


    返信いただき、ありがとうございます。
    すみません。
    情報が少なかったです。

    タスクスケジューラに[move.ps1]を登録し、SYTEMで実行させた場合となります。

    背景としては
    夜間にバックアップを実施し、翌朝出勤者がポップアップでその結果を確認したいというものになります。

    よろしくお願いいたします。

    2014年8月29日 4:14
  • タスクスケジューラのタスクでウィンドウを表示するには、「ユーザーがログオンしているときのみ実行する」のオプションを有効にする必要があります。すなわち、SYSTEMアカウントでの実行はできません。

    バックアップタスクはSYSTEMアカウントで実施する必要があるのであれば、通知の仕組みを別途考える必要があるかと思います。

    スクリプトだけで行うなら、以下の様な方法が考えられます。

    ①move.ps1側では、処理が終了したことを何らかの形(ファイル、イベントログ等)で出力しておく。

    ②別途、通知用スクリプトnotify.vbsを作成する。

    notify.vbsは実行時に①の出力を読み込み、もし処理が終了したとの情報があれば、それをダイアログを表示する。処理が終了したとの情報は削除する。

    ③notify.vbsはタスクスケジューラに「ユーザーがログオンしているときのみ実行する」のオプションを付けて登録し、ログオン時あるいは10分間隔等で実行する。


    通知用スクリプトをPowerShellで作ってもいいのですが、実行時に一瞬PowerShell.exeのコンソールウィンドウが表示されるのをたぶん抑制する方法がないので、vbsで作ったほうが無難かと思います。

    他の方法として、move.ps1内でダイアログを表示させるのではなく、msg.exeを使ってメッセージを送る方法もあるかと思います。msg.exeはRPCサービスを使って通知を送るので、通知先に通知ダイアログが正しく表示されます。

    通知の送り方については以下を参照してください。

    Blogs - フィールドSEあがりの安納です - Site Home - TechNet Blogs

    2014年8月29日 5:59
    モデレータ
  • 牟田口さま


    丁寧な解説、ありがとうございます!
    ご教授いただいた内容で、スクリプトを作り直してみたいと思います。


    ありがとうございました。


    2014年8月29日 7:04