windows定时全量\增量备份文件(夹)并删除一定日期之前的备份和日志

备份的原理

使用windows的任务计划程序定时执行该脚本从而达到备份和删除备份历史的目的。

 

主要参数

脚本主要需要设置参数有四个:

  • bakPath:要备份的目录,必须以\结尾
  • bakTargetPath:备份文件存储路径(可以是网络路径,前提是必须要有权限管理该路径下的文件夹)
  • DaysAgo:该参数表示要删除多少天之前的备份(比如今天是2012年12月31日,那么20121221的文件不会被删除,20121220或比之小的文件夹将会被删除)
  • logDaysAgo:该参数表示要删除多少天之前的日志文件

 

脚本

fullFillBackUp.bat

 

  1 ::  ------------------------------------------------------------------------ 
  2 ::                       自动备份及清除文件夹脚本说明
  3 ::  本脚本能备份指定文件夹下的所有文件夹并以日期的形式来存放每次备份的文件夹,
  4 ::  同时,能删除指定时间之前的备份文件夹。如果要使本脚本能按一定间隔时间来执行
  5 ::  此脚本,那么请在系统定时任务内创建一个任务,并设置好执行时间,然后指定执行
  6 ::  此脚本即可。
  7 ::  注意:由于定时任务执行的方式与直接点击执行脚本的方式有很大差别(对于定时任
  8 ::  务来说,脚本的相对路径其实就是相对于cmd.exe来说的路径),所以必须使用绝对
  9 ::  路径的方式来进行拷贝。
 10 ::  具体设置的参数:(所有的目录路径必须以\结尾)
 11 ::  bakPath 要备份的目录,必须以\结尾
 12 ::  bakTargetPath 备份文件存储路径(可以是网络路径,前提是必须要有权限管理该路径下的文件夹)
 13 ::  DaysAgo 该参数表示要删除多少天之前的备份(比如今天是2012年12月31日,那么20121221的文件不会被删除,20121220或比之小的文件夹将会被删除)
 14 ::  logDaysAgo 该参数表示要删除多少天之前的日志文件
 15 ::                                                         --by Blademainer
 16 ::  ------------------------------------------------------------------------ 
 17 
 18 @echo off
 19 :: for /f "tokens=1-3 delims=- " %%1 in ("%date%") do set ttt=%%1%%2%%3
 20 :: for /f "tokens=1-3 delims=.: " %%1 in ("%time%") do set ttt=%ttt%-%%1%%2%%3
 21 
 22 :: 要备份的目录,必须以\结尾
 23 set bakPath=D:\backupsource\
 24 
 25 :: 备份文件存储路径(可以是网络路径,前提是必须要有权限管理该路径下的文件夹)
 26 set bakTargetPath=D:\backupto\
 27 
 28 :: 该参数表示要删除多少天之前的备份(比如今天是2012年12月31日,那么20121221的文件不会被删除,20121220或比之小的文件夹将会被删除)
 29 set DaysAgo=10
 30 :: 该参数表示要删除多少天之前的日志文件
 31 set logDaysAgo=%DaysAgo%
 32 
 33 
 34 :: ----------------------------------- 注意:除非你有足够的自信,否则不要变动以下参数 ----------------------------------- 
 35 :: 日志存放路径
 36 set logDir=%bakTargetPath%\log\
 37 
 38 :: 截取日期函数
 39 set dateStr=%date:~0,4%%date:~5,2%%date:~8,2%
 40 :: 时间戳
 41 set timeStr=%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
 42 :: 得出的索引

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
echo %dt:~0,14%
set indexStr=%dt:~0,14%



