Board logo

标题: [文件管理] 批处理同步备份内容 [打印本页]

作者: 523066680    时间: 2010-4-28 22:58     标题: 批处理同步备份内容

本帖最后由 523066680 于 2011-6-20 23:18 编辑

最近很喜欢用xcopy 更新曾今备份过的目录系
用它的/d 参数,可以不用花过多的时间重新复制全部文件,只要检测更新即可。
速度快很多。

后来用着用着感觉备份目录系文件越来越多,郁闷了,于是做了一个脚本,
先判断 删除备份目录多出的文件 , 然后再进行xcopy.

(不知道是否有自带的命令直接做到呀,请赐教)

注:请慎用,
源文件夹和目的地文件夹都是在开头的变量中定义好的。
当定义的源目录不存在或者为空, 或者写错的时候,很可能酿成删除一切数据的悲剧……
所以我让批处理再次显示一次两个目录的地址,确认后再操作。
  1. @echo off
  2. rem code by 523066680@cn-dos.net
  3. setlocal enabledelayedexpansion
  4. set source=%~dp0
  5. set dest=L:\files\烧录
  6. rem 源路径可以是自身路径,考虑到输入和%~dp0都可能出现末尾有\的情况,
  7. rem 增加了判断及处理
  8. if "%source:~-1%"=="\" (set source=%source:~0,-1%)
  9. if "%dest:~-1%"=="\" (set dest=%dest:~0,-1%)
  10. if not exist "%source%\" (
  11.    echo 源[目录]不存在,按任意键退出
  12.    pause>nul
  13.    exit
  14. )
  15. echo 请确认: 源目录 %source%
  16. echo 备份到 %dest%
  17. if not exist "%dest%\" (
  18.   echo 作为备份的目录%dest%  不存在,将尝试建立。
  19.   (md "%dest%")||(
  20.     echo 目标不能建立,可能是目标磁盘不存在,按任意键退出。
  21.     pause>nul
  22.     exit
  23.   )
  24.   goto :justcopy
  25. )
  26. type nul>DelFile.txt
  27. type nul>DelFold.txt
  28. echo _
  29. echo 按任意键开始搜索+清理 "%dest%"中可能多出的文件或子文件夹
  30. pause>nul
  31. echo _
  32. for /f "tokens=*" %%a in ('dir /a /s /b "%dest%"') do (
  33.   set pathname=%%a
  34.   set pathname=!pathname:%dest%\=!
  35.   if exist "%%a" (
  36.       if not exist %source%\!pathname! (
  37.             rem dir是一次性的,可能已删除了总目录,所以增加判断_是否存在
  38.             if exist "%%a\" (
  39.                  Tree "%%a">>DelFold.txt
  40.                  rd /s /q "%%a"
  41.                  rem echo Remove directory : %%a>>DelFold.txt
  42.             ) else (
  43.                  del /f /s /a /q "%%a">>DelFile.txt
  44.             )
  45.       )
  46.   )
  47. )
  48. echo 本次清理生成日志 DelFold.txt DelFile.txt
  49. type "DelFold.txt" "Delfile.txt"
  50. :justcopy
  51. echo _
  52. echo 按任意键继续开始XCOPY...
  53. pause>nul
  54. echo _
  55.   if exist cut.txt (
  56.     xcopy /s /d /c /h /exclude:cut.txt  "%source%" "%dest%"
  57.   ) else (
  58.     xcopy /s /d /c /h "%source%" "%dest%"
  59.   )
  60. echo 按任意键退出
  61. pause>nul
  62. exit
复制代码

作者: GNU    时间: 2010-4-28 23:11

“目录系”是什么东西啊?
作者: 523066680    时间: 2010-4-28 23:13     标题: 回复 2楼 的帖子

就是整个目录呀  ……  不会是名词不对头吧,深深地郁闷了。
作者: pdanniel66    时间: 2010-4-29 06:58

建议使用robocopy,我用 xcopy有3年以上,自从遇见robocopy,我已经移情别恋了,尤其是要 copy 多层目录之档案。
作者: 523066680    时间: 2011-6-20 23:21

