【bat】schtasksコマンドでタスクスケジューラを完全制御する完全ガイド|登録・変更・削除・管理者権限・エラーログ・実践パターンまで

【bat】schtasksコマンドでタスクスケジューラを完全制御する完全ガイド|登録・変更・削除・管理者権限・エラーログ・実践パターンまで bat

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 オプションを付けると同名タスクが存在する場合に上書きするため、冪等なデプロイスクリプトに不可欠です。

毎日 2:00 に実行するタスクを登録する(基本形)
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: 既存タスクを上書き(指定しないと同名タスクがある場合エラー)
毎週月曜・水曜・金曜 9:00 に実行するタスクを登録する
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 複数曜日はカンマ区切りで指定する
毎月1日 3:00 に実行するタスクを登録する
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
PC起動時・ログオン時に実行するタスクを登録する
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
N分おき・N時間おきに繰り返し実行するタスクを登録する
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 オプションで冪等(べきとう)なタスク登録を実現する
/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)

既存タスクの実行時刻や実行パスを変更したり、タスクを一時的に無効化/有効化する操作です。

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)

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)

タスクスケジューラのトリガーを待たずに即時実行したい場合に使います。登録直後の動作確認に便利です。

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 の注意点
schtasks /Run はタスクを非同期で起動します。コマンドが返ってもタスクの実行は続いています。完了を待ちたい場合は timeout /t N で適切な待機時間を置いてから/Query で状態を確認してください。タスクが「実行中」のまま /Run を再度実行すると二重起動になります。

管理者権限で実行するタスクを登録する(/RL HIGHEST)

システム系のバッチやサービス操作には管理者権限が必要です。/RL HIGHEST(最高の特権で実行)と/RU SYSTEM(SYSTEM アカウントで実行)の2つのアプローチがあります。

管理者権限タスク登録のパターン(/RL HIGHEST vs /RU SYSTEM)
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
/RU SYSTEM と /RL HIGHEST の使い分け

  • /RL HIGHEST: 現在のユーザーの最高権限で実行。UAC 昇格相当。ユーザーがログオフ中は実行されない(ログオンが必要なタスク向け)
  • /RU SYSTEM: SYSTEM アカウントで実行。ログオフ中でも実行される。サービスや起動時タスクに最適。ただしネットワークドライブへのアクセスに制限がある

管理者権限でのバッチ実行の詳細は管理者権限で自動実行するバッチの作り方も参照してください。

バッチからタスクを自動登録するデプロイスクリプト

アプリケーションのインストールや CI/CD パイプラインでタスクを自動登録・更新するパターンです。べき等性(何度実行しても同じ結果)を確保するため /F を使います。

setup_tasks.bat: アプリの全タスクを一括登録・更新するデプロイスクリプト
@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
teardown_tasks.bat: アプリの全タスクをまとめて削除するアンインストールスクリプト
@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
schtasks /Query で全タスクの最終実行結果をまとめて確認するスクリプト
@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 終了コード を指定するとその値がタスクの結果コードになります。詳しくはエラー時に処理を中断・終了する方法も参照してください。

実践パターン:よく使う定期処理の登録例

バックアップ: 毎日深夜2時に xcopy でバックアップするタスク
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
ログ整理: 30日以上前のログを毎週日曜 4:00 に自動削除するタスク
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
監視: プロセスが落ちていたら再起動するタスクを10分ごとに実行する
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)

Qschtasks /Create を実行するとアクセス拒否されます。
A/RL HIGHEST/RU SYSTEM を指定する場合はschtasks /Create 自体を管理者権限で実行する必要があります。コマンドプロンプトを「管理者として実行」するか、バッチ冒頭で net session >nul 2>&1 により権限チェックを行ってください。詳しくは管理者権限で自動実行するバッチの作り方も参照してください。
Qタスクが「実行中」ステータスのままで完了しません。
Aバッチ内で pause や入力待ちが発生すると、タスクスケジューラから起動した場合はキー入力を受け付けられず無限待機になります。pause をバッチから削除するか timeout /t 0 に置き換えてください。また start で子プロセスを起動している場合はstart /wait に変更して子プロセスの完了を待つようにしてください。
Qタスクの実行結果が常に 0x1 (エラー)になります。
A原因の多くは①バッチファイルのパスに空白があって /TR のクォートが正しくない、②バッチ内で相対パスを使っていて作業ディレクトリが違う、③バッチが exit /b 1 で終了している——の3点です。バッチ内ですべてのパスをフルパスで指定し、ログファイルに実行結果を書き出して原因を絞り込んでください。
Qユーザーがログオフ中でもタスクを実行したいです。
A/RU SYSTEM を指定するとユーザーのログオン状態に関係なく実行されます。または GUI のタスクスケジューラで「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れてください。注意点として、SYSTEM アカウントはネットワークドライブ(\\server\share)にアクセスできない場合があります。ネットワーク共有へのアクセスが必要なタスクはネットワーク権限を持つサービスアカウントを /RU に指定してください。
Qschtasks でタスクをエクスポート・インポートできますか?
Aschtasks 単体でのエクスポートは直接サポートしていませんが、PowerShell の Export-ScheduledTask で XML 形式にエクスポートできます。インポートは Register-ScheduledTask -Xml またはschtasks /Create /XML タスク.xml /TN タスク名 で行えます。別の PC にタスク設定を展開する場合は XML エクスポート方式が確実です。