@echo off setlocal enableextensions enabledelayedexpansion rem 作者:rubble@126.com rem 17:55 2009-4-14 版本:0.4 set dira=%~1 set dirb=%~2 if "%1" == "" ( echo 使用說明:請在命令行參數上指明兩個目錄,或在這里按提示輸入。 echo 命令行參數格式:批處理名 ^<目錄1^> ^<目錄2^> echo. set /p dira=請輸入第一個目錄的名字(可拖放并輸入回車): ) echo. if "%2" == "" ( echo 使用說明:請在命令行參數上指明兩個目錄,或在這里按提示輸入。 echo 命令行參數格式:批處理名 ^<目錄1^> ^<目錄2^> echo. set /p dirb=請輸入第二個目錄的名字(可拖放并輸入回車): )
if "%dira%" == "" exit /b if "%dirb%" == "" exit /b for /F "delims=. tokens=1" %%A in ("%TIME%") do set startTime=%%A for /F "delims=: tokens=1,2,3" %%A in ("%startTime%") do ( set startH=%%A set startM=%%B set startS=%%C )
set TEMPDIR=TEMPMD5/ rd /Q /S %TEMPDIR% 1>NUL 2>NUL md %TEMPDIR% set mdfive=md5v4.txt rem 已處理的文件數 set count=0 rem 文件夾 %dira% 和 %dirb% 里的文件總數 set total_count=0 rem 已處理的臨時文件數 set tmpf_count=0 rem 臨時文件總數,已知有 5 個了。其余的是 md5 值的個數 set tmpf_total_count=5 echo 第 1/2步,正在計算,請稍候…… echo 正在比較 %dira% 和 %dirb% 中的文件的 md5 值 > %mdfive% set list_fn_md=%TEMPDIR%list_fn_md set list_fn_nmd=%TEMPDIR%list_fn_nmd set list_fn_oa=%TEMPDIR%list_fn_oa set list_fn_ob=%TEMPDIR%list_fn_ob set list_all_md=%TEMPDIR%list_all_md
call :COUNTFILES %dira% call :COUNTFILES %dirb%
for /f "delims=" %%a in ('dir /b /a:-d "%dira%/*"') do ( set fn=%%~nxa for /f "tokens=1 delims= " %%A in ('md5sum "%dira%/%%a"') do set mda=%%A set /a count=!count!+1 call :PROGRESS !count! !total_count! if "!mda:~0,1!" == "/" set mda=!mda:~1,1024! rem 以 !mda! 為文件名,記錄 md5 為 !mda! 的文件 call :ADDMDFN "%TEMPDIR%!mda!" "%dira%/!fn!" rem 把 md5 值記錄到文件里,保證不重復 call :ADDMDLIST !mda! if exist "%dirb%/!fn!" ( for /f "tokens=1 delims= " %%A in ('md5sum "%dirb%/!fn!"') do set mdb=%%A set /a count=!count!+1 call :ADDMDFN "%TEMPDIR%!mdb!" "%dirb%/!fn!" call :PROGRESS !count! !total_count! if "!mdb:~0,1!" == "/" set mdb=!mdb:~1,1024! if "!mda!" == "!mdb!" ( rem 記錄文件名相同并且 md5 相同的文件 echo !mda! !mdb! !fn! >> "!list_fn_md!" ) else ( rem 記錄文件名相同但 md5 不相同的文件 echo !mda! !mdb! !fn! >> "!list_fn_nmd!" call :ADDMDLIST !mdb! )