技術とか戦略とか

証券レガシーシステムを8年いじってから転職した普通の文系SEによるブログ。技術のみではなく趣味の戦略考察についても。

fcコマンドの比較結果だけをファイルに吐き出すWindowsバッチ

あるフォルダ内の全ファイルについて、別のフォルダ内のファイルと差異比較し、「別のフォルダ内にファイル無し」「ファイル比較で差異有り」「ファイル比較で差異無し」に判別し、判別結果をログファイルに吐き出す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