Windowsタスクスケジューラでタスク同士を連携させるのは、必ずしも簡単ではありません。特に、あるタスクが正常に完了した後に別のタスクを自動的に開始したい場合などはなおさらです。タスクスケジューラの設定を試したことがあれば、トリガーを作成するだけでは不十分なことがお分かりでしょう。特に、タスクスケジューラのデフォルトのイベントトリガーは、特定のタスクの完了だけでなく、すべてのタスクの完了をリッスンするためです。そのため、例えば「Ping」タスクだけでなく、任意のタスクの直後に「Pong」タスクが開始されるなど、混乱が生じる可能性があります。
スムーズに動作させるには、イベントビューアーを詳しく調べてカスタムフィルターを設定する必要があります。ちょっとしたハックですが、一度正しく設定すれば非常に便利です。基本的には、特定のタスク名を持つイベントID 102を監視することで、2つ目のタスクは、最初のタスクが正常に完了した場合にのみ開始されます。
別のタスクが正常に完了した後に実行されるように設定する方法
タスクスケジューラの操作ログを見つけて有効にする
- 実行プロンプト ( ) にeventvwr.mscと入力して、イベント ビューアーを開きますWin + R。
- [アプリケーションとサービス ログ] > [Microsoft] > [Windows] > [タスク スケジューラ] > [操作]に移動します。
- ログが表示されない場合は、「Operational」を右クリックし、「Enable Log」を選択してください。Windowsは時々、必要以上に面倒なことをする傾向があります。
有効にすると、タスク イベントの追跡を開始できます。
最初のタスクの完了イベントを特定する
- 最初のタスクを手動で実行してイベントを生成するか、自然に終了するまで待機します。
- ID 102 (「タスクが完了しました」)の最新イベントの詳細タブに切り替えます。
- XMLビューに切り替えます。ここでは、タスク名やパラメータなどの詳細情報が表示されます。
- 次のようなデータ行を探します。
EventID: 102 Provider-Name: Microsoft-Windows-TaskScheduler Channel: Microsoft-Windows-TaskScheduler/Operational TaskName: \MyTasks\Ping
注: 設定によっては、イベントが少し遅れたり、すぐに表示されない場合があります。しばらくお待ちいただくか、タスクを複数回実行してご確認ください。
特定のタスクを監視するためのカスタムイベントフィルターを作成する
- 「Pong」タスクのトリガー設定で、イベント時を選択します。
- [新しいイベント フィルター]をクリックします。
- 以下を設定します。
- ログ: Microsoft-Windows-TaskScheduler/Operational
- イベントソース: TaskScheduler
- イベントID : 102
- さらに調整するには、下部のXMLタブに切り替えます。
- 「クエリを手動で編集」ボックスにチェックを入れてください。ここで魔法が起こります。XPathを次のようなカスタムフィルターに置き換えてください。
<QueryList> <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational"> <Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and Task=102]]</Select> </Query> </QueryList> - 次に、Pingタスクに固有のものであるかどうかを確認して、さらに絞り込みます。EventDataに関する行を見つけて、以下のコードに置き換えます。
*[EventData [@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\\MyTasks\\Ping']]
完了したら、フィルターを保存します。重要なのは、このカスタムフィルターに基づいてトリガーを設定することです。「Pong」タスクは「Ping」タスクが正常に完了した場合にのみ実行されます。
セットアップをテストする
Pingタスクを手動で実行するか、通常の動作に任せてください。Pongタスクが、正しいタスクが完了した直後に実行されるかどうかを確認してください。奇妙なことに、特にイベントビューアーがしばらく無効になっていた場合、すべてが完全に同期されるまでに数回試行したり、再起動したりする必要があることがあります。辛抱強く待ちましょう。
これを設定すれば、Windowsは実際に意味のある方法でタスクを連鎖させることができます。例えば、メインのジョブが正常に終了した後にのみ、クリーンアップやバックアップのスクリプトを実行するなどです。適切なフィルターを用意するだけで、このトリックによってWindowsはバックグラウンドで、多くの人が気づいていないほど多くの処理を実行できるようになります。
まとめ
- タスク スケジューラのイベント ログを有効にします。
- 特定のタスクのタスク完了イベント (ID 102) を見つけます。
- カスタム XML フィルターを使用して、必要なイベントのみをキャッチします。
- このフィルターに基づいて、2 番目のタスクにトリガーを設定します。
まとめ
だいたいこんな感じです。簡単ではありませんが、フィルターを一度設定すれば、驚くほどうまく機能します。もう予期せぬトリガーは発生せず、タスクが順番にクリーンに実行されます。何かおかしな動作をしている場合は、ログを確認してください。Windowsは、実際よりも簡単に見えるようにする傾向があります。これがお役に立てば幸いです。自動化を楽しんでください!