【バッチスクリプト】ディレクトリ配下ファイル存在チェック


いつもお世話になっております。
RfromL.comです。

今回はバッチスクリプトで入力ファイルを取り扱う時、入力ファイルが格納されたディレクトリ内にファイルが1個以上存在するかを確認する処理についてです。

CONTENTS

1.はじめに
2.作成スクリプト
 2-1.コード内容
 2-2.コード解説
3.使用方法と実行結果
 3-1.使用方法
 3-2.ファイルが存在しない場合
 3-3.ファイルが存在する場合
4.おわりに


1.はじめに

入力ファイルが固定で1個しかない場合は「exist」で存在確認できますが、特定のディレクトリ配下にある可変で1個以上のファイルを入力ファイルとして取り扱う場合には「exist」でうまく対応できなかったので、比較的簡単に判定する処理を考えてみました。

ファイル存在チェックは基本的に何かの処理を行う前の事前処理になるので、今回はファイルコピーを行う前に、コピー元の入力ファイルが存在するかどうかの判定を行うものとしてバッチスクリプトをつくってみました。

なお、今回のディレクトリ構成は以下となっています。

ディレクトリ構成

上記の「DirFileChk」のディレクトリ構成も含めて今回作成する処理の一部なのでバッチスクリプトは上記の構成、配置になっていることを前提で作成します。


2.作成スクリプト

今回作成したスクリプトのコードと、メイン部分のコード解説です。

2-1.コード内容

用意するスクリプトファイルのコード内容は以下の通りです。

[ DirFileChk.bat ]

@echo off
@rem ------------------------------------------------------------
@rem システム名         : RfromL.com
@rem 処理ID             : HeaderExclusion
@rem 処理名             : 配下ファイル存在確認
@rem 処理内容           : ディレクトリ配下を対象に
@rem                    : ファイルの存在有無を確認。
@rem                    : ①ファイルが存在しない場合
@rem                    :   メッセージを表示して処理終了
@rem                    : ②ファイルが存在した場合
@rem                    :   配下ファイルを全てコピー
@rem                    :
@rem 作成日             : 2022.07.30
@rem 作成者             : S.Takaaze
@rem パラメータ         : なし
@rem 備考               :
@rem *** 修正履歴 ***********************************************
@rem No.  日付        修正者     内容
@rem 001  2022.07.30  S.Takaaze  新規作成
@rem ------------------------------------------------------------
@rem - 初期処理
@rem ------------------------------------------------------------
:STEP000

@rem 実行バッチファイルディレクトリ設定
set CMD_PATH=%~dp0

@rem 処理ID設定(バッチファイル名)
set BATCH_ID=%~n0


@rem ------------------------------------------------------------
@rem - ファイルディレクトリ設定
@rem ------------------------------------------------------------
:STEP010

@rem 入力ファイルディレクトリ
set IDIR=%CMD_PATH%\IN

@rem 出力ファイルディレクトリ
set ODIR=%CMD_PATH%\OUT


@rem ------------------------------------------------------------
@rem - 入力ディレクトリ配下ファイル存在チェック
@rem ------------------------------------------------------------
:STEP020

dir %IDIR% /a:-d /b
if not %errorlevel% == 0 (
  echo   ERRORLEVEL:%errorlevel%
  echo   入力ファイルが格納されていません
  echo   処理をスキップします
  goto END
) else (
  echo   ERRORLEVEL:%errorlevel%
  echo   入力ファイルが存在しました
  echo   ファイルをコピーします
)


@rem ------------------------------------------------------------
@rem - ファイルコピー
@rem ------------------------------------------------------------
:STEP030

@rem 入力ディレクトリ配下のファイルを出力ディレクトリへコピーする
copy /y %IDIR%\* %ODIR%


@rem ------------------------------------------------------------
@rem - 終了処理
@rem ------------------------------------------------------------
:END

pause

exit 0 /b

補足
・コメント部分(「@rem」の行)は不要であれば削除してください。
・「終了処理」部分の「pause」コマンドは、処理結果を確認しやすくするために入れいます。

2-2.コード解説

今回作成したバッチスクリプトの処理は以下の流れで行われます。

①入力ディレクトリ配下ファイル存在チェック
②ファイルコピー

今回はメインの処理部分である「②入力ディレクトリ配下ファイル存在チェック」のコード内容について解説します。

[対象のコード]

dir %IDIR% /a:-d /b
if not %errorlevel% == 0 (
  echo   ERRORLEVEL:%errorlevel%
  echo   入力ファイルが格納されていません
  echo   処理をスキップします
  goto END
) else (
  echo   ERRORLEVEL:%errorlevel%
  echo   入力ファイルが存在しました
  echo   ファイルをコピーします
)


このコードで使用しているコマンド・命令文の括りは以下の2つです。