45 :: 设置时间格式 46 for /f "tokens=1-3 delims=- " %%1 in ("%time%") do set beautyTime=%%1%%2%%3 47 48 :: 日志文件名 49 set logFile=%logDir%%indexStr%.log 50 51 :: 获取最后一个文件夹名称 52 call :LastFolder %bakPath% bakName 53 :: 备份所在文件夹(按日期分) 54 set bakDataFolder=%bakTargetPath%%indexStr%\ 55 :: 备份后的路径 56 set bakDataPath=%bakDataFolder%%bakName%\ 57 echo bakDataPath======%bakDataPath% 58 59 :: 创建日志目录 60 if not exist %logDir% mkdir %logDir% 61 62 echo 开始备份文件夹 63 echo ------------------ %date% %beautyTime% ------------------ >> %logFile% 64 if not exist %bakDataPath% mkdir %bakDataPath% 65 xcopy %bakPath%* %bakDataPath% /c/s/e/y/r >> %logFile% 66 IF ERRORLEVEL 1 ECHO ------------------ 文件拷贝失败 ------------------ >> %logFile% 67 IF ERRORLEVEL 0 ECHO ------------------ 文件拷贝成功 ------------------ >> %logFile% 68 69 :: ------------------- 计算指定DaysAgo天之前的日期 ------------------- 70 :: 日期的格式为yyyymmdd 71 call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays 72 set /a PassDays-=%DaysAgo% 73 call :DaysToDate %PassDays% DstYear DstMonth DstDay 74 set DstDate=%DstYear%%DstMonth%%DstDay% 75 echo %DaysAgo%天前的日期是%DstDate% 76 77 :: ------------------- 计算指定logDaysAgo天之前的日期 ------------------- 78 :: 日期的格式为yyyymmdd 79 call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% logPassDays 80 set /a logPassDays-=%logDaysAgo% 81 call :DaysToDate %logPassDays% DstYear DstMonth DstDay 82 set logDstDate=%DstYear%%DstMonth%%DstDay% 83 echo %logDaysAgo%天前的日期是%logDstDate% 84 85 :: ------------------- 删除文件夹 ------------------- 86 echo 开始删除数据文件夹 87 echo 开始删除数据文件夹 >> %logFile% 88 setlocal enabledelayedexpansion 89 for /f "delims=" %%s in ('dir /b /ad "%bakTargetPath%"') do ( 90 set d=%%s 91 set dateParse=!d:~0,8! 92 echo 截取的日期为:!dateParse! 93 set stDate=%DstDate% 94 :: 如果该文件夹的日期小于该删除的备份日期,则删除该文件夹 95 set path=%bakTargetPath%!d! 96 echo 当前的路径!path! 97 if !dateParse! lss !stDate! call :DeleteDirectory !path! 98 ) 99 100 echo 开始删除日志文件夹%logDir% 101 echo 开始删除日志文件夹 >> %logFile% 102 for /f "delims=" %%s in ('dir /a-d /b "%logDir%"') do ( 103 set d=%%s 104 set dateParse=!d:~0,8! 105 echo 截取的日期为:!dateParse! 106 set stDate=%logDstDate% 107 :: 如果该文件夹的日期小于该删除的备份日期,则删除该文件夹 108 set path=%logDir%!d! 109 echo 当前的路径!path! 110 if !dateParse! lss !stDate! call :DeleteFile !path! 111 ) 112 113 endlocal 114 :: --------------------------- 结束--------------------------- 115 goto :eof 116 117 :: 根据路径计算最后一个文件夹 118 :LastFolder %1 folderName 119 Setlocal ENABLEDELAYEDEXPANSION 120 set string=%1 121 ::定义路径分隔符 122 set ch=\ 123 set last=%string:~-1% 124 if "%last%"=="%ch%" (set "string=%string:~0,-1%") 125 set str=%string% 126 127 :next 128 if not "%str%"=="" ( 129 if "!str:~-1!"=="%ch%" goto last 130 set rsString=!str:~-1!%rsString% 131 ::比较首字符是否为要求的字符,如果是则跳出循环 132 set "str=%str:~0,-1%" 133 goto next 134 ) 135 :last 136 ::将空格去掉 137 set rsString=%rsString: =% 138 echo 结果:%rsString% 139 endlocal&set %2=%rsString%&goto :EOF 140 141 :: 删除文件夹 142 :DeleteDirectory %1 143 setlocal ENABLEEXTENSIONS 144 echo ------------------ %1 ------------------ 145 rd /s /q %1 146 echo ------------------ 成功删除文件夹: %1 ------------------ >> %logFile% 147 endlocal&goto :EOF 148 149 :: 删除文件 150 :DeleteFile %1 151 setlocal ENABLEEXTENSIONS 152 echo ------------------ %1 ------------------ 153 del /f /s /q /a %1 154 echo ------------------ 成功删除文件: %1 ------------------ >> %logFile% 155 endlocal&goto :EOF 156 157 ::以下是计算日期使用 158 :DateToDays %yy% %mm% %dd% days 159 setlocal ENABLEEXTENSIONS 160 set yy=%1&set mm=%2&set dd=%3 161 if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%) 162 set /a dd=100%dd%%%100,mm=100%mm%%%100 163 set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2 164 set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633 165 endlocal&set %4=%j%&goto :EOF 166 167 :DaysToDate %days% yy mm dd 168 setlocal ENABLEEXTENSIONS 169 set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a 170 set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5 171 set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10 172 (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%) 173 endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF 174 :: 结束goto使用: goto :eof

 

 

增量备份

halfFillBackUp.bat

 1 @echo off
 2 
 3 cd D:\backupto
 4 
 5 ::backupto目录下最新的文件夹
 6 
 7 for /d %%i in (D:\backupto\*) do set last=%%i
 8 
 9 echo The max cpufreq is: %last%
10 
11 ::往目录中增量更新
12 
13 xcopy D:\backupsource %last%\backupsource /e/I/d/h/r/y
14 
15 echo %last%\backupsource

 

 注释: 代码里的双引号("")以内的内容是文件夹路径,可以根据实际情况修改,前面是需要备份的文件夹路径,后面是备份文件夹路径。
如果需要备份更多的文件夹只需要多个xcopy 后面的格式和代码中相同,不要忘记两个路径之间有一个空格
参数说明:
/e:拷贝所有子目录,包括空子目录;
/I: 如果目标文件或目录不存在且拷贝的文件数多于一,则假设目标为目录;
/d:只拷贝文件日期与在目标文件后的文件(即修改过的源文件)
/h:同时拷贝隐藏文件和系统文件
/r:拷贝并覆盖只读文件
/y: 复制文件审核设置(不显示已有文件覆盖确认)
以上参数可以根据需要添加,推荐都加上最好。

 

 

 转载:https://www.cnblogs.com/wmyll/p/14331264.html

 

posted @ 2021-11-25 15:47  joel1889  阅读(557)  评论(0)    收藏  举报