返回列表 发帖
下班了,仅想了下流程,提供部分关键代码。下次再上完整的。A1-C1为文本文件.

A1 完全相同,A2新旧不同,A3路径不同但文件相同,B1 疑似相同文件,C1完全不同文件, EOF 指推出判断,也可以输出C1


1 for /r A目录文件,IF EXIST 检查B目录文件,|-有相对位置同名文件存在,则FC对比 |-相同就输出到文本A1(完全相同)
                                            |                                                                                                       |-不同则输出到文本A2(新旧版本)
                                            |_无同名文件 |- 检查目录树   |- 有名字相同 |- size相等,FC,输出A3(路径不同文件相同),否者完全不同,eof
                                                                          |             |- size差距大 eof
                                                                          |             |- size差10%以内,输出B1文本(可能为新旧版本,提交用户选择)
                                                                          |- 无名字相同,但有SIZE相等的,则FC |- 相同则输出A3文本(路径不同)
                                                                                                              |- 不同则eof

2 处理B1列表,让用户选择那些是相同文件,那些是不同文件,分储到A3跟C1。
  处理 A2 列表,旧的更名OLD_ ;
  处理A3列表。

3 A->B 拷贝,忽略存在目标, B->A 拷贝,忽略存在文件。


1, 取得FC结果, FC FILE1 FILE2 && echo 两个文件完全相同
2, 查找SIZE相等的文件,for /r ........do dir /s /-c /b /a:-d |find "%~zi" && echo 找到SIZE相同的文件
3, 检查SIZE差距很小的,我尝试用正则 findstr "%var:~0,-2[0-9][0-9]" ,但是不准确
4, 处理列表,复制,XCOPY可以做大部分,另一部分需要IF EXIST来判断

TOP

做了部分代码,也只测试了前面部分,原来有考虑空格“”问题,但发现问题太多了,索性放弃,目录及文件名最好还是不要出现空格...
@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
set "a_dir=d:\test\a\"
set "b_dir=d:\test\b\"
for /r %a_dir% %%a in (*.h) do call :exist %%a
pause
goto :eof
;检测同位置文件
:exist
set xd_dir=%*
set xd_dir=!xd_dir:%a_dir%=!
if exist %b_dir%!xd_dir! (
      echo %a_dir%!xd_dir!#%b_dir%!xd_dir! >A1.txt
      ) else (
      call :find %*
   )
goto :eof
;查找其他目录文件
:find
set fn=%~nx1
dir %b_dir% /s /b !fn! |findstr /v "%1" >temp.txt
if %ERRORLEVEL% EQU 0 (
      ;有不同路径的同名文件
      for /f %%b in (temp.txt) do call :cksize %* %%b
      )else(
      call :findsx
    )
goto :eof
;对比SIZE大小   
:cksize
if %~z1 EQU %~z2 (
      call :fc %1 %2
      )else
      call :cksx %1 %2
    )
goto :eof
:fc
;如果目录里大多是网站程序这种文本文件,修改FC参数,可达到较高识别率。
fc %1 %2
if %ERRORLEVEL% EQU 0 (
      ;相同
      echo %1#%2 >A3.txt
      )else(
     ;名字相同,路径不同,SIZE同,FC不同,稍后对比版本时间
     )
goto :eof
:cksx
;对比属性,主要对比时间,作者,版本,公司等。
goto :eof
:findsx
;这里搜不到同名文件,的后续步骤,寻找属性接近的文件
;第一步是搜索SIZE相等的文件。
;然后搜索其它属性。
;但属性多的话,需要一段程序将文件属性対映到COPY

[ 本帖最后由 caruko 于 2010-3-24 13:46 编辑 ]

TOP

=.= 这是一个测试过的版本,目前只有2个功能,列出“完全相同”“以及同名但不同路径的文件”
;@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
set "a_dir=d:\test\a\"
set "b_dir=d:\test\b\"
echo 这里保存“同名不同路径”的文件列表 >d:\A3.txt
echo 这里保存“疑似同一功能文件”的文件列表 >d:\B1.txt
echo 这里保存“完全相同”的文件列表 >d:\A1.txt
pushd %b_dir%
for /r %a_dir% %%a in (*.*) do call :exist %%a
pause
goto :eof
;检测同位置文件
:exist
set xd_dir=%*
set xd_dir=!xd_dir:%a_dir%=!
if exist %b_dir%!xd_dir! (
      echo %* # %b_dir%!xd_dir! >>d:\A1.txt
      ;同位置同名文件,放弃检测,也可调用FC对比,或者对比日期
      ) else (
      call :find %*
   )
goto :eof
;查找其他目录文件
:find
set fn=%~nx1
dir /a:-d /s /b !fn! |findstr /v "%1" >d:\temp.txt
if %ERRORLEVEL% EQU 0 (
      for /f "tokens=1*" %%b in (d:\temp.txt) do call :cksize %1 %%b
      goto :eof
      )
;这里是无同名文件的代码
goto :eof
;对比SIZE大小   
:cksize
if %~z1 equ %~z2 (
      call :fc %1 %2
      goto :eof
      )
call :cksx %1 %2
goto :eof
;如果目录里大多是网站程序这种文本文件,修改FC参数,可达到较高识别率。
:fc
fc %1 %2
echo fc %~nx1 %~nx2 >>r.txt
if %ERRORLEVEL% EQU 0 (
      echo %1 # %2 >>d:\A3.txt
      goto :eof
      )
;名字相同,路径不同,SIZE同,FC不同,稍后对比版本时间,或者第三方取得摘要信息
goto :eof
:cksx
;对比属性,主要对比时间,作者,版本,公司等。
goto :eof
:findsx
;这里搜不到同名文件,的后续步骤,寻找属性接近的文件
;第一步是搜索SIZE相等的文件。
;然后搜索其它属性。
;但属性多的话,需要一段程序将文件属性対映到
goto :eofCOPY
1

评分人数

TOP

返回列表