您的位置:首页 > 其它

目录比较的小工具myfc

2008-08-26 10:28 162 查看
因为工作需要,对遗留项目进行规范化整理,面对多个不同版本的程序,如何整理出一个完整的有效的代码?目前的工具比如ultra compare或者号称最好用的beyond compare,具有的只是目录比较和文件比较功能,其中目录比较只是简单比较文件的属性差异,不会比较目录中各个文件的差异,所以用了几天时间,修改完善了我自己的myfc,一个纯批处理文件,具有的功能如下:

1.比较两个目录的差异,支持目录的递归比较,判断标准是文件内容是否相同。
2.生成标准化的结果报告

小技巧:
1.如果加入-d参数,则会把所有的比较结果按照目录为单位输出到一个文件中。
2.对于*-diff.txt文件,可以用查找替换,把它变成一个bat文件,可以对有差异的文件用更高级的比较器进行比较。我经常会把diff.txt中的diff替换成call bc /w ,把 . 替换成rem,然后另存为bat格式。如果大家有要求,我考虑把它变成一个标准的输出格式

目前尚未实现的功能:
1. 除了文本之外的其他输出格式支持,比如xml或html的输出格式

下载代码如下:

@echo off
2rem ============================================================================
3rem 本程序负责比较两个目录中的所有文件是否一致,并且按照一定的顺序把比较结果输出
4rem 到文件中。程序的行为包括如下几个方面:
5rem 1)遍历:仅仅当前目录还是需要遍历整个目录,用/s参数控制,附加的精细控制参数
6rem 还包括/f和/x参数
7rem 2)比较:单向比较还是双向比较,用/d参数控制。双向比较可以得到src-dir中缺失的
8rem 所有文件列表,单向比较仅可以得到部分缺失的文件列表。
9rem 2)显示:结果的显示包括原始格式输出、经过分类的输出。分类的输出有可以分输出
10rem 到不同文件和同一文件。原始格式输出到*-all文件中,相同文件输出到*-same文件,
11rem 不同文件输出到*-diff中,多余文件输出到*-redu,缺失文件输出到*-lost中。参数
12rem /d控制把*-redu,*-lost,*-same,*-diff合并成一个输出*-dir文件。参数/q关闭控制
13rem 台内容显示。
14rem ============================================================================
15
16rem 关闭cmd的扩展开关,保证生成临时bat的时候不出异常
17set TSTEXT=a
18if "!TSTEXT!"=="a" cmd.exe /V:OFF /C %0 %* & exit /b
19set TSTEXT=
20
21rem 保存当前工作目录
22set PWD=%CD%
23rem 如果第一个参数是DEBUG,表明打开调试选项
24rem 需要设DEBUG变量,剩余命令行放在CMDLINE变量中
25set DEBUG=
26set CMDLINE0=%*
27if #%1# == #DEBUG# set DEBUG=on
28if #%1# == #debug# set DEBUG=on
29if #%DEBUG%# == #on# set CMDLINE=%CMDLINE0:~5%
30if NOT #%DEBUG%# == #on# set CMDLINE=%CMDLINE0%
31set CMDLINE0=
32if #%DEBUG%# == #on# shift
33@if #%DEBUG%# == #on# @echo on
34
35rem 是否显示帮助
36if "%1" == "" goto help
37if "%1" == "/?" goto help
38if "%1" == "-?" goto help
39if "%1" == "?" goto help
40for %%a in (help HELP /help /HELP -help -HELP --help --HELP h H /h /H -h -H --h --H ) do if "%1" == "%%a" goto help
41
42rem 开始参数识别和检测
43set DIR1=
44set DIR2=
45
46set O_SUB=
47set O_PAT=*.*
48set O_EXC=
49set O_DIR=
50set O_QUITE=
51set O_SUP=
52set O_PRE=fc-o
53set O_OVER=
54set O_POST=txt
55set O_CMDL=/n+/w
56set O_MODI=
57set O_VIEW=
58if "%EDITOR%"=="" (set P_EDTR=notepad.exe) else (set P_EDTR=%EDITOR%)
59
60:opt_an
61for %%a in ( /s -s /S -S ) do if "%1" == "%%a" set O_SUB=y&& goto opt_nx
62for %%a in ( /f -f /F -F ) do if "%1" == "%%a" goto opt_pat
63for %%a in ( /x -x /X -X ) do if "%1" == "%%a" goto opt_exc
64for %%a in ( /d -d /D -D ) do if "%1" == "%%a" set O_DIR=y&& goto opt_nx
65for %%a in ( /q -q /Q -Q ) do if "%1" == "%%a" set O_QUITE=y&& goto opt_nx
66for %%a in ( /u -u /U -U ) do if "%1" == "%%a" set O_SUP=y&& goto opt_nx
67for %%a in ( /p -p /P -P ) do if "%1" == "%%a" goto opt_pre
68for %%a in ( /o -o /O -O ) do if "%1" == "%%a" set O_OVER=y&& goto opt_nx
69for %%a in ( /t -t /T -T ) do if "%1" == "%%a" set O_POST=htm&& goto opt_nx
70for %%a in ( /c -c /C -C ) do if "%1" == "%%a" goto opt_cmd
71for %%a in ( /m -m /M -M ) do if "%1" == "%%a" set O_MODI=y&& goto opt_nx
72for %%a in ( /v -v /V -V ) do if "%1" == "%%a" set O_VIEW=y&& goto opt_nx
73if "%DIR1%" == "" (for /d %%v in (%1) do set DIR1=%%~fv&&set DIR1S=%%~fsv) else (for /d %%v in (%1) do set DIR2=%%~fv&&set DIR2S=%%~fsv)
74goto opt_nx
75:opt_pat
76 shift
77 set O_PAT=%1
78goto opt_nx
79:opt_exc
80 shift
81 set O_EXC=%1
82goto opt_nx
83:opt_cmd
84 shift
85 set O_CMDL=%1
86goto opt_nx
87:opt_pre
88 shift
89 set O_PRE=%1
90:opt_nx
91shift
92if not "%1" == "" goto opt_an
93
94if "%DIR1%" == "" goto help
95if "%DIR2%" == "" goto help
96goto start
97
98:help
99echo -----======================================================================-----
echo usage: %~nx0 [/s] [/f pattern] [/x pattern] [/o] [/p prefix] src-dir dest-dir
echo /s 包含子目录中的文件
echo /f pattern 需要匹配的文件,多个必须用"+"号分隔,如 *.t*+b??.bat+a*.doc
echo /x pattern 排除的文件后缀名,多个必须用"+"号分隔,如 bak+tmp
echo /d 显示以目录为单位,并进行目录双向比较
echo /q 关闭控制台内容显示
echo /u 抑制不必要的输出(较慢)
echo /p prefix 输出文件名的前缀
echo /o 覆盖原有输出文件
echo /t 输出html格式的结果文件格式
echo /c param 传递给FC的参数,多个必须用"+"号分隔,比如/C+/N+/W
echo /m 脚本生成完毕,运行之前允许用%%EDITOR%%进行修改,默认notepad
echo /v 运行完毕之后自动打开结果文件
echo src-dir 用作比较的基准目录
echo dest-dir 用于比较的目录
goto end