自己的老帖,改下标题,现在自己写成调用版了。
由参数决定。
Synchronism.bat %Source% %Destination%
在xcopy 之前,会先对比源目录,多出的文件将被删除
慎用!尤其是目录名写错的话就死翘翘了。我还是自己留着好了。
我的情况是有个移动硬盘,每隔两三天就同步一次备份。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if "%~1"=="" (echo arg1 empty &exit /b)
  4. if "%~2"=="" (echo arg2 empty &exit /b)
  5. rem 参数中的路径末尾不应有斜杠。
  6. set src=%~1
  7. set dest=%~2
  8. set exclude=%~3
  9. echo %src%   to   
  10. echo           %dest%
  11. echo exclude : %exclude%
  12. if not exist "%src%" (echo %src% does not exist &pause>nul &exit)
  13. if not exist "%dest%" (echo %dest% does not exist &pause>nul &exit)
  14. if "%src:~-1%"=="\" (set src=%src:~0,-1%)
  15. if "%dest:~-1%"=="\" (set dest=%dest:~0,-1%)
  16. pause
  17. echo Clear files. some dest\files not exist in source
  18. rem 如果只提示找不到文件而没有显示文件名,是因为目标目录一个文件也没有
  19. rem 是dir的提示
  20. for /f "tokens=*" %%a in ('dir /a-d /s /b %dest%') do (
  21. set str=%%a
  22. set str=!str:%dest%\=!
  23. if not exist "%src%\!str!" (
  24. echo !str! not exist in %src%
  25. del "%dest%\!str!"
  26. )
  27. )
  28. echo clear folder
  29. for /f "tokens=*" %%a in ('dir /ad /s /b %dest%') do (
  30. set str=%%a
  31. set str=!str:%dest%\=!
  32. if not exist "%src%\!str!" (
  33. echo !str! not exist in %src%
  34. rd "%dest%\!str!"
  35. )
  36. )
  37. echo xcopy
  38. xcopy /i /f /s /d /y /h /EXCLUDE:%exclude% %src% %dest%
  39. rem /i   如果目标不存在又在复制一个以上的文件,则假定目标是个目录。
  40. rem /S   复制目录和子目录,除了空的
  41. rem /f   复制时显示完整的源和目标文件名。
  42. rem /c   即使有错误,也继续复制。
  43. rem /y   复制文件审核设置(隐含 /O 复制文件所有权和 ACL 信息)
  44. rem /h   也复制隐藏和系统文件。
  45. pause
复制代码

作者: ygqiang    时间: 2011-6-26 16:42

建议使用robocopy,我用 xcopy有3年以上,自从遇见robocopy,我已经移情别恋了,尤其是要 copy 多层目录之档案。
pdanniel66 发表于 2010-4-29 06:58



robocopy非常好用。

分享下。
作者: ygqiang    时间: 2011-6-26 16:47

本帖最后由 ygqiang 于 2011-6-26 16:53 编辑

robocopy适合使用移动硬盘或者本地硬盘(至少有2个以上硬盘),定期对本地固定的某个硬盘目录做备份。

1、将文件解压缩到需要备份的目标盘(移动硬盘或者本地硬盘)根目录下,修改好bat文件内容。

2、以后需要备份,运行bat就可以。

3、如果是本地2个不同的硬盘,可以用批处理实现间隔定时同步备份。(这个方法就不提供了)
作者: ygqiang    时间: 2011-6-26 16:48

“Robocopy.exe 是 微软在Windows server 2003 Resource Kit Tools 里面提供的程序来做备份的,现在Windows Vista系统中已经自带了这个命令行程序。”

这个工具是微软公司推出的,配合bat批处理,使用非常稳定。

xp   win7系统下,都可以正常使用。
作者: ygqiang    时间: 2011-6-26 16:59

再来一个工具。

xp、win7系统都可以用,后台静默运行。
作者: ygqiang    时间: 2011-6-26 17:13

00-00robocopy  "c:\xxxx" "d:\xxx\xx" /mir


/mir的作用,就是完全的同步备份
如果修改成这种类似的,配合批处理  开机启动,定时间隔备份   会更好!
作者: ygqiang    时间: 2011-6-26 17:14

现在硬盘太脆弱了

2个硬盘,其中拿出1个做定时备份资料,用这个小工具,就不错了
作者: ygqiang    时间: 2011-6-26 17:26

如果robocopy配合批处理,提前设置好了

以后需要备份,只要运行bat文件,马上给你后台同步/镜像备份。目标与源完全一致。
作者: 523066680    时间: 2011-6-26 18:08

我说…… 用了7个楼的帖子推荐robocopy,也太隆重了。
自己去找了一下官网的下载+安装包链接:
http://www.microsoft.com/downloa ... &displaylang=en
作者: Batcher    时间: 2011-6-26 19:38

6# ygqiang


尽量避免重复上传附件:
http://bbs.bathome.net/thread-6283-1-1.html
作者: applba    时间: 2011-6-26 19:56

2# GNU


目录系就是目录树




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2