@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! )