:start
if not #%O_OVER%# == #y# goto app
if exist %PWD%\%O_PRE%-diff.%O_POST% del /f /q %PWD%\%O_PRE%-diff.%O_POST%
if exist %PWD%\%O_PRE%-same.%O_POST% del /f /q %PWD%\%O_PRE%-same.%O_POST%
if exist %PWD%\%O_PRE%-lost.%O_POST% del /f /q %PWD%\%O_PRE%-lost.%O_POST%
if exist %PWD%\%O_PRE%-redu.%O_POST% del /f /q %PWD%\%O_PRE%-redu.%O_POST%
if exist %PWD%\%O_PRE%-all.%O_POST% del /f /q %PWD%\%O_PRE%-all.%O_POST%
if exist %PWD%\%O_PRE%-dir.%O_POST% del /f /q %PWD%\%O_PRE%-dir.%O_POST%
:app
echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-diff.%O_POST%
echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-same.%O_POST%
echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-lost.%O_POST%
echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-redu.%O_POST%
echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-all.%O_POST%
echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-dir.%O_POST%

set RND=%TIME::=.%-%RANDOM%
set TEMP_BAT="%TEMP%\myfc-%RND%.bat"
rem ==========开始生成临时脚本==========
echo @echo off> %TEMP_BAT%
echo rem 本文件由myfc.bat自动生成>> %TEMP_BAT%
echo set SRC=%DIR1%>> %TEMP_BAT%
echo set DEST=%DIR2%>> %TEMP_BAT%

