批处理方式实现的目录比较工具

2019-01-30 08:35:39于海丽

) else (
rem 记录只在 %dira% 中出现的文件
echo !mda! !fn! >> "!list_fn_oa!"
)
)
for /f "delims=" %%a in ('dir /b /a:-d "%dirb%*"') do (
set fn=%%~nxa
if not exist "%dira%!fn!" (
for /f "tokens=1 delims= " %%A in ('md5sum "%dirb%%%a"') do set mdb=%%A
if "!mdb:~0,1!" == "" set mdb=!mdb:~1,1024!
rem 记录只在 %dirb% 中出现的文件
echo !mdb! !fn! >> "!list_fn_ob!"
rem 把 md5 值记录到文件里,保证不重复
call :ADDMDLIST !mdb!
call :ADDMDFN "%TEMPDIR%!mdb!" "%dirb%!fn!"
set /a count=!count!+1
call :PROGRESS !count! !total_count!
)
)
echo 第 2/2步,正在统计,请稍候……
echo 统计:>>%mdfive%
echo 左:%dira% >> %mdfive%
echo 右:%dirb% >> %mdfive%
if not exist "%list_fn_md%" set /a tmpf_total_count-=1
if not exist "%list_fn_nmd%" set /a tmpf_total_count-=1
if not exist "%list_fn_oa%" set /a tmpf_total_count-=1
if not exist "%list_fn_ob%" set /a tmpf_total_count-=1
if not exist "%list_all_md%" set /a tmpf_total_count-=1
echo 两个目录中都存在且 md5 相同的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_md%"
echo ===============================================================================================>> %mdfive%
echo 左:%dira% >> %mdfive%
echo 右:%dirb% >> %mdfive%
echo 两个目录中都存在但 md5 不相同的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_nmd%"
echo ===============================================================================================>> %mdfive%
echo 只在目录 %dira% 中存在的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_oa%"
echo ===============================================================================================>> %mdfive%
echo 只在目录 %dirb% 中存在的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_ob%"
echo ===============================================================================================>> %mdfive%
echo 以 md5 汇总的文件列表:>> %mdfive%
call :OUTPUTLIST_MD "%list_all_md%"

goto ALLDONE

rem 统计文件夹里的文件数目,放到全局变量 total_count 里
:COUNTFILES
if %1=="" goto :EOF
for /f %%a in ('dir /b /a:-d "%~1*"') do (
set /a total_count=!total_count!+1
)
goto :EOF

rem 参数 %1 必须加双引号
:OUTPUTLIST
if %1 == "" goto :EOF
if not exist %1 goto :EOF
set tcnt=0
for /f "tokens=1* delims= " %%a in (%~1) do (
echo %%a %%b >> %mdfive%
set /a tcnt+=1
)
echo !tcnt! >> %mdfive%
set /a tmpf_count+=1
call :PROGRESS !tmpf_count! !tmpf_total_count!
goto :EOF

rem 参数 %1 必须加双引号
:OUTPUTLIST_MD
if %1 == "" goto :EOF
if not exist %1 goto :EOF

set /a tmpf_count+=1
call :PROGRESS !tmpf_count! !tmpf_total_count!

set md_count=0
for /f "tokens=1* delims= " %%a in (%~1) do (
echo %%a >> %mdfive%
set tcnt=0
for /f "tokens=1* delims= " %%A in (!TEMPDIR!%%a) do (
echo %%A %%B >> %mdfive%
set /a tcnt+=1
)
相关文章 大家在看