バッチ(.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 /c
に cd /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 エクスポート/インポートで構成をコード化しておくと、再現性の高い運用が実現できます。