目录比较的小工具myfc

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

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

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

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


下载代码如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
  1@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 /%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 ) 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 -----======================================================================-----
100echo usage: %~nx0 [/s] [/f pattern] [/x pattern] [/o] [/p prefix] src-dir dest-dir
101echo        /s            包含子目录中的文件
102echo        /f pattern    需要匹配的文件,多个必须用"+"号分隔,如 *.t*+b??.bat+a*.doc
103echo        /x pattern    排除的文件后缀名,多个必须用"+"号分隔,如 bak+tmp
104echo        /d            显示以目录为单位,并进行目录双向比较
105echo        /q            关闭控制台内容显示
106echo        /u            抑制不必要的输出(较慢)
107echo        /p prefix     输出文件名的前缀
108echo        /o            覆盖原有输出文件
109echo        /t            输出html格式的结果文件格式
110echo        /c param      传递给FC的参数,多个必须用"+"号分隔,比如/C+/N+/W
111echo        /m            脚本生成完毕,运行之前允许用%%EDITOR%%进行修改,默认notepad
112echo        /v            运行完毕之后自动打开结果文件
113echo        src-dir       用作比较的基准目录
114echo        dest-dir      用于比较的目录
115goto end
116
117:start
118if not #%O_OVER%# == #y# goto app
119if exist %PWD%\%O_PRE%-diff.%O_POST% del //q %PWD%\%O_PRE%-diff.%O_POST%
120if exist %PWD%\%O_PRE%-same.%O_POST% del //q %PWD%\%O_PRE%-same.%O_POST%
121if exist %PWD%\%O_PRE%-lost.%O_POST% del //q %PWD%\%O_PRE%-lost.%O_POST%
122if exist %PWD%\%O_PRE%-redu.%O_POST% del //q %PWD%\%O_PRE%-redu.%O_POST%
123if exist %PWD%\%O_PRE%-all.%O_POST% del //q %PWD%\%O_PRE%-all.%O_POST%
124if exist %PWD%\%O_PRE%-dir.%O_POST% del //q %PWD%\%O_PRE%-dir.%O_POST%
125:app
126echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-diff.%O_POST%
127echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-same.%O_POST%
128echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-lost.%O_POST%
129echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-redu.%O_POST%
130echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-all.%O_POST%
131echo ===============================%DATE% %TIME%=========================== >> %PWD%\%O_PRE%-dir.%O_POST%
132
133set RND=%TIME::=.%-%RANDOM%
134set TEMP_BAT="%TEMP%\myfc-%RND%.bat"
135rem ==========开始生成临时脚本==========
136echo @echo off> %TEMP_BAT%
137echo rem 本文件由myfc.bat自动生成>> %TEMP_BAT%
138echo set SRC=%DIR1%>> %TEMP_BAT%
139echo set DEST=%DIR2%>> %TEMP_BAT%
140
141echo set B_OALL="%PWD%\%O_PRE%-all.%O_POST%">> %TEMP_BAT%
142echo set B_ODIR="%PWD%\%O_PRE%-dir.%O_POST%">> %TEMP_BAT%
143echo set B_ODIFF="%PWD%\%O_PRE%-diff.%O_POST%">> %TEMP_BAT%
144echo set B_OSAME="%PWD%\%O_PRE%-same.%O_POST%">> %TEMP_BAT%
145echo set B_OREDU="%PWD%\%O_PRE%-redu.%O_POST%">> %TEMP_BAT%
146echo set B_OLOST="%PWD%\%O_PRE%-lost.%O_POST%">> %TEMP_BAT%
147
148echo set B_TDIFF="%TEMP%\t%RND%-diff.txt">> %TEMP_BAT%
149echo set B_TSAME="%TEMP%\t%RND%-same.txt">> %TEMP_BAT%
150echo set B_TREDU="%TEMP%\t%RND%-redu.txt">> %TEMP_BAT%
151echo set B_TLOST="%TEMP%\t%RND%-lost.txt">> %TEMP_BAT%
152
153echo pushd %%SRC%%>> %TEMP_BAT%
154echo call:walk_dir "%%SRC%%\">> %TEMP_BAT%
155if "%O_SUB%" == "y" (set T_SUB=/r %%SRC%%) else (set T_SUB=)
156echo for /d %T_SUB% %%%%v in (*.*) do call:walk_dir "%%%%~fv">> %TEMP_BAT%
157set T_SUB=
158echo popd>> %TEMP_BAT%
159echo cd %PWD%>> %TEMP_BAT%
160echo goto :EOF>> %TEMP_BAT%
161
162echo :walk_dir>> %TEMP_BAT%
163if not "%O_QUITE%" == "" goto skip_q1
164echo echo %%1>> %TEMP_BAT%
165:skip_q1
166echo pushd %%1>> %TEMP_BAT%
167
168echo if exist %%B_TSAME%% del //f %%B_TSAME%% ^> nul>> %TEMP_BAT%
169echo if exist %%B_TDIFF%% del //f %%B_TDIFF%% ^> nul>> %TEMP_BAT%
170echo if exist %%B_TREDU%% del //f %%B_TREDU%% ^> nul>> %TEMP_BAT%
171echo if exist %%B_TLOST%% del //f %%B_TLOST%% ^> nul>> %TEMP_BAT%
172
173echo for %%%%F in (%O_PAT:+= %) do    (    >> %TEMP_BAT%
174if not "%O_QUITE%" == "" goto skip_q2
175echo     echo     %%%%F>> %TEMP_BAT%
176:skip_q2
177echo     set B_EX=>> %TEMP_BAT%
178if "%O_EXC%" == "" goto skip_e1
179echo     for %%%%e in (%O_EXC:+= %) do if "!B_EX!"=="" if ".%%%%e" == "%%%%~xF" set B_EX=y>> %TEMP_BAT%
180:skip_e1
181echo     if "!B_EX!" == "" (    >> %TEMP_BAT%
182echo         set B_FN=%%%%~fF>> %TEMP_BAT%
183echo         set B_DFN=!B_FN:%DIR1%\=%DIR2%\!>> %TEMP_BAT%
184echo         call:out fc %O_CMDL:+= % !B_FN! !B_DFN! ^>^> %%B_OALL%%>> %TEMP_BAT%
185echo         if exist "!B_DFN!" (    >> %TEMP_BAT%
186echo             call:out %%%%~tF    %%%%~zF    %%%%~fF ^>^> %%B_OALL%%>> %TEMP_BAT%
187echo             for %%%%n in ("!B_DFN!") do (    >> %TEMP_BAT%
188echo                 call:out %%%%~tn    %%%%~zn    %%%%~fn ^>^> %%B_OALL%%>> %TEMP_BAT%
189echo             )>> %TEMP_BAT%
190echo             fc %O_CMDL:+= % "!B_FN!" "!B_DFN!" ^>^> %%B_OALL%%>> %TEMP_BAT%
191echo             if #!errorlevel!# == #1# (    >> %TEMP_BAT%
192echo                 call:out diff "!B_FN!" "!B_DFN!" ^>^> %%B_TDIFF%%>> %TEMP_BAT%
193echo                 call:out .   %%%%~tF    %%%%~zF    %%%%~fF ^>^> %%B_TDIFF%%>> %TEMP_BAT%
194echo                 for %%%%n in ("!B_DFN!") do (    >> %TEMP_BAT%
195echo                 call:out .   %%%%~tn    %%%%~zn    %%%%~fn ^>^> %%B_TDIFF%%>> %TEMP_BAT%
196echo                 )>> %TEMP_BAT%
197echo             )>> %TEMP_BAT%
198echo             if #!errorlevel!# == #0# (    >> %TEMP_BAT%
199echo                 call:out same !B_FN! !B_DFN! ^>^> %%B_TSAME%%>> %TEMP_BAT%
200echo             )>> %TEMP_BAT%
201echo         ) else (    >> %TEMP_BAT%
202echo             call:out lost !B_DFN! ^>^> %%B_OALL%%>> %TEMP_BAT%
203echo             call:out lost !B_DFN! ^>^> %%B_TLOST%%>> %TEMP_BAT%
204echo         )>> %TEMP_BAT%
205echo     )>> %TEMP_BAT%
206echo )>> %TEMP_BAT%
207echo popd>> %TEMP_BAT%
208
209if not "%O_DIR%" == "y" goto skip_d1
210echo set B_SDIR=%%1>> %TEMP_BAT%
211echo set B_DDIR=!B_SDIR:%DIR1%\=%DIR2%\!>> %TEMP_BAT%
212echo if not exist %%B_DDIR%% goto no_redu>> %TEMP_BAT%
213echo pushd %%B_DDIR%%>> %TEMP_BAT%
214echo for %%%%F in (%O_PAT:+= %) do    (    >> %TEMP_BAT%
215echo     set B_EX=>> %TEMP_BAT%
216if "%O_EXC%" == "" goto skip_e2
217echo     for %%%%e in (%O_EXC:+= %) do if "!B_EX!"=="" if ".%%%%e" == "%%%%~xF" set B_EX=y>> %TEMP_BAT%
218:skip_e2
219echo     if "!B_EX!" == "" (    >> %TEMP_BAT%
220echo         set B_1=%%%%~fF>> %TEMP_BAT%
221echo         set B_2=!B_1:%DIR2%\=%DIR1%\!>> %TEMP_BAT%
222echo         if not exist "!B_2!" (    >> %TEMP_BAT%
223echo             call:out redundant "%%%%~fF" ^>^> %%B_TREDU%%>> %TEMP_BAT%
224echo         )>> %TEMP_BAT%
225echo     )>> %TEMP_BAT%
226echo )>> %TEMP_BAT%
227echo for /d %%%%F in (*.*) do (>> %TEMP_BAT%
228echo     set B_1=%%%%~fF>> %TEMP_BAT%
229echo     set B_2=!B_1:%DIR2%\=%DIR1%\!>> %TEMP_BAT%
230echo     if not exist "!B_2!" call:fnList "%%%%~fF">> %TEMP_BAT%
231echo     )>> %TEMP_BAT%
232echo )>> %TEMP_BAT%
233echo popd>> %TEMP_BAT%
234echo goto no_redu>> %TEMP_BAT%
235echo :fnList>> %TEMP_BAT%
236echo     for /r %%1 %%%%G in (%O_PAT:+= %) do    (    >> %TEMP_BAT%
237echo         set B_EX=>> %TEMP_BAT%
238if "%O_EXC%" == "" goto skip_e3
239echo         for %%%%e in (%O_EXC:+= %) do if "!B_EX!"=="" if ".%%%%e" == "%%%%~xG" set B_EX=y>> %TEMP_BAT%
240:skip_e3
241echo         if "!B_EX!" == "" (    >> %TEMP_BAT%
242echo             call:out redundant "%%%%~fG" ^>^> %%B_TREDU%%>> %TEMP_BAT%
243echo         )>> %TEMP_BAT%
244echo     )>> %TEMP_BAT%
245echo goto :EOF>> %TEMP_BAT%
246echo :no_redu>> %TEMP_BAT%
247:skip_d1
248
249echo echo %%1 ^>^> %%B_ODIR%%>> %TEMP_BAT%
250
251echo if exist %%B_TSAME%% type %%B_TSAME%% ^>^> %%B_OSAME%%>> %TEMP_BAT%
252echo if exist %%B_TDIFF%% type %%B_TDIFF%% ^>^> %%B_ODIFF%%>> %TEMP_BAT%
253echo if exist %%B_TREDU%% type %%B_TREDU%% ^>^> %%B_OREDU%%>> %TEMP_BAT%
254echo if exist %%B_TLOST%% type %%B_TLOST%% ^>^> %%B_OLOST%%>> %TEMP_BAT%
255
256echo if exist %%B_TSAME%% type %%B_TSAME%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
257echo if exist %%B_TDIFF%% type %%B_TDIFF%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
258echo if exist %%B_TREDU%% type %%B_TREDU%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
259echo if exist %%B_TLOST%% type %%B_TLOST%% ^>^> %%B_ODIR%%>> %TEMP_BAT%
260
261echo if exist %%B_TSAME%% del //f %%B_TSAME%% ^> nul>> %TEMP_BAT%
262echo if exist %%B_TDIFF%% del //f %%B_TDIFF%% ^> nul>> %TEMP_BAT%
263echo if exist %%B_TREDU%% del //f %%B_TREDU%% ^> nul>> %TEMP_BAT%
264echo if exist %%B_TLOST%% del //f %%B_TLOST%% ^> nul>> %TEMP_BAT%
265
266echo goto end>> %TEMP_BAT%
267echo :out>> %TEMP_BAT%
268echo echo     %%*>> %TEMP_BAT%
269echo goto :EOF>> %TEMP_BAT%
270
271echo :end>> %TEMP_BAT%
272rem ==========临时脚本生成完毕==========
273
274set FN=
275
276if "%O_MODI%" == "y" start "edit before run %TEMP_BAT%" /wait "%P_EDTR%" %TEMP_BAT%
277cmd.exe /V:ON /C %TEMP_BAT%
278
279set FN=
280
281del //q %TEMP_BAT%
282set TEMP_BAT=
283
284if "%O_VIEW%"=="y" (
285    if exist %PWD%\%O_PRE%-diff.%O_POST% start "view" %PWD%\%O_PRE%-diff.%O_POST%
286    if exist %PWD%\%O_PRE%-same.%O_POST% start "view" %PWD%\%O_PRE%-same.%O_POST%
287    if exist %PWD%\%O_PRE%-lost.%O_POST% start "view" %PWD%\%O_PRE%-lost.%O_POST%
288    if exist %PWD%\%O_PRE%-redu.%O_POST% start "view" %PWD%\%O_PRE%-redu.%O_POST%
289    if exist %PWD%\%O_PRE%-all.%O_POST% start "view" %PWD%\%O_PRE%-all.%O_POST%
290    if exist %PWD%\%O_PRE%-dir.%O_POST% start "view" %PWD%\%O_PRE%-dir.%O_POST%
291)
292goto end
293
294:end
295set DEBUG=
296set CMDLINE=
297set PWD=
298set DIR1=
299set DIR2=
300set DIR1S=
301set DIR2S=
302set RND=
303
304set O_SUB=
305set O_PAT=
306set O_DIR=
307set O_SUP=
308set O_OVER=
309set O_VIEW=
310set O_PRE=
311set O_CMDL=
312set O_EXC=
313set O_MODI=
314set O_POST=
315set O_QUITE=
316set P_EDTR=
317
318set SRC=
319set DEST=
320set B_1=
321set B_2=
322set B_DDIR=
323set B_OALL=
324set B_ODIFF=
325set B_ODIR=
326set B_OLOST=
327set B_OREDU=
328set B_OSAME=
329set B_SDIR=
330set B_TDIFF=
331set B_TLOST=
332set B_TREDU=
333set B_TSAME=
334
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值