中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 备份文件,并且只保留最近几次的备份
作者:
标题: 备份文件,并且只保留最近几次的备份 上一主题 | 下一主题
lhkyzh
初级用户





积分 34
发帖 12
注册 2006-6-4
状态 离线
『楼 主』:  备份文件,并且只保留最近几次的备份

小弟使用的数据库虽然有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行以外的,都全部删除?
谢谢大家

2008-7-30 21:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

当小时的值是一位数的时候,前面会有一个空格,你取tokens=4当然会出问题啦。



2008-7-30 21:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lhkyzh
初级用户





积分 34
发帖 12
注册 2006-6-4
状态 离线
『第 3 楼』:  

恍然大悟,谢谢HAT大哥! 我把文件夹名称换成了”7点49分_2008-07-24",DIR显示出来的内容是:
2008-07-24  07:49    <DIR>          7点49分_2008-07-24
我以为是第四列了,但是无法显示出这一行

2008-7-31 23:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lhkyzh
初级用户





积分 34
发帖 12
注册 2006-6-4
状态 离线
『第 4 楼』:  

解决了,使用了一句 if /i %tm1% LSS 10 (set tm1=0%time:~1,1%)

2008-8-1 00:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: