【bat】バッチでタスクスケジューラを登録・削除する方法

バッチ(.bat)だけで定期実行ジョブを登録・更新・削除したいときは schtasks.exe を使います。GUI を開かなくても「いつ」「誰の権限で」「何を」「どこで」実行するかをすべて指定できます。ここでは最小例から始め、毎日・毎週・ログオン時・起動時などの代表パターン、管理者権限実行、作業ディレクトリ固定、XML を使った高度設定、そして削除や無効化までをひと通りまとめます。

毎日実行の最小例(HIGHEST 権限・ログオン有無を問わず)

もっともよく使うのは「毎日決まった時刻に実行」です。パスに空白がある場合は必ず二重引用符で囲み、実行内容は cmd /c で包むと安全です。

@echo off
set "TASK=MyDailyJob"
set "WHEN=02:00"
set "CMD=cmd /c cd /d C:\Scripts ^& run.bat"

rem ログオン有無を問わず、最上位の特権で実行(実行ユーザーは現在の自分)
schtasks /Create /TN "%TASK%" /TR "%CMD%" /SC DAILY /ST %WHEN% ^
  /RL HIGHEST /RU "%USERNAME%" /RP MyPa$$w0rd /F

rem パスワード入力を避けたい場合は「実行アカウント用の専用ユーザー」を用意するか、
rem 後述の SYSTEM 実行か XML+資格情報設定を検討します。

管理者権限でパスワード不要にしたい(SYSTEM で実行)

無人運用でパスワードを持たせたくない場合は「ローカル SYSTEM アカウント」で動かします。ネットワーク共有へアクセスする場合は権限に注意してください。

@echo off
schtasks /Create /TN "NightlySystemJob" ^
  /TR "cmd /c C:\Jobs\nightly.bat" ^
  /SC DAILY /ST 01:30 /RL HIGHEST /RU "SYSTEM" /F

毎週や毎月などのスケジュール指定

毎週月水金の朝 7 時、のような指定は /SC WEEKLY/D を併用します。毎月第一月曜は /SC MONTHLY/D MON /M 1 のように組み合わせます。

@echo off
rem 毎週:月水金の 07:00
schtasks /Create /TN "MWF_7AM" ^
  /TR "cmd /c C:\Jobs\report.bat" ^
  /SC WEEKLY /D MON,WED,FRI /ST 07:00 /RU "SYSTEM" /RL HIGHEST /F

rem 毎月:第一月曜の 08:15
schtasks /Create /TN "1stMon" ^
  /TR "cmd /c C:\Jobs\month_open.bat" ^
  /SC MONTHLY /D MON /MO FIRST /ST 08:15 /RU "SYSTEM" /RL HIGHEST /F

ログオン時・起動時に実行するトリガー

ユーザーのログオン時や OS 起動時に走らせたい場合は /SC ONLOGON/SC ONSTART を使います。起動直後は各種サービスが立ち上がる前で失敗しやすいので、開始を遅延させたいときは timeout 等をコマンド側に入れておくと安定します。

@echo off
rem ログオン時(誰がログオンしても)
schtasks /Create /TN "AtLogon" ^
  /TR "cmd /c C:\Jobs\on_logon.bat" ^
  /SC ONLOGON /RL HIGHEST /RU "SYSTEM" /F

rem システム起動時(ブート完了直後)
schtasks /Create /TN "AtBoot" ^
  /TR "cmd /c timeout /t 20 ^& C:\Jobs\on_start.bat" ^
  /SC ONSTART /RL HIGHEST /RU "SYSTEM" /F

作業ディレクトリを固定して実行するコツ

スケジューラ実行時のカレントディレクトリは通常 C:\Windows\System32 です。相対パスで失敗しないよう、実行コマンドの先頭で cd /d "%~dp0" 相当を行うか、cmd /ccd /d <作業フォルダ> を組み込みます。

@echo off
set "WORK=C:\Apps\MyJob"
set "TASK=JobWithWorkdir"
set "CMD=cmd /c cd /d %WORK% ^& run-job.bat arg1"

schtasks /Create /TN "%TASK%" /TR "%CMD%" /SC DAILY /ST 03:00 ^
  /RU "SYSTEM" /RL HIGHEST /F

ジョブの確認・即時実行・一時停止(無効化)

作ったタスクは一覧や詳細で確認できます。テストのために即時実行することも可能です。動かしたくない期間は無効化しておき、再開時に有効化します。

@echo off
rem 一覧
schtasks /Query /FO LIST

rem 詳細
schtasks /Query /TN "MyDailyJob" /V /FO LIST

rem すぐ実行
schtasks /Run /TN "MyDailyJob"

rem 無効化 → 有効化
schtasks /Change /TN "MyDailyJob" /Disable
schtasks /Change /TN "MyDailyJob" /Enable

更新(コマンドだけ差し替え・時刻だけ変更)

既存タスクの一部設定を変えたい場合は /Change を使います。トリガーの時刻変更や、実行コマンド差し替えができます。

@echo off
rem 実行コマンド差し替え
schtasks /Change /TN "MyDailyJob" /TR "cmd /c C:\Scripts\new_run.bat"

rem 実行時刻だけ 01:00 に変更
schtasks /Change /TN "MyDailyJob" /ST 01:00

削除(確認なし強制)

タスクを消すときは /Delete を使います。自動化では確認を出さないために /F を付けます。

@echo off
schtasks /Delete /TN "MyDailyJob" /F
schtasks /Delete /TN "NightlySystemJob" /F

XML で高度な設定をインポートする

GUI で作ったタスクを「エクスポート(XML)」しておけば、同じ設定を別環境に配布できます。XML には多段トリガーや条件(アイドル時のみ等)、停止・再試行ポリシーなど詳細が含まれます。

@echo off
rem 既存タスクを XML に保存(GUI 側のエクスポートでも可)
schtasks /Query /TN "MyDailyJob" /XML > MyDailyJob.xml

rem 他環境へインポート(SYSTEM で登録)
schtasks /Create /TN "MyDailyJob" /XML "MyDailyJob.xml" /RU "SYSTEM" /RL HIGHEST /F

トラブル時のチェックポイント

実行されない、手動だと動くのにスケジューラでは失敗する、といった時は次の順で確認します。作業ディレクトリが System32 になっていないか。相対パスが混ざっていないか。ネットワークドライブをドライブレターで参照していないか(UNC に置換)。管理者権限が必要なのに一般ユーザーで動かしていないか(/RL HIGHEST と実行アカウントを再確認)。標準出力と標準エラーをログにリダイレクトして、失敗箇所を可視化しているか。

@echo off
set "LOG=C:\Logs\myjob_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log"
schtasks /Create /TN "DebugJob" ^
  /TR "cmd /c cd /d C:\Scripts ^& run.bat 1>\"%LOG%\" 2>&1" ^
  /SC ONCE /ST 23:00 /RU "SYSTEM" /RL HIGHEST /F

まとめ

バッチからのタスク登録は schtasks /Create/Change、メンテナンスは /Run/Query/Delete を押さえれば十分に自動化できます。権限は SYSTEM か専用アカウントで統一し、実行ディレクトリは cmd /c cd /d … で確実に固定、ネットワークは UNC を使い、出力はログへリダイレクト。必要に応じて XML エクスポート/インポートで構成をコード化しておくと、再現性の高い運用が実現できます。