[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件管理] 批处理同步备份内容

本帖最后由 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
复制代码

回复 2楼 的帖子

就是整个目录呀  ……  不会是名词不对头吧,深深地郁闷了。

TOP

自己的老帖,改下标题,现在自己写成调用版了。
由参数决定。
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
复制代码

TOP

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

TOP

返回列表