⏰
Windowsタスクスケジューラでコンソールアプリを自動実行する基本テンプレート
Windowsタスクスケジューラでコンソールアプリを自動実行する基本テンプレート
はじめに
Windows環境で「定期的にアプリを実行したい」という場面は多くあります。
シンプルなタスクであれば schtasks
コマンドで直接作成することもできますが、複雑な設定をする場合はXMLテンプレートを利用する方が分かりやすく、一貫性を保てます。
本記事では、サンプルアプリ ConsistRunner で利用しているタスクスケジューラXMLの基本を紹介します。
サンプルXML
以下は、毎時実行するタスクのテンプレート例です。
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author>#AUTHOR#</Author>
<!-- 作成タスクの説明。必要に応じて変更してください -->
<Description>ConsistRunner hourly task</Description>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>1999-01-01T#TASK_START_TIME#</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
<Repetition>
<Interval>PT1H</Interval>
<Duration>P1D</Duration>
</Repetition>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<!-- LocalService -->
<UserId>S-1-5-19</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Actions Context="Author">
<Exec>
<Command>#EXE_NAME#</Command>
<WorkingDirectory>#WORKING_DIR#</WorkingDirectory>
</Exec>
</Actions>
</Task>
👉 実際のファイルはこちら:
ConsistRunner_Hourly.xml
プレースホルダの意味
-
#AUTHOR#
: 作成者名 -
#TASK_START_TIME#
: タスク開始時刻(例:09:00:00
) -
#EXE_NAME#
: 実行するアプリケーション名 -
#WORKING_DIR#
: 実行ディレクトリ
運用上の注意点
XMLをタスクスケジューラにインポートする際、以下の点に注意が必要です。
-
文字コード
- ファイルは UTF-16 BOM付き で保存する必要があります
- UTF-8 で保存するとインポートに失敗します
-
スペースを含むパス
- 実行ディレクトリにスペースがある場合、
Command
とWorkingDirectory
を分けて指定してください - 例:
C:\Program Files\ConsistRunner
- 実行ディレクトリにスペースがある場合、
-
開始日付について
- サンプルでは
1999-01-01
を指定していますが、これは固定値でも問題ありません - タスクスケジューラはタスク追加後に 「次回実行時刻」を自動計算 するため、実際の開始日は考慮されません
- サンプルでは
-
権限設定
- サービスの開始・終了など管理者権限が必要な場合は、
S-1-5-18 (LocalSystem)
を検討します
- サービスの開始・終了など管理者権限が必要な場合は、
-
LocalService / LocalSystem を使う理由
- ログインユーザのパスワード変更でタスクが実行できなくなるリスクを避けるためです
- ただし LocalService で実行する場合は、実行ディレクトリにアクセス権を付与する必要があります
- 例:
icacls "C:\ConsistRunner" /grant "NT AUTHORITY\LOCAL SERVICE:(OI)(CI)RX"
- 上記のように
icacls
コマンドで実行フォルダに読み取り・実行権限を付与しておくと安定します
- 例:
-
Taskバージョンについて
- Task Scheduler のスキーマバージョンは 1.0 ~ 1.4 が定義されています
- 詳細は Microsoft公式仕様 (MS-TSCH) を参照
- 特別な理由がなければ、サンプルのまま 1.3 を利用して問題ありません
- ※本記事の内容は、自身の検証と見解に基づくものです。実際の環境に応じて調整してください。
インポート手順(コマンド例)
XMLファイルは schtasks
コマンドで登録できます(※管理者権限必須)。
schtasks /Create /TN "ConsistRunnerHourly" /XML ConsistRunner_Hourly.xml /F
-
/TN
: タスク名 -
/XML
: インポートするXMLファイル -
/F
: 既存タスクがある場合に上書き
👉 GUI操作よりもテンプレート化しておく方が、再利用性・一貫性が高くなります。
1日に1回実行する場合のサンプル
毎時ではなく 1日に1回だけ 実行したい場合は、<Repetition>
を省略し、DaysInterval
を1に設定するだけです。
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
この場合は「毎日1回、指定した時刻に実行」されます。
まとめ
- タスクスケジューラは XMLテンプレートで一貫性を確保 するのが便利
- プレースホルダを置換するだけで、さまざまなアプリに流用できる
-
1999-01-01
のような固定日付でも問題なく、タスク追加後に次回実行時刻は自動計算される - Task Schema のバージョンは 1.0~1.4 が存在し、特に理由がなければ 1.3 のままで問題なし
- LocalService を使う場合は事前に
icacls
で権限付与を忘れずに - Inno Setup と組み合わせれば、インストーラ実行時に自動登録・削除まで可能
👉 続編記事では、このタスクスケジューラXMLを Inno Setupと組み合わせる方法 を解説予定です。
Discussion