【bat】IF EXISTでファイル・フォルダの存在確認をする方法

【bat】バッチファイルでファイルの存在を確認する方法 bat

バッチファイルでファイルを操作する前に「そのファイルが存在するか確認したい」「フォルダがなければ作りたい」といった場面は頻繁にあります。IF EXIST はバッチファイルでファイル・フォルダの存在を確認する最もシンプルな方法で、実務バッチの基本構文のひとつです。

この記事では IF EXIST の基本から、IF NOT EXIST・ネスト・スペースを含むパスの注意点・よく使う実務パターンまでを体系的に解説します。

この記事で学べること

  • IF EXIST の基本構文とファイル・フォルダ両方の確認方法
  • IF NOT EXIST で存在しない場合の処理を書く方法
  • スペースを含むパスでのダブルクォート対応
  • IF EXIST と ELSE を組み合わせた条件分岐パターン
  • フォルダ自動作成・ファイル上書き防止などの実務テンプレート集
スポンサーリンク

IF EXIST の基本構文

構文
:: ファイルまたはフォルダが存在するとき実行
IF EXIST パス コマンド

:: 複数行のコマンドをまとめる場合はブロック()で囲む
IF EXIST パス (
    コマンド1
    コマンド2
)

:: 存在しないとき実行(NOT)
IF NOT EXIST パス コマンド

ファイルの存在確認

check_file.bat
@echo off
chcp 932 >nul

IF EXIST C:workdata.txt (
    echo ファイルが存在します
) ELSE (
    echo ファイルが存在しません
)
pause

フォルダの存在確認

フォルダを確認するときは、パスの末尾に (バックスラッシュ)または NUL を付けます。これを付けないと、同名のファイルを誤検知する場合があります。

check_dir.bat
@echo off
chcp 932 >nul

:: 末尾に  を付けてフォルダのみを確認する(推奨)
IF EXIST C:workackup (
    echo フォルダが存在します
) ELSE (
    echo フォルダが存在しません
)

:: NUL デバイスを使う方法(より確実)
IF EXIST "C:workackupNUL" (
    echo フォルダが存在します
)
pause
確認対象 書き方 備考
ファイル IF EXIST C:workdata.txt そのままパスを指定
フォルダ(推奨) IF EXIST C:workackup 末尾に を付ける
フォルダ(より確実) IF EXIST “C:workackupNUL” NUL でフォルダのみを検出
ワイルドカード IF EXIST C:work*.txt 1つでも一致すれば真

IF NOT EXIST:存在しない場合に処理する

IF NOT EXIST はファイル・フォルダが存在しないときに処理を実行します。「なければ作る」「なければエラーで終了する」といった処理に使います。

if_not_exist.bat
@echo off
chcp 932 >nul

:: 設定ファイルが存在しない場合はエラー終了
IF NOT EXIST config.ini (
    echo エラー: config.ini が見つかりません
    exit /B 1
)

:: 出力フォルダが存在しない場合は自動作成
IF NOT EXIST C:workoutput (
    mkdir C:workoutput
    echo output フォルダを作成しました
)

echo 処理を開始します
pause

スペースを含むパスはダブルクォートで囲む

C:Program Files のようにパスにスペースが含まれる場合、ダブルクォートで囲まないとエラーになります。これはよくあるハマりポイントです。

space_in_path.bat
@echo off
chcp 932 >nul

:: ❌ スペースがあるとエラー("Files" 以降が別の引数扱い)
IF EXIST C:Program Filesapp.exe echo NG

:: ✅ ダブルクォートで囲む
IF EXIST "C:Program Filesapp.exe" (
    echo アプリが存在します
)

:: ✅ 変数を使う場合もダブルクォートで囲む
set TARGET=C:Program Filesapp.exe
IF EXIST "%TARGET%" (
    echo 存在します
)
pause

ポイント:パスにスペースが入る可能性がある場合は常にダブルクォートで囲む習慣をつけましょう。スペースのないパスでもダブルクォートを付けて問題ありません。

ELSE との組み合わせ

IF EXIST ... ELSE ... で存在する場合・しない場合で処理を分岐できます。ELSE は必ず ) と同じ行に書く必要があります。

if_else.bat
@echo off
chcp 932 >nul

IF EXIST "C:workinput.csv" (
    echo input.csv を処理します
    :: ここに処理を書く
) ELSE (
    echo エラー: input.csv が見つかりません
    exit /B 1
)
pause

