芸は身を助く

2022/02/01

投げっぱなし

サウジ戦勝った! ごきげんよう。

[Windows] タスクスケジューラーの失敗を検出する


先日、バッチファイル内のPowerShellの戻り値を取得する改造方法を書きました。

あまくだry: Qiitaとかいうエントリーシート

これをどこで使いたかったかというとタスクスケジューラーです。
では、バッチファイルを実行するタスクを作成して、それが異常終了したことをどう検出するか。

手順1. タスクスケジューラーのログを有効にする


始めに、タスク実行時にイベントログが記録されるようにします。
最大ログ サイズは初期値10MBではすぐ埋まるので、後から調査したいなど目的に応じて拡張します。

イベント ビューアーを開く
アプリケーションとサービス ログ > Microsoft > Windows > TaskScheduler > Operational
プロパティ > 全般タブ
[v] ログを有効にする

タスクが実行されると、イベントID 201のイベントがResultCodeとともに出力されます。
これを監視すればよさそうです。


手順2. イベントログを監視するタスクを作成する


イベントを監視するトリガーは登録可能です。
しかし、標準では抽出条件がイベントIDくらいしかなく、成否を判断できません。
それどころかWindowsに標準で入っているタスクの終了イベントが大量に検出されます。
監視したいのは自分が新たに作成したタスクだけです。

そこで使用するのがXMLフィルター。
自分も今回の作業で初めて調べたのですが、より細かい条件が指定できます。

タスク スケジューラを開く
タスクの作成
トリガータブ > 新規
タスクの開始: イベント時
設定: (*) カスタム
新しいイベント フィルター > XMLタブ
[v] 手動でクエリを編集する
確認ダイアログではい

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">
      *[System[(EventID=201)]] and 
      Event[EventData[@Name="ActionSuccess"][Data[@Name="TaskName"]="\Hogehoge Task"]] and 
      Event[EventData[@Name="ActionSuccess"][Data[@Name="ResultCode"]!="0"]]
    </Select>
  </Query>
</QueryList>

ResultCodeは0以外で失敗とし、TaskNameはバックスラッシュから始まるフルパスを指定します。
イベントログのメッセージに出力されているのでコピペするのが確実です。

あとは操作のところでプログラムを実行して何かしらの処理を。
今回は eventcreate コマンドでさらにエラーイベントを生成しました。
※要「最上位の特権で実行する」

@echo off
eventcreate /l System /so TaskScheduler /t ERROR /id 201 /d "Hogehoge Task failed."

タスク→イベント→タスク→イベント…これもうわかんねぇな。

今後の課題


エラーイベントのメッセージに戻り値などを埋め込めればもっといいんですが。
検出したタスクの情報を操作側に渡す方法が見つかりませんでした。
XMLフィルターによるトリガーではなく別のしくみが必要かもしれません。
また調べます。

ソーシャル/購読

X Threads note
RSS Feedly Inoreader

このブログを検索

ブログ アーカイブ