echo set B_OALL="%PWD%\%O_PRE%-all.%O_POST%">> %TEMP_BAT%
echo set B_ODIR="%PWD%\%O_PRE%-dir.%O_POST%">> %TEMP_BAT%
echo set B_ODIFF="%PWD%\%O_PRE%-diff.%O_POST%">> %TEMP_BAT%
echo set B_OSAME="%PWD%\%O_PRE%-same.%O_POST%">> %TEMP_BAT%
echo set B_OREDU="%PWD%\%O_PRE%-redu.%O_POST%">> %TEMP_BAT%
echo set B_OLOST="%PWD%\%O_PRE%-lost.%O_POST%">> %TEMP_BAT%

echo set B_TDIFF="%TEMP%\t%RND%-diff.txt">> %TEMP_BAT%
echo set B_TSAME="%TEMP%\t%RND%-same.txt">> %TEMP_BAT%
echo set B_TREDU="%TEMP%\t%RND%-redu.txt">> %TEMP_BAT%
echo set B_TLOST="%TEMP%\t%RND%-lost.txt">> %TEMP_BAT%

echo pushd %%SRC%%>> %TEMP_BAT%
echo call:walk_dir "%%SRC%%\">> %TEMP_BAT%
if "%O_SUB%" == "y" (set T_SUB=/r %%SRC%%) else (set T_SUB=)
echo for /d %T_SUB% %%%%v in (*.*) do call:walk_dir "%%%%~fv">> %TEMP_BAT%
set T_SUB=
echo popd>> %TEMP_BAT%
echo cd %PWD%>> %TEMP_BAT%
echo goto :EOF>> %TEMP_BAT%

echo :walk_dir>> %TEMP_BAT%
if not "%O_QUITE%" == "" goto skip_q1
echo echo %%1>> %TEMP_BAT%
:skip_q1
echo pushd %%1>> %TEMP_BAT%

echo if exist %%B_TSAME%% del /q /f %%B_TSAME%% ^> nul>> %TEMP_BAT%
echo if exist %%B_TDIFF%% del /q /f %%B_TDIFF%% ^> nul>> %TEMP_BAT%
echo if exist %%B_TREDU%% del /q /f %%B_TREDU%% ^> nul>> %TEMP_BAT%
echo if exist %%B_TLOST%% del /q /f %%B_TLOST%% ^> nul>> %TEMP_BAT%