①dirコマンド
②if文

それぞれ分けて以下に解説します。

①dirコマンド
変数「%IDIR%」に格納された入力ファイルディレクトリに対し、「dir」コマンドを実行します。
実行の際に以下のオプションを指定します。

  • 「/a:-d」オプション
    /a オプションは指定された属性のファイルを表示するオプションです。
    今回の確認対象はファイルであり、ディレクトリ(サブディレクトリ)は対象外なので、D(ディレクトリ)属性を除外する指定「-d」を/aオプションに付与しています。
  • 「/d」オプション
    ファイルIDのみを表示するオプションです。
    dirを実行すると標準では見出しや、要約、更新日時等の情報も表示されます。
    処理に影響はないですが、実行結果の画面が見づらくなるので非表示にしています。


②if文
dirコマンドで実行した結果はコード値として「errorlevel」という変数に格納されるので「errorlevel」の値をif文で判定して処理を分岐させます。
今回の「dir」コマンドを実行した結果の「errorlevel」に格納されるコード値は以下の通りです。

1:ファイルが存在しなかった場合
0:ファイルが1個以上存在した場合

上記のコード値を考慮し、if文で以下判定処理を行います。

「errorlevel」の値が0以外の場合
入力ファイルが存在しないので以降の処理をスキップして、バッチスクリプトを終了します。

「errorlevel」の値が0の場合
入力ファイルが1個以上存在しているので後続の処理(ファイルコピー処理)を続行します。

ここで解説したコマンド、命令文については実際に自身の環境で以下コマンドを実行して、ヘルプを確認してみてください。

  • dir /?
  • if /?

3.使用方法と実行結果

事前準備として、「DirFileChk」ディレクトリは任意の場所にまるごと配置しておきます。
(ディレクトリ構成を崩さず、ディレクトリごとの移動であればどこに配置しても実行できます。)

3-1.使用方法

使用方法の流れは以下の通りです。

①「IN」ディレクトリ配下に入力ファイルが存在有無を確認する。
②実行する前に「OUT」ディレクトリ配下にファイルが存在しないことを確認する。
③「DirFileChk.bat」をダブルクリックして実行する。
④コマンドプロンプト画面上で、メッセージを確認する。
⑤「OUT」ディレクトリ配下のファイル作成有無を確認する


3-2.ファイルが存在しない場合

①「IN」ディレクトリ配下に入力ファイルが存在しないことを確認する。



②実行する前に「OUT」ディレクトリ配下にファイルが存在しないことを確認する。



③「DirFileChk.bat」をダブルクリックして実行する。



④コマンドプロンプト画面上で、メッセージを確認する。
ファイルが存在しない場合は、ファイルが存在しない旨のメッセージが表示されていることを確認します。



⑤「OUT」ディレクトリ配下のファイル作成有無を確認する
処理結果確認として、入力ファイルが存在せず、コピー処理が実行されていないので「OUT」ディレクトリ配下にファイルが作成されていないことを確認します。



「OUT」ディレクトリにファイルがコピーされていないことで、分岐処理が正しく機能していることを確認できました。


3-3.ファイルが存在する場合

①「IN」ディレクトリ配下に入力ファイルが存在することを確認する。



②実行する前に「OUT」ディレクトリ配下にファイルが存在しないことを確認する。



③「DirFileChk.bat」をダブルクリックして実行する。



④コマンドプロンプト画面上で、メッセージを確認する。
ファイルが存在する場合は、ファイルが存在している旨のメッセージが表示されていることを確認します。



⑤「OUT」ディレクトリ配下のファイル作成有無を確認する
処理結果確認として、入力ファイルが存在して、コピー処理が実行されているので「OUT」ディレクトリ配下にファイルが作成されていることを確認します。



「OUT」ディレクトリにファイルがコピーされていることで、分岐処理が正しく機能してコピーが実行されたことを確認できました。


4.おわりに

実現場の本番環境で使うとなるともう少ししっかり作り込んだ方がよさそうですが、個人で使う分には簡単に実現できる今回の方法で良いかなと思います。


ファイル存在有無の確認方法として今回の処理を紹介しましたが、業務システムの場合でちょっと考えてみますと、そもそもファイル存在確認をしないという考え方もあります。

前提としてシステムが正常に稼働しているならファイルは出来ているもの。とするパターンです。
この場合、ファイルが無いならそれは正常に稼働していないから処理をスキップではなく異常終了して処理は止めるという考え方です。

ファイルが無いのに処理自体は終わっていると、異常検知(発見)が遅れてしまう可能性があるので、異常終了させてしまった方がましということですね。

まあ、ファイル存在確認を行って無くてはいけないファイルが配置されていなければ、明示的に異常終了させるロジックを入れるというのが普通とは思いますが。


以上です。
宜しくお願い致します。