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をタスクスケジューラにインポートする際、以下の点に注意が必要です。

  1. 文字コード

    • ファイルは UTF-16 BOM付き で保存する必要があります
    • UTF-8 で保存するとインポートに失敗します
  2. スペースを含むパス

    • 実行ディレクトリにスペースがある場合、CommandWorkingDirectory を分けて指定してください
    • 例: C:\Program Files\ConsistRunner
  3. 開始日付について

    • サンプルでは 1999-01-01 を指定していますが、これは固定値でも問題ありません
    • タスクスケジューラはタスク追加後に 「次回実行時刻」を自動計算 するため、実際の開始日は考慮されません
  4. 権限設定

    • サービスの開始・終了など管理者権限が必要な場合は、S-1-5-18 (LocalSystem) を検討します
  5. LocalService / LocalSystem を使う理由

    • ログインユーザのパスワード変更でタスクが実行できなくなるリスクを避けるためです
    • ただし LocalService で実行する場合は、実行ディレクトリにアクセス権を付与する必要があります
      • 例:
        icacls "C:\ConsistRunner" /grant "NT AUTHORITY\LOCAL SERVICE:(OI)(CI)RX"
        
      • 上記のように icacls コマンドで実行フォルダに読み取り・実行権限を付与しておくと安定します
  6. 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