Windowsの定期処理自動化といえばタスクスケジューラですが、GUIだけでなく schtasks コマンドを使えばバッチファイルからタスクの登録・変更・削除・即時実行まで完全に自動化できます。
本記事では schtasks の全オプションを体系的に解説し、毎日・週次・月次・起動時・ログオン時などのトリガー設定から、管理者権限実行・エラーログ確認・サイレント登録まで実践コードで紹介します。
- schtasks /Create でタスクをコマンドラインから登録する方法(毎日・週次・月次・起動時)
- schtasks /Query でタスクの一覧・状態・次回実行時刻を確認する方法
- schtasks /Change でトリガーや実行パスを変更する方法
- schtasks /Delete でタスクをコマンドラインから削除する方法
- schtasks /Run でタスクをテスト実行・即時起動する方法
- 管理者権限(/RL HIGHEST)で実行するタスクの登録方法
- バッチファイルからタスクを自動登録・更新するデプロイスクリプトの作り方
- タスクの実行結果とエラーログを確認する方法
schtasks サブコマンド一覧
| サブコマンド | 機能 | 主なオプション |
|---|---|---|
| /Create | タスクを新規登録 | /TN /TR /SC /ST /D /MO /RL /RU /F |
| /Query | タスクの一覧・状態確認 | /TN /FO /NH /V |
| /Change | 既存タスクを変更 | /TN /TR /ST /RL /ENABLE /DISABLE |
| /Delete | タスクを削除 | /TN /F |
| /Run | タスクを即時実行 | /TN /I |
| /End | 実行中のタスクを停止 | /TN |
| /SC 値 | 実行頻度 | 主な追加オプション |
|---|---|---|
| ONCE | 1回だけ | /ST 時刻 |
| DAILY | 毎日 | /ST 時刻 /MO N(N日おき) |
| WEEKLY | 毎週 | /D 曜日 /ST 時刻 /MO N(N週おき) |
| MONTHLY | 毎月 | /D 日付 /MO 月指定 |
| ONSTART | システム起動時 | — |
| ONLOGON | ユーザーログオン時 | /D ユーザー名 |
| ONIDLE | アイドル時 | /I アイドル分数 |
タスクを登録する(schtasks /Create)
最も使う操作です。/F オプションを付けると同名タスクが存在する場合に上書きするため、冪等なデプロイスクリプトに不可欠です。
schtasks /Create ^ /TN "DailyBackup" ^ /TR "C:\Scripts\backup.bat" ^ /SC DAILY ^ /ST 02:00 ^ /F REM /TN: タスク名(フォルダ区切りは \ 例: \MyApp\Backup) REM /TR: 実行するプログラム/スクリプトのフルパス REM /SC: スケジュール種別 REM /ST: 開始時刻(HH:MM 形式) REM /F: 既存タスクを上書き(指定しないと同名タスクがある場合エラー)
schtasks /Create ^ /TN "WeeklyReport" ^ /TR "C:\Scripts\report.bat" ^ /SC WEEKLY ^ /D MON,WED,FRI ^ /ST 09:00 ^ /F REM /D: 曜日指定(MON TUE WED THU FRI SAT SUN または 1〜7) REM 複数曜日はカンマ区切りで指定する
schtasks /Create ^ /TN "MonthlyCleanup" ^ /TR "C:\Scripts\cleanup.bat" ^ /SC MONTHLY ^ /D 1 ^ /ST 03:00 ^ /F REM /D: 日付(1〜31 または LAST で月末指定) REM 月末に実行したい場合: /D LAST
REM PC起動時(システム起動直後、ユーザー未ログインでも実行) schtasks /Create ^ /TN "OnStartupTask" ^ /TR "C:\Scripts\startup.bat" ^ /SC ONSTART ^ /RL HIGHEST ^ /F REM ログオン時(ユーザーがログオンするたびに実行) schtasks /Create ^ /TN "OnLogonTask" ^ /TR "C:\Scripts\logon.bat" ^ /SC ONLOGON ^ /F
REM 30分ごとに実行するタスク schtasks /Create ^ /TN "HealthCheck" ^ /TR "C:\Scripts\healthcheck.bat" ^ /SC MINUTE ^ /MO 30 ^ /F REM 2時間ごとに実行するタスク schtasks /Create ^ /TN "HourlySync" ^ /TR "C:\Scripts\sync.bat" ^ /SC HOURLY ^ /MO 2 ^ /F REM /MO: 繰り返し間隔(/SC MINUTE なら分数、/SC HOURLY なら時間数)
/F(Force)を付けると同名タスクが存在する場合に上書き登録します。付けない場合は同名タスクが存在するとエラーになります。デプロイスクリプトにタスク登録を組み込む場合は必ず /F を付けて何度実行しても同じ結果になる冪等な実装にしてください。タスクを確認する(schtasks /Query)
登録済みのタスクの状態・次回実行時刻・最終実行結果を確認します。/V(Verbose)で詳細情報、/FO CSV で CSV 形式で出力できます。
REM すべてのタスクを一覧表示 schtasks /Query REM 特定タスクの詳細を表示 schtasks /Query /TN "DailyBackup" /V /FO LIST REM CSV 形式で出力してファイルに保存 schtasks /Query /FO CSV /NH > "C:\logs\tasks.csv" REM 特定タスクの次回実行時刻と最終実行結果だけを表示 schtasks /Query /TN "DailyBackup" /FO LIST | findstr /i "次回\|最終\|状態\|Next\|Last\|Status"
@echo off
setlocal
set "TASK_NAME=DailyBackup"
REM タスクが存在するか確認
schtasks /Query /TN "%TASK_NAME%" >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [ERROR] タスク "%TASK_NAME%" が見つかりません
exit /b 1
)
echo タスク "%TASK_NAME%" は登録済みです
REM 最終実行結果コードを取得(/V で詳細 → findstr で抽出)
for /f "tokens=2 delims=:" %%R in (
'schtasks /Query /TN "%TASK_NAME%" /V /FO LIST ^| findstr /i "Last Result"'
) do set LAST_RESULT=%%R
echo 最終実行結果コード:%LAST_RESULT%
endlocal
タスクを変更・有効化・無効化する(schtasks /Change)
既存タスクの実行時刻や実行パスを変更したり、タスクを一時的に無効化/有効化する操作です。
REM 実行時刻を変更(毎日 3:00 に変更) schtasks /Change /TN "DailyBackup" /ST 03:00 REM 実行するスクリプトのパスを変更 schtasks /Change /TN "DailyBackup" /TR "C:\Scripts\new_backup.bat" REM タスクを無効化(実行されなくなる) schtasks /Change /TN "DailyBackup" /DISABLE REM タスクを有効化(再び実行されるようになる) schtasks /Change /TN "DailyBackup" /ENABLE REM 実行ユーザーを変更(管理者権限で実行するよう変更) schtasks /Change /TN "DailyBackup" /RL HIGHEST
タスクを削除する(schtasks /Delete)
REM 確認プロンプトなしで削除(/F で強制)
schtasks /Delete /TN "DailyBackup" /F
REM フォルダ(タスクフォルダ)ごと削除
schtasks /Delete /TN "\MyApp\" /F
REM タスクが存在する場合のみ削除する(存在しなくてもエラーにしない)
schtasks /Query /TN "DailyBackup" >nul 2>&1
if %ERRORLEVEL% equ 0 (
schtasks /Delete /TN "DailyBackup" /F
echo タスクを削除しました
) else (
echo タスクは存在しません(削除不要)
)
タスクを即時実行・テスト実行する(schtasks /Run)
タスクスケジューラのトリガーを待たずに即時実行したい場合に使います。登録直後の動作確認に便利です。
REM タスクを即時実行 schtasks /Run /TN "DailyBackup" REM 実行後に結果を確認(数秒待ってから状態を表示) schtasks /Run /TN "DailyBackup" timeout /t 5 /nobreak >nul schtasks /Query /TN "DailyBackup" /V /FO LIST | findstr /i "Last Result\|Status" REM 実行中のタスクを停止する schtasks /End /TN "DailyBackup"
schtasks /Run はタスクを非同期で起動します。コマンドが返ってもタスクの実行は続いています。完了を待ちたい場合は timeout /t N で適切な待機時間を置いてから/Query で状態を確認してください。タスクが「実行中」のまま /Run を再度実行すると二重起動になります。管理者権限で実行するタスクを登録する(/RL HIGHEST)
システム系のバッチやサービス操作には管理者権限が必要です。/RL HIGHEST(最高の特権で実行)と/RU SYSTEM(SYSTEM アカウントで実行)の2つのアプローチがあります。
REM パターン1: ログインユーザーの最高権限で実行(UAC 昇格済み相当) schtasks /Create ^ /TN "AdminTask" ^ /TR "C:\Scripts\admin_work.bat" ^ /SC DAILY ^ /ST 01:00 ^ /RL HIGHEST ^ /F REM パターン2: SYSTEM アカウントで実行(最も強い権限、ログオフ中も実行) REM ※ schtasks /Create に /RU SYSTEM を指定するにはこのコマンド自体を管理者権限で実行する必要あり schtasks /Create ^ /TN "SystemTask" ^ /TR "C:\Scripts\system_work.bat" ^ /SC DAILY ^ /ST 02:00 ^ /RU "SYSTEM" ^ /F
@echo off
setlocal
REM 管理者権限チェック
net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [ERROR] このスクリプトは管理者権限で実行してください
echo 右クリック → 管理者として実行
pause
exit /b 1
)
echo [INFO] 管理者権限確認 OK
schtasks /Create ^
/TN "\MyApp\DailyJob" ^
/TR ""C:\Scripts\daily_job.bat"" ^
/SC DAILY ^
/ST 03:00 ^
/RL HIGHEST ^
/F
if %ERRORLEVEL% equ 0 (
echo [OK] タスク登録完了
) else (
echo [ERROR] タスク登録失敗: ERRORLEVEL=%ERRORLEVEL%
)
endlocal
- /RL HIGHEST: 現在のユーザーの最高権限で実行。UAC 昇格相当。ユーザーがログオフ中は実行されない(ログオンが必要なタスク向け)
- /RU SYSTEM: SYSTEM アカウントで実行。ログオフ中でも実行される。サービスや起動時タスクに最適。ただしネットワークドライブへのアクセスに制限がある
管理者権限でのバッチ実行の詳細は管理者権限で自動実行するバッチの作り方も参照してください。
バッチからタスクを自動登録するデプロイスクリプト
アプリケーションのインストールや CI/CD パイプラインでタスクを自動登録・更新するパターンです。べき等性(何度実行しても同じ結果)を確保するため /F を使います。
@echo off
setlocal
REM ===== 設定 =====
set "SCRIPT_DIR=C:\MyApp\Scripts"
set "LOG_DIR=C:\MyApp\Logs"
set "TASK_FOLDER=\MyApp"
REM ================
REM 管理者権限チェック
net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [ERROR] 管理者権限が必要です & exit /b 1
)
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
echo [%DATE% %TIME%] タスク登録開始 >> "%LOG_DIR%\setup.log"
REM タスク1: 毎日バックアップ
schtasks /Create /TN "%TASK_FOLDER%\DailyBackup" ^
/TR ""%SCRIPT_DIR%\backup.bat"" ^
/SC DAILY /ST 02:00 /RL HIGHEST /F
echo [%ERRORLEVEL%] DailyBackup >> "%LOG_DIR%\setup.log"
REM タスク2: 週次レポート(月曜 9:00)
schtasks /Create /TN "%TASK_FOLDER%\WeeklyReport" ^
/TR ""%SCRIPT_DIR%\report.bat"" ^
/SC WEEKLY /D MON /ST 09:00 /RL HIGHEST /F
echo [%ERRORLEVEL%] WeeklyReport >> "%LOG_DIR%\setup.log"
REM タスク3: 月次クリーンアップ(月末)
schtasks /Create /TN "%TASK_FOLDER%\MonthlyCleanup" ^
/TR ""%SCRIPT_DIR%\cleanup.bat"" ^
/SC MONTHLY /D LAST /ST 03:00 /RL HIGHEST /F
echo [%ERRORLEVEL%] MonthlyCleanup >> "%LOG_DIR%\setup.log"
REM タスク4: 30分ごとのヘルスチェック
schtasks /Create /TN "%TASK_FOLDER%\HealthCheck" ^
/TR ""%SCRIPT_DIR%\healthcheck.bat"" ^
/SC MINUTE /MO 30 /F
echo [%ERRORLEVEL%] HealthCheck >> "%LOG_DIR%\setup.log"
echo [%DATE% %TIME%] タスク登録完了 >> "%LOG_DIR%\setup.log"
echo すべてのタスク登録が完了しました
schtasks /Query /TN "%TASK_FOLDER%"
endlocal
@echo off
setlocal
set "TASK_FOLDER=\MyApp"
net session >nul 2>&1
if %ERRORLEVEL% neq 0 ( echo 管理者権限が必要です & exit /b 1 )
REM フォルダごと削除(配下のタスクをすべて削除)
schtasks /Delete /TN "%TASK_FOLDER%\" /F >nul 2>&1
if %ERRORLEVEL% equ 0 (
echo [OK] タスクフォルダ "%TASK_FOLDER%" を削除しました
) else (
echo [INFO] タスクフォルダが存在しないか、削除済みです
)
endlocal
タスクの実行結果・エラーログを確認する
タスクスケジューラのログはイベントビューアと各タスクの「最終実行結果」で確認できます。バッチ内でリダイレクトして専用ログファイルに出力するのが実運用では一般的です。
@echo off
setlocal
REM ===== タスクスケジューラから呼び出されるバッチの標準構成 =====
set "LOGDIR=C:\logs\tasks"
if not exist "%LOGDIR%" mkdir "%LOGDIR%"
REM 日付別ログファイル
for /f "tokens=1-3 delims=/" %%A in ("%DATE%") do set "LOGDATE=%%A%%B%%C"
set "LOGFILE=%LOGDIR%\daily_backup_%LOGDATE%.log"
REM 標準出力・標準エラーをログへリダイレクト
echo [%DATE% %TIME%] バックアップ開始 >> "%LOGFILE%"
REM --- 処理本体 ---
xcopy "C:\data" "D:\backup\%LOGDATE%\" /s /e /y >> "%LOGFILE%" 2>&1
set RC=%ERRORLEVEL%
if %RC% equ 0 (
echo [%DATE% %TIME%] 完了: ERRORLEVEL=0 >> "%LOGFILE%"
) else (
echo [%DATE% %TIME%] 失敗: ERRORLEVEL=%RC% >> "%LOGFILE%"
exit /b %RC%
)
endlocal
@echo off setlocal set "TASK_FOLDER=\MyApp" echo ========== タスク実行状況レポート ========== echo 確認日時: %DATE% %TIME% echo ============================================ schtasks /Query /TN "%TASK_FOLDER%\" /FO LIST /V 2>nul ^ | findstr /i "タスク名\|TaskName\|Last Run\|Last Result\|Next Run\|Status\|状態" echo ============================================ endlocal
| 結果コード | 意味 |
|---|---|
| 0 (0x0) | 成功 |
| 1 (0x1) | 一般的なエラー |
| 267011 (0x41303) | タスクがまだ実行されていない |
| 267009 (0x41301) | タスク実行中 |
| 2147942401 (0x80070001) | 関数が正しくありません(権限不足が多い) |
バッチ側で exit /b 終了コード を指定するとその値がタスクの結果コードになります。詳しくはエラー時に処理を中断・終了する方法も参照してください。
実践パターン:よく使う定期処理の登録例
REM タスク登録(管理者権限で実行)
schtasks /Create ^
/TN "\MyApp\NightlyBackup" ^
/TR ""C:\Scripts\backup.bat"" ^
/SC DAILY ^
/ST 02:00 ^
/RL HIGHEST ^
/F
REM --- backup.bat の中身 ---
REM @echo off
REM for /f "tokens=1-3 delims=/" %%A in ("%DATE%") do set DT=%%A%%B%%C
REM xcopy "C:\data" "D:\backup\%DT%\" /s /e /y /q >> C:\logs\backup.log 2>&1
REM タスク登録 schtasks /Create ^ /TN "\MyApp\LogCleanup" ^ /TR ""C:\Scripts\log_cleanup.bat"" ^ /SC WEEKLY ^ /D SUN ^ /ST 04:00 ^ /F REM --- log_cleanup.bat の中身 --- REM @echo off REM forfiles /p "C:\logs" /s /m *.log /d -30 /c "cmd /c del @file" REM echo [%DATE%] ログクリーンアップ完了 >> C:\logs\cleanup.log
REM タスク登録(10分ごとのヘルスチェック) schtasks /Create ^ /TN "\MyApp\ProcessWatch" ^ /TR ""C:\Scripts\watch.bat"" ^ /SC MINUTE ^ /MO 10 ^ /RL HIGHEST ^ /F REM --- watch.bat の中身 --- REM @echo off REM tasklist /FI "IMAGENAME eq myapp.exe" 2>nul | findstr /i "myapp.exe" >nul REM if %ERRORLEVEL% neq 0 start "" "C:\apps\myapp.exe"
タスクスケジューラ単独では「月末の金曜日のみ」「平日の業務時間のみ」などの複合条件を表現できません。そのような場合はタスク自体は毎日実行する設定にして、バッチ内で曜日・日付を判定してスキップするロジックを入れる方法が確実です。曜日判定の詳細は曜日を判定して処理を制御する完全ガイドも参照してください。
まとめ
- 登録:
schtasks /Create /TN /TR /SC /ST /F。/Fで冪等な登録を実現 - 頻度指定:
/SC DAILY/WEEKLY/MONTHLY/MINUTE/HOURLY/ONSTART/ONLOGON+/MOで間隔を指定 - 確認:
schtasks /Query /TN /V /FO LISTで次回実行時刻と最終結果を確認 - 変更:
schtasks /Change /TN /ST /TR /ENABLE /DISABLE - 削除:
schtasks /Delete /TN /F。フォルダ名で一括削除も可能 - テスト実行:
schtasks /Run /TNで即時起動して動作確認 - 管理者権限:
/RL HIGHESTまたは/RU SYSTEM - ログ: バッチ内でリダイレクトして日付別ログファイルに記録
関連記事: 曜日を判定して処理を制御する完全ガイド / 管理者権限で自動実行するバッチの作り方 / ログを出力する方法完全ガイド
よくある質問(FAQ)
/RL HIGHEST や /RU SYSTEM を指定する場合はschtasks /Create 自体を管理者権限で実行する必要があります。コマンドプロンプトを「管理者として実行」するか、バッチ冒頭で net session >nul 2>&1 により権限チェックを行ってください。詳しくは管理者権限で自動実行するバッチの作り方も参照してください。pause や入力待ちが発生すると、タスクスケジューラから起動した場合はキー入力を受け付けられず無限待機になります。pause をバッチから削除するか timeout /t 0 に置き換えてください。また start で子プロセスを起動している場合はstart /wait に変更して子プロセスの完了を待つようにしてください。/TR のクォートが正しくない、②バッチ内で相対パスを使っていて作業ディレクトリが違う、③バッチが exit /b 1 で終了している——の3点です。バッチ内ですべてのパスをフルパスで指定し、ログファイルに実行結果を書き出して原因を絞り込んでください。/RU SYSTEM を指定するとユーザーのログオン状態に関係なく実行されます。または GUI のタスクスケジューラで「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れてください。注意点として、SYSTEM アカウントはネットワークドライブ(\\server\share)にアクセスできない場合があります。ネットワーク共有へのアクセスが必要なタスクはネットワーク権限を持つサービスアカウントを /RU に指定してください。schtasks 単体でのエクスポートは直接サポートしていませんが、PowerShell の Export-ScheduledTask で XML 形式にエクスポートできます。インポートは Register-ScheduledTask -Xml またはschtasks /Create /XML タスク.xml /TN タスク名 で行えます。別の PC にタスク設定を展開する場合は XML エクスポート方式が確実です。