echo for %%%%F in (%O_PAT:+= %) do ( >> %TEMP_BAT%
if not "%O_QUITE%" == "" goto skip_q2
echo echo %%%%F>> %TEMP_BAT%
:skip_q2
echo set B_EX=>> %TEMP_BAT%
if "%O_EXC%" == "" goto skip_e1
echo for %%%%e in (%O_EXC:+= %) do if "!B_EX!"=="" if ".%%%%e" == "%%%%~xF" set B_EX=y>> %TEMP_BAT%
:skip_e1
echo if "!B_EX!" == "" ( >> %TEMP_BAT%
echo set B_FN=%%%%~fF>> %TEMP_BAT%
echo set B_DFN=!B_FN:%DIR1%\=%DIR2%\!>> %TEMP_BAT%
echo call:out fc %O_CMDL:+= % !B_FN! !B_DFN! ^>^> %%B_OALL%%>> %TEMP_BAT%
echo if exist "!B_DFN!" ( >> %TEMP_BAT%
echo call:out %%%%~tF %%%%~zF %%%%~fF ^>^> %%B_OALL%%>> %TEMP_BAT%
echo for %%%%n in ("!B_DFN!") do ( >> %TEMP_BAT%
echo call:out %%%%~tn %%%%~zn %%%%~fn ^>^> %%B_OALL%%>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo fc %O_CMDL:+= % "!B_FN!" "!B_DFN!" ^>^> %%B_OALL%%>> %TEMP_BAT%
echo if #!errorlevel!# == #1# ( >> %TEMP_BAT%
echo call:out diff "!B_FN!" "!B_DFN!" ^>^> %%B_TDIFF%%>> %TEMP_BAT%
echo call:out . %%%%~tF %%%%~zF %%%%~fF ^>^> %%B_TDIFF%%>> %TEMP_BAT%
echo for %%%%n in ("!B_DFN!") do ( >> %TEMP_BAT%
echo call:out . %%%%~tn %%%%~zn %%%%~fn ^>^> %%B_TDIFF%%>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo if #!errorlevel!# == #0# ( >> %TEMP_BAT%
echo call:out same !B_FN! !B_DFN! ^>^> %%B_TSAME%%>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo ) else ( >> %TEMP_BAT%
echo call:out lost !B_DFN! ^>^> %%B_OALL%%>> %TEMP_BAT%
echo call:out lost !B_DFN! ^>^> %%B_TLOST%%>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo popd>> %TEMP_BAT%

if not "%O_DIR%" == "y" goto skip_d1
echo set B_SDIR=%%1>> %TEMP_BAT%
echo set B_DDIR=!B_SDIR:%DIR1%\=%DIR2%\!>> %TEMP_BAT%
echo if not exist %%B_DDIR%% goto no_redu>> %TEMP_BAT%
echo pushd %%B_DDIR%%>> %TEMP_BAT%
echo for %%%%F in (%O_PAT:+= %) do ( >> %TEMP_BAT%
echo set B_EX=>> %TEMP_BAT%
if "%O_EXC%" == "" goto skip_e2
echo for %%%%e in (%O_EXC:+= %) do if "!B_EX!"=="" if ".%%%%e" == "%%%%~xF" set B_EX=y>> %TEMP_BAT%
:skip_e2
echo if "!B_EX!" == "" ( >> %TEMP_BAT%
echo set B_1=%%%%~fF>> %TEMP_BAT%
echo set B_2=!B_1:%DIR2%\=%DIR1%\!>> %TEMP_BAT%
echo if not exist "!B_2!" ( >> %TEMP_BAT%
echo call:out redundant "%%%%~fF" ^>^> %%B_TREDU%%>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo for /d %%%%F in (*.*) do (>> %TEMP_BAT%
echo set B_1=%%%%~fF>> %TEMP_BAT%
echo set B_2=!B_1:%DIR2%\=%DIR1%\!>> %TEMP_BAT%
echo if not exist "!B_2!" call:fnList "%%%%~fF">> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo popd>> %TEMP_BAT%
echo goto no_redu>> %TEMP_BAT%
echo :fnList>> %TEMP_BAT%
echo for /r %%1 %%%%G in (%O_PAT:+= %) do ( >> %TEMP_BAT%
echo set B_EX=>> %TEMP_BAT%
if "%O_EXC%" == "" goto skip_e3
echo for %%%%e in (%O_EXC:+= %) do if "!B_EX!"=="" if ".%%%%e" == "%%%%~xG" set B_EX=y>> %TEMP_BAT%
:skip_e3
echo if "!B_EX!" == "" ( >> %TEMP_BAT%
echo call:out redundant "%%%%~fG" ^>^> %%B_TREDU%%>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo )>> %TEMP_BAT%
echo goto :EOF>> %TEMP_BAT%
echo :no_redu>> %TEMP_BAT%
:skip_d1

echo echo %%1 ^>^> %%B_ODIR%%>> %TEMP_BAT%

echo if exist %%B_TSAME%% type %%B_TSAME%% ^>^> %%B_OSAME%%>> %TEMP_BAT%
echo if exist %%B_TDIFF%% type %%B_TDIFF%% ^>^> %%B_ODIFF%%>> %TEMP_BAT%
echo if exist %%B_TREDU%% type %%B_TREDU%% ^>^> %%B_OREDU%%>> %TEMP_BAT%
echo if exist %%B_TLOST%% type %%B_TLOST%% ^>^> %%B_OLOST%%>> %TEMP_BAT%

echo if exist %%B_TSAME%% type %%B_TSAME%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
echo if exist %%B_TDIFF%% type %%B_TDIFF%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
echo if exist %%B_TREDU%% type %%B_TREDU%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
echo if exist %%B_TLOST%% type %%B_TLOST%% ^>^> %%B_ODIR%%>> %TEMP_BAT%

echo if exist %%B_TSAME%% del /q /f %%B_TSAME%% ^> nul>> %TEMP_BAT%
echo if exist %%B_TDIFF%% del /q /f %%B_TDIFF%% ^> nul>> %TEMP_BAT%
echo if exist %%B_TREDU%% del /q /f %%B_TREDU%% ^> nul>> %TEMP_BAT%
echo if exist %%B_TLOST%% del /q /f %%B_TLOST%% ^> nul>> %TEMP_BAT%

echo goto end>> %TEMP_BAT%
echo :out>> %TEMP_BAT%
echo echo %%*>> %TEMP_BAT%
echo goto :EOF>> %TEMP_BAT%

echo :end>> %TEMP_BAT%
rem ==========临时脚本生成完毕==========

set FN=

if "%O_MODI%" == "y" start "edit before run %TEMP_BAT%" /wait "%P_EDTR%" %TEMP_BAT%
cmd.exe /V:ON /C %TEMP_BAT%

set FN=

del /f /q %TEMP_BAT%
set TEMP_BAT=

if "%O_VIEW%"=="y" (
if exist %PWD%\%O_PRE%-diff.%O_POST% start "view" %PWD%\%O_PRE%-diff.%O_POST%
if exist %PWD%\%O_PRE%-same.%O_POST% start "view" %PWD%\%O_PRE%-same.%O_POST%
if exist %PWD%\%O_PRE%-lost.%O_POST% start "view" %PWD%\%O_PRE%-lost.%O_POST%
if exist %PWD%\%O_PRE%-redu.%O_POST% start "view" %PWD%\%O_PRE%-redu.%O_POST%
if exist %PWD%\%O_PRE%-all.%O_POST% start "view" %PWD%\%O_PRE%-all.%O_POST%
if exist %PWD%\%O_PRE%-dir.%O_POST% start "view" %PWD%\%O_PRE%-dir.%O_POST%
)
goto end

:end
set DEBUG=
set CMDLINE=
set PWD=
set DIR1=
set DIR2=
set DIR1S=
set DIR2S=
set RND=

set O_SUB=
set O_PAT=
set O_DIR=
set O_SUP=
set O_OVER=
set O_VIEW=
set O_PRE=
set O_CMDL=
set O_EXC=
set O_MODI=
set O_POST=
set O_QUITE=
set P_EDTR=

set SRC=
set DEST=
set B_1=
set B_2=
set B_DDIR=
set B_OALL=
set B_ODIFF=
set B_ODIR=
set B_OLOST=
set B_OREDU=
set B_OSAME=
set B_SDIR=
set B_TDIFF=
set B_TLOST=
set B_TREDU=
set B_TSAME=
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: