Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

Windows のタスクスケジューラでは、あらかじめ設定したスケジュールに従ってタスクを実行できるだけでなく、イベントログに特定のイベントが記録されたことをきっかけにタスクを起動することもできます(詳細は「Windows のイベントトリガー」関連記事をご参照ください)。本記事では、前のタスクが完了した直後に次のタスクを自動的に起動させる方法を解説します。ここで紹介する手順は、要件に合わせて自由にカスタマイズできる汎用的なアルゴリズムです。

想定されるユースケース

たとえば、あるスクリプトの実行が終わった後、続けて別のユーザーアカウントで別のスクリプトを起動したいようなケースです。実行ユーザーが異なる場合、両方の処理をひとつのタスクにまとめることはできません。

ここでは、「Ping」というタスクが完了したら、その直後に「Pong」というタスクを起動する構成を例に説明します。タスクの開始や完了が発生すると、その情報はタスクスケジューラの運用ログに記録されます。今回注目するのは、Ping タスクの完了を示すイベントです。

ステップ1:完了イベントの情報を確認する

タスクスケジューラ コンソール(taskschd.msc)を開き、Ping タスクを選択します。コンソール下部の[履歴]タブには、このタスクに関連するすべてのイベントが表示されています。タスク完了後に生成される、イベントID 102(タスク完了)のイベントを探してください。

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

[詳細]タブを開いて[XML 表示]を有効にすると、イベントの詳細データを確認できます。このXML情報から、トリガーのフィルター作成に必要な要素をすべて取得できます。今回必要なのは以下の項目です。

  • EventID:102
  • プロバイダー名:Microsoft-Windows-TaskScheduler
  • チャネル:Microsoft-Windows-TaskScheduler/Operational
  • TaskName:\ping

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

ステップ2:Pong タスクにイベントトリガーを作成する

Pong タスクのトリガー設定では、「イベント時」を条件に、イベントID 102 がログに記録されたときにタスクが開始されるよう設定します。

しかし、ここに落とし穴があります。イベントID 102 は Ping タスクだけでなく、どのタスクが完了しても記録されるため、この条件だけでは他のタスクの完了にも反応してしまいます。

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

ステップ3:カスタムイベントフィルターを作成する

標準のフィルターでは対象イベントを正確に絞り込めない場合は、より柔軟な条件([カスタム])を作成できます。[新しいイベント フィルター] をクリックしてください。

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

イベントのXML表示で取得した情報を指定して、新しいイベントフィルターを作成します。

  • イベント ログ:Microsoft-Windows-TaskScheduler/Operational
  • イベント ソース:TaskScheduler
  • タスク カテゴリ:タスク完了

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

ステップ4:XPathを編集してPingタスク限定の条件にする

[XML] タブに切り替えると、フィルターの内部表現(XPath)を確認できます。

<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and (EventID=102)]]</Select>
</Query>
</QueryList>

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

このXPathを次のように書き換えることで、\ping タスクの完了イベントだけを抽出するフィルターになります。ポイントは、EventData 内の TaskName を条件に加えて、対象タスクを \ping に限定している点です。

<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[EventData[Data[@Name='TaskName']='\ping'] and System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and (EventID=102)]]</Select>
</Query>
</QueryList>

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

ステップ5:動作を確認する

トリガーの設定が完了したら、Ping タスクを手動で実行してみてください。Ping が完了した瞬間に Pong タスクが即座に起動すれば設定は成功です。

XPathの解説

フィルター内の各要素の意味は、下図のとおりです。XPath の構造を理解しておくと、他のタスクやイベントIDにも応用できるようになります。

【Windows】タスクスケジューラで別タスクの完了後に次のタスクを自動実行する方法

  1. タスクスケジューラで起動時や指定時刻にプログラムを自動実行する方法【Windows】

    Windowsの起動時や指定した時刻にプログラムを自動的に開始させたい方は、ぜひこのチュートリアルをご覧ください。タスクスケジューラを使った設定手順を、初心者にもわかりやすく解説していきます。 スタートアップフォルダの方法では不十分なケースがある 通常、Windowsのスタートアップにプログラムを追加するには、対象プログラムのショートカットを「スタートアップ」フォルダに置くのが一般的な方法です。しかし、この方法は常に機能するとは限りません。特に、プログラムが管理者権限を必要とする場合には、正しく起動しないことがあります。 この問題を回避するには、レジストリを使ってスタートアップに登録するか、タ

  2. Windowsを指定時刻に自動的に起動させるスケジュール設定のやり方

    PCをスリープ状態から何度も手動で起こすのが面倒だと感じていませんか?この記事を読み終える頃には、指定した時刻にPCが自動的に起動するようスケジュールを設定できるようになります。 Windowsの自動起動(自動復帰)をスケジュールする方法 まず押さえておきたい注意点として、Windowsを完全にシャットダウンしている場合、自動的な起動は行えません。自動復帰を設定できるのは、PCが「スリープ」または「休止状態」にあるときだけです。それを踏まえた上で、実際の設定手順を見ていきましょう。 1. タスクスケジューラを使う タスクスケジューラは、Windowsに標準搭載された無料ユーティリティで、P