LoginSignup
0
0

More than 1 year has passed since last update.

Windowsでファイルの差異があるかのみを取得する方法

Posted at

はじめに

差異があるファイルのみ処理をするような仕組みを準備したかったので色々調べたところバッチで構築できそうでした。

比較テスト

diff.bat
@echo off
setlocal

set SRC_FILE=test1.dat
set DST_FILE=test2.dat

fc /b %SRC_FILE% %DST_FILE%
if %ERRORLEVEL%==0 (
    echo %SRC_FILE%%DST_FILE% は同じ
) else (
    echo %SRC_FILE%%DST_FILE% は異なる
)

endlocal

比較テストの補足

fcコマンド を使用し比較を行います。

  • 差異がある:%ERRORLEVEL% が 0
  • 差異がない:%ERRORLEVEL% が 1
    となります。

こちらで簡単に比較が可能です。

フォルダの中身を比較

data1とdata2というフォルダの中身を比較して結果を出力してみます。
data1のフォルダをベースに比較を行うためdata2のみに存在するファイルは出力されません。

diff_folder.bat
@echo off
setlocal enabledelayedexpansion

set SRC_FILDER=data1
set DST_FILDER=data2
set LOG_FILE=log.txt

set DIFF_LIST=result_diff.txt
set SAME_LIST=result_same.txt
set NO_EXIST_LIST=result_no_exist.txt

del /q %LOG_FILE%
del /q %DIFF_LIST%
del /q %SAME_LIST%
del /q %NO_EXIST_LIST%

for %%f in (%SRC_FILDER%\*.dat) do (
    echo %%f

    rem 対象のファイルが有る
    if exist %DST_FILDER%\%%~nxf (

        rem ファイル比較
        fc /b %%f %DST_FILDER%\%%~nxf>>%LOG_FILE%
        if !ERRORLEVEL!==1 (

            echo %%~nxf>>%DIFF_LIST%
        ) else (

            echo %%~nxf>>%SAME_LIST%
        )
    ) else (

        rem 存在しない
        echo %%~nxf>>%NO_EXIST_LIST%
    )
)

endlocal

フォルダの中身を比較の補足

全3種類のリストを出力しています。

  • 差異があるファイル:result_diff.txt
  • 同じ内容のファイル:result_same.txt
  • data2に存在しないファイル:result_no_exist.txt

ポイントは遅延環境変数(enabledelayedexpansion)でERRORLEVELを使っているところです。
for文内で値が変更される変数は遅延環境変数でないと正確な値を取得できないためご注意ください。

まとめ

今回はリストにまとめるような形にしましたが引数で情報を渡して特定の情報を取得するような汎用的なbatを作成することも可能です。
ファイル差分の有無のみで良い場合はこちらの手法が有効だと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0