注意:ELSE) と別行に書くと構文エラーになります。必ず ) ELSE ( のように同じ行に記述してください。

ELSE の正しい書き方・間違った書き方
:: ✅ 正しい書き方
IF EXIST file.txt (
    echo 存在する
) ELSE (
    echo 存在しない
)

:: ❌ 間違い(ELSE を別行に書くとエラー)
IF EXIST file.txt (
    echo 存在する
)
ELSE (        ← エラー
    echo 存在しない
)

実務パターン集

パターン1:フォルダがなければ自動作成する

auto_mkdir.bat
@echo off
chcp 932 >nul

set OUTPUT=C:workoutput

IF NOT EXIST "%OUTPUT%" (
    mkdir "%OUTPUT%"
    echo フォルダを作成: %OUTPUT%
)

echo 処理を開始します
pause

パターン2:ファイルの上書き防止(既存ファイルをリネームして退避)

backup_before_overwrite.bat
@echo off
chcp 932 >nul

set TARGET=C:work
esult.csv
set TS=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
set TS=%TS: =0%

:: 既存ファイルがあればタイムスタンプ付きでリネームして退避
IF EXIST "%TARGET%" (
    ren "%TARGET%" "result_%TS%.csv"
    echo 既存ファイルを退避しました: result_%TS%.csv
)

:: 新しいファイルを生成する処理
echo 新しいデータ > "%TARGET%"
echo result.csv を更新しました
pause

パターン3:必須ファイルの存在チェックをまとめて行う

check_prerequisites.bat
@echo off
chcp 932 >nul

set ERROR=0

IF NOT EXIST "config.ini"    ( echo 不足: config.ini    & set ERROR=1 )
IF NOT EXIST "input.csv"     ( echo 不足: input.csv     & set ERROR=1 )
IF NOT EXIST "template.xlsx" ( echo 不足: template.xlsx & set ERROR=1 )

IF %ERROR%==1 (
    echo 必須ファイルが不足しています。処理を中止します。
    exit /B 1
)

echo 全ファイル確認OK。処理を開始します。
pause

パターン4:ロックファイルによる二重起動防止

single_instance.bat
@echo off
chcp 932 >nul

set LOCK=%~dp0running.lock

:: ロックファイルが存在すれば既に起動中
IF EXIST "%LOCK%" (
    echo 既に実行中です。終了します。
    exit /B 1
)

:: ロックファイルを作成して処理開始
echo running > "%LOCK%"

:: ---- メイン処理 ----
echo 処理中...
ping -n 3 127.0.0.1 >nul

:: 処理完了後にロックファイルを削除
del "%LOCK%"
echo 完了しました。
pause

パターン5:ワイルドカードで特定パターンのファイルを確認

wildcard_check.bat
@echo off
chcp 932 >nul

:: *.csv が1つでも存在するか確認
IF EXIST "C:work*.csv" (
    echo CSVファイルが見つかりました
) ELSE (
    echo CSVファイルがありません
)

:: 今日の日付のログファイルが存在するか確認
set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
IF EXIST "C:logslog_%TODAY%*.txt" (
    echo 本日のログが存在します
)
pause

よくある失敗例と対処法

症状 原因 対処法
スペース入りのパスで構文エラー ダブルクォートなし "パス" でダブルクォートを付ける
フォルダなのにファイルを誤検知する 末尾の を付けていない IF EXIST "フォルダ" または "NUL" を使う
ELSE で構文エラーになる ELSE) と別行に書いている ) ELSE ( を同じ行に書く
変数パスでIF EXISTが効かない 変数にスペースが含まれていてクォートなし IF EXIST "%変数%" と常にクォートで囲む
ワイルドカードで意図しないファイルを検知 別パターンのファイルが存在した パターンをより具体的にする or FORと組み合わせる

まとめ

用途 書き方
ファイルの存在確認 IF EXIST “ファイルパス” ( 処理 )
フォルダの存在確認 IF EXIST “フォルダパス” ( 処理 )
存在しない場合の処理 IF NOT EXIST “パス” ( 処理 )
存在する/しないで分岐 IF EXIST “パス” ( 処理A ) ELSE ( 処理B )
フォルダがなければ作成 IF NOT EXIST “フォルダ” mkdir “フォルダ”

ポイント:パスは常にダブルクォートで囲む、フォルダ確認は末尾に を付ける、ELSE は同じ行に書く。この3つを守れば IF EXIST のトラブルの大半を防げます。

よくある質問

❓ IF EXIST でファイルサイズが0バイトかどうかも判定できますか? (クリックで開閉)

IF EXIST は存在確認のみで、サイズの判定はできません。サイズが0バイトのファイルも「存在する」と判定されます。0バイト判定には FOR 文の修飾子 %%~zf(ファイルサイズ取得)を組み合わせる方法があります。

FOR %%f IN ("C:workdata.txt") DO (
    IF %%~zf==0 ( echo 空ファイルです ) ELSE ( echo 内容があります )
)
❓ ネットワークドライブのファイル存在確認も IF EXIST でできますか? (クリックで開閉)

できます。IF EXIST "\\server\share\file.txt" のようにUNCパスをそのまま使えます。ただしネットワーク接続が切れている場合はタイムアウトに時間がかかることがあります。事前に net use で接続確認するか、タイムアウト時間を考慮した設計を推奨します。

❓ IF EXIST と IF ERRORLEVEL はどちらを使うべきですか? (クリックで開閉)

用途が異なります。IF EXIST はファイル・フォルダの存在確認専用です。IF ERRORLEVEL は直前のコマンドの終了コード(成功/失敗)を判定するものです。ファイルの存在確認には必ず IF EXIST を使ってください。