【bat】エラー時に処理を中断・終了する方法

【bat】エラー時に処理を中断・終了する方法 bat

バッチファイルでは、エラーが発生したにもかかわらず処理がそのまま進み、後続処理でさらに被害が拡大するケースが少なくありません。

この問題の多くは、「エラーを検知していない」のではなく、エラーを検知しても処理を止める設計になっていないことが原因です。

ここでは、バッチファイルでエラー発生時に処理を中断・終了させるための実務的な方法を、ERRORLEVEL の扱いを中心に整理します。

ERRORLEVELを使って即座に中断する基本形

最も基本的な方法は、対象コマンドの直後で ERRORLEVEL を判定し、エラーであれば exit /b で処理を終了させる形です。

重要なのは、判定を必ず直後に行うことです。

@echo off

somecommand
if %ERRORLEVEL% neq 0 (
  echo エラーが発生しました
  exit /b 1
)

echo 次の処理へ進みます

この構成では、somecommand が失敗した時点で以降の処理は実行されません。

if ERRORLEVEL構文で中断する場合

if ERRORLEVEL を使う場合は、「指定値以上」という判定仕様を前提にします。

0/非0 の二択で使うなら、1 以上をエラーとみなす形が分かりやすくなります。

somecommand
if errorlevel 1 (
  echo エラーが発生しました
  exit /b 1
)

この書き方は短く書けますが、複数の終了コードを扱う場合は順序に注意が必要です。

サブルーチン内でエラー時に中断する

call を使って処理を分割している場合、サブルーチン側で exit /b を使って終了コードを返し、呼び出し元で判定します。

サブルーチン内では、必ず exit /b を明示することが重要です。

@echo off

call :work
if %ERRORLEVEL% neq 0 (
  echo work処理でエラー
  exit /b 1
)

echo 全体正常終了
exit /b 0

:work
somecommand
if %ERRORLEVEL% neq 0 exit /b 1
exit /b 0

この構成により、エラー発生箇所で確実に処理を打ち切れます。

処理を中断せずにスクリプト全体を即終了する

バッチファイル全体を即座に終了したい場合は、exit を使います。

exit /b は「現在のバッチやサブルーチンから戻る」動作ですが、exit はコマンドプロンプト自体を終了させる点に注意が必要です。

somecommand
if %ERRORLEVEL% neq 0 (
  echo 致命的エラー
  exit 1
)

対話的なコマンドプロンプト上で実行している場合、ウィンドウが閉じるため、用途を選んで使う必要があります。

パイプ処理では中断条件を分解する

パイプ(|)を使った処理では、ERRORLEVEL は最後のコマンドの結果になります。

前段の失敗で中断したい場合、そのままでは検知できないため、処理を分解して判定します。

type data.txt > nul
if %ERRORLEVEL% neq 0 (
  echo ファイル読み取り失敗
  exit /b 1
)

find "ABC" data.txt > nul
if %ERRORLEVEL% neq 0 (
  echo 検索条件に一致しません
  exit /b 1
)

この形にすると、どこで中断されたのかが明確になります。

括弧ブロック内での中断判定

括弧ブロック内では %ERRORLEVEL% が固定されて見えることがあります。

状態を正しく判定したい場合は、遅延環境変数展開を使います。

@echo off
setlocal enabledelayedexpansion

somecommand
if !ERRORLEVEL! neq 0 (
  echo エラーが発生しました
  exit /b 1
)

ブロック内で中断判定を行う場合は、この形式が安全です。

エラーコードを付けて終了する意味

exit /b の引数で返す数値は、上位のバッチや呼び出し元から参照されます。

エラー理由ごとにコードを分けておくと、後続処理やログ解析がしやすくなります。

if %ERRORLEVEL% neq 0 exit /b 10

このように戻り値を設計することで、バッチ処理全体の可読性と保守性が向上します。

まとめ

バッチファイルでエラー時に処理を中断・終了するには、エラーを検知した瞬間に exit /b で制御を切る設計が基本になります。

ERRORLEVEL は直前のコマンドの結果であることを常に意識し、判定を後回しにしない構成が重要です。

中断条件と戻り値を明示的に設計することで、バッチファイルは「止まらない不安定な処理」から「信頼できる制御フロー」へと変わります。