バッチファイルを使用してタスクを自動化する際、一定時間経過後に処理を強制終了させたいケースがあります。例えば、無限ループに陥ったり、バックグラウンドで意図せず残り続けるようなバッチを制御したい場合などです。
本記事では、一定時間後に自動でバッチファイルを終了させる方法を紹介します。
timeoutを使って制限時間経過後に終了する
バッチファイルでは timeout コマンドを使って「待機時間」を設定できます。以下のように start と timeout を組み合わせて、別スレッドでタイマーを実行し、時間経過後に強制終了することが可能です。
@echo off
setlocal
:: 終了までの待ち時間(秒数)
set TIMEOUT_SEC=10
:: 自分自身を終了させる別プロセスを起動
start "" cmd /c "timeout /t %TIMEOUT_SEC% >nul && taskkill /f /pid %~n0"
:: メイン処理(例:ループ)
echo バッチ処理を開始します。
:loop
echo 処理中...
timeout /t 1 >nul
goto loop
注意点と補足
- taskkill /f /pid %~n0 の部分は実際には機能しません。%~n0 はスクリプト名であってプロセスID(PID)ではないため、正確にプロセスを終了させるには自分のPIDを取得する工夫が必要です。
- より確実に「一定時間後に強制終了」させるには、別のバッチファイルを用意してタイマー制御だけを担当させる方法が有効です。
別バッチで監視・終了する方法
メインバッチ main.bat
@echo off
setlocal
:: 自分のプロセスIDを取得
for /f "tokens=2 delims==;" %%a in ('wmic process where "name='cmd.exe' and CommandLine like '%%main.bat%%'" get ProcessId /value ^| find "="') do set PID=%%a
:: タイマーを別バッチで起動
start "" timeout_killer.bat %PID% 10
:: 任意の長い処理
echo メイン処理を開始します...
:loop
echo 処理中...
timeout /t 1 >nul
goto loop
タイマー終了用バッチ timeout_killer.bat
@echo off
set PID=%1
set WAIT=%2
timeout /t %WAIT% >nul
echo 時間切れ。プロセス %PID% を終了します。
taskkill /f /pid %PID%
まとめ
- バッチファイルは標準ではタイマーによる自動終了機能を持ちませんが、timeout + taskkill の組み合わせで実現可能です。
- より安全かつ柔軟に制御したい場合は、監視用バッチを別で作成して自動終了制御を行うとよいでしょう。
バッチ処理を自動化・無人化する際の安全設計として、ぜひ活用してみてください。