ファイルの存在チェック
ファイルやフォルダの存在確認は、バッチファイルで前提条件を確認するときによく使います。
コピーや削除の前に存在確認を入れておくと、エラーの原因が分かりやすくなります。
結論から言うと、存在確認は if exist "パス" で行い、存在しないことを条件にしたいときは if not exist "パス" を使います。
if exist "C:\work\sample.txt" echo 存在します
if not exist "C:\work\sample.txt" echo 存在しません
基本コマンド
if exist コマンド
コマンドプロンプトにはファイルの存在確認だけを行う専用コマンドはなく、if exist 構文を使って存在確認を行います。
このコマンドは、指定したファイルやフォルダが存在するかどうかをチェックし、存在する場合に特定の処理を実行します。
if exist "パス" (
rem ファイルが存在する場合の処理
)
パスに空白が含まれる可能性があるため、if exist "%file_path%"
のようにダブルクォートで囲むのが安全です。
具体的に、テキストファイルが存在するかどうかを確認する例を見てみましょう。
以下のコードでは、ユーザーのドキュメントフォルダにある sample.txt ファイルが存在するかどうかを確認しています。
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
の間で改行すると構文エラーになります。
フォルダの存在確認とファイルとの見分け方
if exist はファイルだけでなくフォルダの存在確認にも使えます。パスの末尾に \ を付けると、フォルダが存在する場合だけ真になります。
if exist "%USERPROFILE%\Documents\" (
echo Documents フォルダは存在します。
)
反対に、同名のフォルダではなく「ファイルとして存在する」ことを確認したい場合は、フォルダではないことを組み合わせます。
if exist "%file_path%" if not exist "%file_path%\" (
echo ファイルとして存在します。
)
if not exist "出力先\" mkdir "出力先" と書くと、出力先フォルダがない場合だけ作成できます。詳しくは
を参照してください。
ワイルドカードで存在確認する
* や ? を使うと、条件に合うファイルが 1 つでもあるかを確認できます。
if exist "%USERPROFILE%\Documents\*.log" (
echo ログファイルがあります。
)
存在しない場合の処理(if not exist)
「ファイルがなければ処理を中断する」「なければ作成する」といった場合は if not exist を使います。
if not exist "%file_path%" (
type nul > "%file_path%"
)
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 (は同じ行に書く