Board logo

标题: 求助,无论目标文件是新还是旧,只要和源文件不同就复制 [打印本页]

作者: cjfcjf222     时间: 2007-12-9 11:35    标题: 求助,无论目标文件是新还是旧,只要和源文件不同就复制

求助,无论目标文件是新还是旧,只要和源文件不同就复制的BAT


比如A目录中的EXE文件去比较B目录中的EXE文件,如果B目录中的文件和A目录中的文件不同就复制,
作者: fastslz     时间: 2007-12-9 12:39
简单效率较高的代码
@echo off
for /r a\ %%i in (*.exe) do (
    for /r a\ %%a in (%%~nxi) do (
       for /r b\ %%b in (%%~nxi) do (
       if not "%%~za"=="%%~zb"  echo %%a 不同于 %%b
       )
    )
)
pause
也能处理空格和系统属性文件的代码
@echo off
for /f "tokens=*" %%i in ('dir /s/b/a-d a\*.exe') do (
    for /f "tokens=*" %%a in ('dir /s/b/a-d "a\%%~nxi"') do (
       for /f "tokens=*" %%b in ('dir /s/b/a-d "b\%%~nxi"') do (
       if not "%%~za"=="%%~zb"  echo "%%a" 不同于 "%%b"
       )
    )
)
pause

作者: fastslz     时间: 2007-12-9 12:44
哦补充一点除了用if not "%%~za"=="%%~zb"以外还可以用
if not "%%~ta"=="%%~tb"
预知详情请看for /?
作者: 26933062     时间: 2007-12-9 12:53
这个问题似乎没这么复杂吧?
xcopy 的 /d  参数好像就有这个功能
作者: fastslz     时间: 2007-12-9 13:20
是的但叫楼主如何去用xcopy还不如直接给他代码,扫盲难~,上面还没加copy参数,就怕回头楼主说判断出来了就是没有复制,总之什么都有可能,类似帖子回怕了~所以我3楼注明了预知详情请看for /?
作者: cjfcjf222     时间: 2007-12-9 13:33
xcopy 的 /d  参数只能检测源文件比目标文件新的时候才会复制,如果目标文件比源文件新是无法复制的,我的想法是因为病毒会感染目标文件,往往被改动过的文件比源文件要新,如果被改动,我就复制原始文件到目标,以使程序能正常运行

3楼的程序我用了一下,不过我是这样改过的
@echo off
for /r xw\ %%i in (*.exe) do (
    for /r xw\ %%a in (%%~nxi) do (
       for /r D:\鑫网通达信\ %%b in (%%~nxi) do (
       if not "%%~za"=="%%~zb"  copy/y xw\*.exe D:\鑫网通达信
       )
    )
)

产生的现象是连续复制,而且好象是三个文件一起复制了
作者: cjfcjf222     时间: 2007-12-9 13:34
最好是比较大小后如有不同复制,这样我可以把源文件改名成不带.EXE的文件,只有前面的名字,那样,源文件将不会被感染
作者: cjfcjf222     时间: 2007-12-9 13:37
其实只要判断某个文件就可以了
作者: fastslz     时间: 2007-12-9 13:41
@echo off
for /r xw\ %%i in (*.exe) do (
    for /r xw\ %%a in (%%~nxi) do (
       for /r D:\鑫网通达信\ %%b in (%%~nxi) do (
       if not "%%~za"=="%%~zb"  copy/y xw\*.exe D:\鑫网通达信
       )
    )
)
要么是%%a要么是%%b否则用3个for就没意义了
作者: fastslz     时间: 2007-12-9 13:44
简单点xxcopy论坛搜索有破解版的
作者: cjfcjf222     时间: 2007-12-9 13:52
你这个和我上面那个没有什么二样啊,我XW目录里有三个EXE文件,运行了这个代码后会产生连续不停的一直重复复制啊,而且我目标文件里的三个EXE现在没有变动过也是会复制的,

我想要源文件和目标文件不同时复制,不管目标文件新和旧,只要有变动就复制,可以一个一个文件的检测,这样吧,只要检测对比A 和B.EXE二个文件是否大小不同,不同就复制的命令,其中A文件没有后缀名

[ Last edited by cjfcjf222 on 2007-12-9 at 01:54 PM ]
作者: huahua0919     时间: 2007-12-9 13:55
问一下,一根葱
a\ %%i
为什么 a目录可以写在 定义变量的前面,我接触DOS不久,没见过这种写法,还请赐教
委屈一下你,就当扫盲吧!
作者: fastslz     时间: 2007-12-9 14:17


  Quote:
Originally posted by huahua0919 at 2007-12-9 13:55:
问一下,一根葱
a\ %%i
为什么 a目录可以写在 定义变量的前面,我接触DOS不久,没见过这种写法,还请赐教
委屈一下你,就当扫盲吧!

