はじめに
差異があるファイルのみ処理をするような仕組みを準備したかったので色々調べたところバッチで構築できそうでした。
比較テスト
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を作成することも可能です。
ファイル差分の有無のみで良い場合はこちらの手法が有効だと思います。