Board logo

标题: 备份文件,并且只保留最近几次的备份 [打印本页]

作者: lhkyzh     时间: 2008-7-30 21:31    标题: 备份文件,并且只保留最近几次的备份

小弟使用的数据库虽然有sql自动备份,但有过一次无法恢复的经历,所以现在每天都选择手动备份,操作步骤多,还要经常检查磁盘的剩余空间,所以想找一个自动备份数据库,并且按照建立时间,删除掉以前备份的文件,只保留最近5次,研究了一段时间,写出下列批处理:

rem @echo off
::/停止sql服务/
echo 正在停止PUBWIN服务...
net stop "SQLSERVERAGENT">nul
net stop "MSSQLSERVER">nul
echo 正在备份数据库文件...
::/建立当前时间的备份目录/
Set dd=%date:~0,10%
Set tm1=%time:~0,2%
Set tm2=%time:~3,2%
Set tt=%tm1%点%tm2%分
md "d:\数据库备份\%dd%_%tt%"
::/复制数据库到备份目录/
copy e:/database/ "d:\数据库备份\%dd%_%tt%\"
::/只保留最近三次备份的数据库
dir /o:-d d:\数据库备份>1.txt
for /F "skip=10 tokens=4" %%a in (1.txt) do @if exist d:\数据库备份\%%a rd /s /q d:\数据库备份\%%a
pause

前面一部分是停止服务的copy文件,后面自动删除旧备份这一些是借鉴前辈的文章,思路是先dir按由新到旧的时间显示d盘“数据库备份”这个文件夹,然后把结果输出到1.txt,然后分析1.txt,我的1.txt内容如下:
------------------------------分隔符-----------------------------------------------
驱动器 D 中的卷没有标签。
卷的序列号是 3886-56C7

d:\pubwin数据库备份 的目录

2008-07-30  20:20    <DIR>          .
2008-07-30  20:20    <DIR>          ..
2008-07-30  20:20    <DIR>          2008-07-30_20点20分
2008-07-30  20:19    <DIR>          2008-07-30_20点19分
2008-07-24  07:49    <DIR>          2008-07-24_ 7点49分
2008-07-24  07:47    <DIR>          2008-07-24_ 7点47分
2008-07-24  07:46    <DIR>          2008-07-24_ 7点46分
2008-07-24  07:44    <DIR>          2008-07-24_ 7点44分
2008-07-24  01:43    <DIR>          2008-07-24_ 1点43分
------------------------------分隔符-----------------------------------------------

for /F "skip=10 tokens=4" %%a in (1.txt) do @if exist d:\数据库备份\%%a rd /s /q d:\数据库备份\%%a
我想用这段命令 做到只保留最近三次备份,
所以了忽略前十行,然后删除掉前十行以外的文件夹,但实际的运行效果,它虽然可以删除十行以外多余的备份文件,但是不同日期创建的文件就删除不了,比如上面的例子,运行命令以后,它应该只能保留两个文件夹:
2008-07-30  20:20    <DIR>          2008-07-30_20点20分
2008-07-30  20:19    <DIR>          2008-07-30_20点19分
但实际上运行以后,
2008-07-24  07:49    <DIR>          2008-07-24_ 7点49分
2008-07-24  07:47    <DIR>          2008-07-24_ 7点47分
2008-07-24  07:46    <DIR>          2008-07-24_ 7点46分
2008-07-24  07:44    <DIR>          2008-07-24_ 7点44分
这几个依然存在,我把命令换成:
for /F "skip=10 tokens=4" %%a in (1.txt) do @if exist d:\数据库备份\%%a echo d:\数据库备份\%%a
也显示不了10行以外的文件,所以向大家求助,怎么样可以做到不论日期,只要是10行以外的,都全部删除?
谢谢大家
作者: HAT     时间: 2008-7-30 21:46
当小时的值是一位数的时候,前面会有一个空格,你取tokens=4当然会出问题啦。
作者: lhkyzh     时间: 2008-7-31 23:54
恍然大悟,谢谢HAT大哥! 我把文件夹名称换成了”7点49分_2008-07-24",DIR显示出来的内容是:
2008-07-24  07:49    <DIR>          7点49分_2008-07-24
我以为是第四列了,但是无法显示出这一行
作者: lhkyzh     时间: 2008-8-1 00:39
解决了,使用了一句 if /i %tm1% LSS 10 (set tm1=0%time:~1,1%)