for /?里有 for /r . %%a in (字符集) 扩展到当前目录包括子目录
for /?里有 for /r D:\ %%a in (字符集) 扩展到D:\目录包括子目录
作者: huahua0919     时间: 2007-12-9 14:21
刚看了,是有的!谢谢
作者: fastslz     时间: 2007-12-9 14:32


  Quote:
Originally posted by cjfcjf222 at 2007-12-9 13:52:
你这个和我上面那个没有什么二样啊,我XW目录里有三个EXE文件,运行了这个代码后会产生连续不停的一直重复复制啊,而且我目标文件里的三个EXE现在没 ...

3个for傻瓜模式扩展更多应用,单纯对比2个文件当然就2个for,另外你用*统配符只要xw文件夹下有一个和D:\鑫网通达信\不同就复制全部exe到D:\鑫网通达信了

其实第1个代码是多余的第2个更稳定,为什么写第1个呢有的人喜欢效率高
作者: fastslz     时间: 2007-12-9 14:44
@echo off
for /f "tokens=*" %%a in ('dir /s/b/a-d "xw\a b c.exe"') do (
    for /f "tokens=*" %%b in ('dir /s/b/a-d "D:\鑫网通达信\a b c.exe"') do (
    if not "%%~za"=="%%~zb" if not "%%~ta"=="%%~tb"  echo "%%a" 不同于 "%%b"
    )
)
pause

[ Last edited by fastslz on 2007-12-9 at 04:53 PM ]
作者: 26933062     时间: 2007-12-9 16:44
一个简单问题居然搞得这么复杂?

楼主的问题越看越糊涂了
在一说判断a和b文件夹的exe文件是否相同.
在11楼又说a文件没有后缀.

我想楼主大概是这个意识
  a文件夹里面的所有都文件是备份文件,如果发现b文件夹里面的文件和a文件夹里面的
  文件不同就用a文件夹里的文件覆盖b文件夹里的文件.
  如果是这样的话,2楼的代码应该可以解决问题啊?难道你的文件名含有空格?
  那么2楼的第二个代码应该也可以啊.!

to 2 楼
   第一个代码中的第二个for是否有点多余?直接 if %%~zi 不可以么?

to 16 楼
   是否发帖太急了,多写了一个if 且最后一个 if 好像漏掉了一个字母  z
作者: fastslz     时间: 2007-12-9 17:17


  Quote:
Originally posted by 26933062 at 2007-12-9 16:44:
to 16 楼
   是否发帖太急了,多写了一个if 且最后一个 if 好像漏掉了一个字母  z

是的,其实漏掉是t 改过来了
IE7很麻烦经常询问允许剪贴板访问,老是出现误操作郁闷~
2楼呢为什么用3个for归功于楼主说“无论目标文件是新还是旧”,模糊方式第1个for是遍历到一个文件名。傻瓜方式直接遍历整个分区里同文件名之间的对比。
作者: cjfcjf222     时间: 2007-12-9 22:25
'dir /b为没有标题信息摘要,好象不能比较二个文件有差异吧,我的意思是二个文件只要大小不同,就把源文件覆盖到目标文件,
理论上就是把一个程序的EXE文件备份一个,为防止病毒感染,备份的文件应该是没有后缀的,由于XCOPY只检测源文件比目标文件新时才复制,还有XXCOPY也是这样的,上面的那段代码也没有起到作用
作者: 26933062     时间: 2007-12-9 23:14
@goto start_1
终于把问题说清楚了。
a文件夹于b文件夹的文件是同名的,但a文件夹中的是没有后缀的。
循环a文件夹中的所有文件,于b文件夹中的同名的exe文件对比,
大小不一样的就复制a文件夹中的文件到b文件夹中,后缀为exe、覆盖原b文件夹中的exe文件
:start_1 ::
@echo off
for /f "delims=" %%a in ('dir/b/a-d a\*.*') do (
   for /f "delims=" %%i in ('dir/b/s/a-d "b\%%~na.exe"') do (
     if not "%%~za"=="%%~zi" echo copy/y "%%a" "b\%%~na.exe"
))
pause
[ Last edited by 26933062 on 2007-12-9 at 11:16 PM ]
作者: fastslz     时间: 2007-12-9 23:52


  Quote:
Originally posted by cjfcjf222 at 2007-12-9 22:25:
'dir /b为没有标题信息摘要,好象不能比较二个文件有差异吧,我的意思是二个文件只要大小不同,就把源文件覆盖到目标文件,
理论上就是把一个程序的E ...

这帖子还真累,楼主半天还没明白用什么去判断比较二个文件有差异的,for /?然后按5次Enter
for /f "delims=" %%a in ('dir/b/a-d a\*.exe') do echo 文件%%a  大小%%~za字节
for /f "delims=" %%a in ('dir/b/a-d a\*.exe') do echo 文件%%a  修改时间%%~ta