あるフォルダ内の全ファイルについて、別のフォルダ内のファイルと差異比較し、「別のフォルダ内にファイル無し」「ファイル比較で差異有り」「ファイル比較で差異無し」に判別し、判別結果をログファイルに吐き出すWindowsバッチです。
実務で使う機会が結構あるので自作しました。
詳しくはソースコードと実行結果を見てください。
【ソースコード】
・compare.bat
@echo off
rem 第1引数に比較元フォルダ、第2匹数に比較先フォルダを指定
set ORIGINALDIR=%1
set TARGETDIR=%2
rem 結果ファイルを空にする
type nul > notexist.log
type nul > unmatch.log
type nul > match.log
rem 比較元フォルダ直下にある全ファイルについて比較
dir /a-d /b %ORIGINALDIR% > tmp.log
for /f %%A in (tmp.log) do (call :method %%A)
del tmp.log
exit
rem 比較先フォルダにファイル無し、ファイル差異有り、ファイル差異無しを判定
:method
set FILE=%1
if not exist %TARGETDIR%\%FILE% (
echo %FILE% >> notexist.log
goto :eof
)
fc %ORIGINALDIR%\%FILE% %TARGETDIR%\%FILE% > nul
if %ERRORLEVEL% == 1 (
echo %FILE% >> unmatch.log
) else (
echo %FILE% >> match.log
)
goto :eof
【実行結果】
■配置したファイル
・C:\tmp\a\a.txt
hoge
・C:\tmp\a\b.txt
hoge
・C:\tmp\a\c.txt
hoge
・C:\tmp\b\a.txt
hoge
・C:\tmp\b\b.txt
fuga
■バッチの実行
・バッチファイルの配置
今回は C:\tmp\ に配置
・実行コマンド
C:\tmp>cd C:\tmp
C:\tmp>cmd /k compare C:\tmp\a\ C:\tmp\b\
C:\tmp>
■実行結果
・C:\tmp\notexist.log (別のフォルダ内にファイル無し)
c.txt
・C:\tmp\unmatch.log (ファイル比較で差異有り)
b.txt
・C:\tmp\match.log (ファイル比較で差異無し)
a.txt