本帖最后由 523066680 于 2011-6-20 23:18 编辑
最近很喜欢用xcopy 更新曾今备份过的目录系
用它的/d 参数,可以不用花过多的时间重新复制全部文件,只要检测更新即可。
速度快很多。
后来用着用着感觉备份目录系文件越来越多,郁闷了,于是做了一个脚本,
先判断 删除备份目录多出的文件 , 然后再进行xcopy.
(不知道是否有自带的命令直接做到呀,请赐教)
注:请慎用,
源文件夹和目的地文件夹都是在开头的变量中定义好的。
当定义的源目录不存在或者为空, 或者写错的时候,很可能酿成删除一切数据的悲剧……
所以我让批处理再次显示一次两个目录的地址,确认后再操作。- @echo off
- rem code by 523066680@cn-dos.net
- setlocal enabledelayedexpansion
- set source=%~dp0
- set dest=L:\files\烧录
-
- rem 源路径可以是自身路径,考虑到输入和%~dp0都可能出现末尾有\的情况,
- rem 增加了判断及处理
-
- if "%source:~-1%"=="\" (set source=%source:~0,-1%)
- if "%dest:~-1%"=="\" (set dest=%dest:~0,-1%)
-
- if not exist "%source%\" (
- echo 源[目录]不存在,按任意键退出
- pause>nul
- exit
- )
-
- echo 请确认: 源目录 %source%
- echo 备份到 %dest%
- if not exist "%dest%\" (
- echo 作为备份的目录%dest% 不存在,将尝试建立。
- (md "%dest%")||(
- echo 目标不能建立,可能是目标磁盘不存在,按任意键退出。
- pause>nul
- exit
- )
- goto :justcopy
- )
-
- type nul>DelFile.txt
- type nul>DelFold.txt
-
- echo _
- echo 按任意键开始搜索+清理 "%dest%"中可能多出的文件或子文件夹
- pause>nul
- echo _
-
- for /f "tokens=*" %%a in ('dir /a /s /b "%dest%"') do (
- set pathname=%%a
- set pathname=!pathname:%dest%\=!
- if exist "%%a" (
- if not exist %source%\!pathname! (
- rem dir是一次性的,可能已删除了总目录,所以增加判断_是否存在
- if exist "%%a\" (
- Tree "%%a">>DelFold.txt
- rd /s /q "%%a"
- rem echo Remove directory : %%a>>DelFold.txt
- ) else (
- del /f /s /a /q "%%a">>DelFile.txt
- )
- )
- )
- )
- echo 本次清理生成日志 DelFold.txt DelFile.txt
- type "DelFold.txt" "Delfile.txt"
-
- :justcopy
- echo _
- echo 按任意键继续开始XCOPY...
- pause>nul
- echo _
- if exist cut.txt (
- xcopy /s /d /c /h /exclude:cut.txt "%source%" "%dest%"
- ) else (
- xcopy /s /d /c /h "%source%" "%dest%"
- )
- echo 按任意键退出
- pause>nul
- exit
复制代码
|