ファイルの存在チェック

にメンテナンス済み

ファイルやフォルダの存在確認は、バッチファイルで前提条件を確認するときによく使います。

コピーや削除の前に存在確認を入れておくと、エラーの原因が分かりやすくなります。

結論から言うと、存在確認は if exist "パス" で行い、存在しないことを条件にしたいときは if not exist "パス" を使います。

if exist "C:\work\sample.txt" echo 存在します
if not exist "C:\work\sample.txt" echo 存在しません

基本コマンド

if exist コマンド

コマンドプロンプトにはファイルの存在確認だけを行う専用コマンドはなく、if exist 構文を使って存在確認を行います。

このコマンドは、指定したファイルやフォルダが存在するかどうかをチェックし、存在する場合に特定の処理を実行します。

existオプションの基本的な使い方
if exist "パス" (
  rem ファイルが存在する場合の処理
)
パスはダブルクォートで囲む

パスに空白が含まれる可能性があるため、if exist "%file_path%" のようにダブルクォートで囲むのが安全です。

具体的に、テキストファイルが存在するかどうかを確認する例を見てみましょう。

以下のコードでは、ユーザーのドキュメントフォルダにある sample.txt ファイルが存在するかどうかを確認しています。

existオプションの使用例
set "file_path=%USERPROFILE%\Documents\sample.txt"

if exist "%file_path%" (
    echo ファイルは存在します。
) else (
    echo ファイルは存在しません。
)

また、以下のコードでは、ファイルの存在有無に応じて変数に値を格納する例を示しています。

ファイルの存在有無を変数に格納する
set "file_path=%USERPROFILE%\Documents\sample.txt"

if exist "%file_path%" (
    set file_exist=true
) else (
    set file_exist=false
)

if %file_exist%==true (
    echo ファイルは存在します。
) else (
    echo ファイルは存在しません。
)

一度変数に格納することによって、ファイルの存在有無のチェックと後続する処理を分けて記述することができます。

else は閉じ括弧と同じ行に書く

) else ( は必ず同じ行に書きます。) と else の間で改行すると構文エラーになります。

フォルダの存在確認とファイルとの見分け方

if exist はファイルだけでなくフォルダの存在確認にも使えます。パスの末尾に \ を付けると、フォルダが存在する場合だけ真になります。

フォルダの存在確認
if exist "%USERPROFILE%\Documents\" (
    echo Documents フォルダは存在します。
)

反対に、同名のフォルダではなく「ファイルとして存在する」ことを確認したい場合は、フォルダではないことを組み合わせます。

ファイルであることを確認する
if exist "%file_path%" if not exist "%file_path%\" (
    echo ファイルとして存在します。
)

ワイルドカードで存在確認する

* や ? を使うと、条件に合うファイルが 1 つでもあるかを確認できます。

ログファイルがあるか確認する
if exist "%USERPROFILE%\Documents\*.log" (
    echo ログファイルがあります。
)

存在しない場合の処理(if not exist)

「ファイルがなければ処理を中断する」「なければ作成する」といった場合は if not exist を使います。

存在しなければ新規作成する
if not exist "%file_path%" (
    type nul > "%file_path%"
)
括弧のあるパスを echo するときの注意

C:\Program Files (x86) のようにパスに ) が含まれると、if (...) の括弧内で echo %file_path% と書いたときに構文エラーになることがあります。パスは echo "%file_path%" のように引用符で囲むか、括弧ブロックを使わず if exist ... goto の形で書くと安全です。

実践的な使用例

バッチファイルでの応用

バッチファイルを使用することで、ファイルの存在確認を自動化することができます。 以下は、指定したファイルが存在する場合に特定の処理を実行するバッチファイルの例です。

@echo off
setlocal

set "file_path=%USERPROFILE%\Documents\sample.txt"

if exist "%file_path%" (
    echo "%file_path%" は存在します。
    rem ここに存在する場合の処理を記述
) else (
    echo "%file_path%" は存在しません。
    rem ここに存在しない場合の処理を記述
)

pause
endlocal

@echo offについての詳細は、以下のページを参照してください。

このバッチファイルを実行することで、結果に応じた処理が自動的に実行されます。

バリデーション処理

特定のファイルが存在することを前提とした処理を行う場合、バリデーション処理を行うことが重要です。

以下のコードは、2 つのファイルが存在するかどうかを確認し、いずれも存在する場合に特定の処理を実行する例です。

@echo off
setlocal

set "file1=%USERPROFILE%\Documents\file1.txt"
set "file2=%USERPROFILE%\Documents\file2.txt"

if not exist "%file1%" (
    echo "%file1%" は存在しません。
    exit /b 1
)
if not exist "%file2%" (
    echo "%file2%" は存在しません。
    exit /b 1
)

rem ここにファイルが存在する場合の処理を記述

pause
endlocal

このスクリプトでは、file1 と file2 のどちらかが存在しなければ、メッセージを表示して終了コード 1 で処理を終えます。終了コードの扱いは

で解説しています。

まとめ

  • ファイルやフォルダの存在確認は if exist "パス" で行う
  • 存在しないことを条件にするなら if not exist "パス"
  • パスは空白に備えてダブルクォートで囲む
  • 末尾に \ を付けるとフォルダ限定の確認になる
  • ) else ( は同じ行に書く

関連記事

練習問題

練習問題

ファイルが存在しない場合にメッセージを表示するのはどれでしょうか?

回答がサーバーに送信されることはありません
練習問題

フォルダが存在するかどうかだけを確認したいとき、最も適切な書き方はどれでしょうか?

回答がサーバーに送信されることはありません
#コマンドプロンプト #バッチファイル #条件分岐 #if exist #ファイル操作