Board logo

标题: [已结]批处理自动删除N天之前文件目录 [打印本页]

作者: sziang     时间: 2008-8-18 16:03    标题: [已结]批处理自动删除N天之前文件目录
我是单位的临时网管,备份OA服务器的数据是每天的工作内容之一,现在我是把OA服务器上应当备份的文件夹和文件进行全盘复制到以当天日期命名(如2008-08-18)生成的一个文件夹中(也是批处理,每天自动执行),由于备份的内容赿来赿大(备份一次达27.6G),我想求一个在备份的之前能够自动删除五天之前的备份目录(只保留五天的备份记录即可)的批处理文件,先谢了!我的系统是XP_SP1 [ Last edited by HAT on 2008-10-20 at 23:35 ]

作者: HAT     时间: 2008-8-18 16:26
@echo off
>"%temp%\MyDate.vbs" echo dt=date()-5
>>"%temp%\MyDate.vbs" echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2)
>>"%temp%\MyDate.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do set FiveDay=%%a
for /f %%a in ('dir /b /ad') do (
  if "%%a" lss "%FiveDay%" (
    echo rd /s /q "%%a"
  )
)

作者: sziang     时间: 2008-8-18 17:41
非常感谢HAT朋友的答复!刚刚我将上述批处理放到目录中测试无效。我是在D盘根目录建一个000文件夹,将服务器文件(含目录)备份到此目录中分别生成的2008-08-12至2008-08-18的文件夹之中,现在只想保留2008-08-14之后的,请问怎么操作?不好意思,我是dos盲,请说具体点,再次谢谢!

作者: HAT     时间: 2008-8-18 17:48
@echo off
>"%temp%\MyDate.vbs" echo dt=date()-5
>>"%temp%\MyDate.vbs" echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2)
>>"%temp%\MyDate.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do set FiveDay=%%a
for /f %%a in ('dir /b /ad "D:\000"') do (
  if "%%a" lss "%FiveDay%" (
    rd /s /q "%%a"
  )
)

作者: sziang     时间: 2008-8-18 18:22
测试还是不成功。。。。说具体点,谢了

作者: HAT     时间: 2008-8-18 19:24
把代码保存为xxx.bat 双击运行 把结果贴出来看看
>"%temp%\MyDate.vbs" echo dt=date()-5
>>"%temp%\MyDate.vbs" echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2)
>>"%temp%\MyDate.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do set FiveDay=%%a
for /f %%a in ('dir /b /ad "D:\000"') do (
  if "%%a" lss "%FiveDay%" (
    rd /s /q "D:\000\%%a"
  )
)
pause

作者: abcd     时间: 2008-8-18 20:35
这种东西,论坛早有,就不要回帖和发帖了。

作者: sziang     时间: 2008-8-19 10:10
运行结果,图片已上传 [ Last edited by sziang on 2008-8-19 at 10:34 AM ]

作者: HAT     时间: 2008-8-19 10:47
看不到图片。 先把图片上传到论坛,再把链接放到img标签里面即可。

作者: wangwei4106     时间: 2008-8-19 10:53
来混点积分看高级点的······

作者: sziang     时间: 2008-8-19 15:29
D盘根目录下备份文件夹000 bat文件 bat文件运行情况 [ Last edited by sziang on 2008-8-19 at 03:34 PM ]

作者: HAT     时间: 2008-8-19 15:32
运行6楼的代码,结果贴出来看看

作者: sziang     时间: 2008-8-19 16:35
看到图片了吗,请帮忙

作者: HAT     时间: 2008-8-19 17:21
代码更正如下:
>"%temp%\MyDate.vbs" echo dt=date()-5
>>"%temp%\MyDate.vbs" echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2)
>>"%temp%\MyDate.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do set FiveDay=%%a
for /f "tokens=*" %%a in ('dir /b /ad "D:\000"') do (
  if "%%a" lss "%FiveDay%" (
    rd /s /q "D:\000\%%a"
  )
)
pause

作者: sziang     时间: 2008-8-21 15:47
还是没有用,运行结果和我那天发的一样

作者: flyinspace     时间: 2008-8-21 16:38
。。 [ Last edited by flyinspace on 2008-8-21 at 04:45 PM ]

作者: flyinspace     时间: 2008-8-21 16:42
问下。你生成的文件名是什么? 20080812?之样的?

作者: HAT     时间: 2008-8-21 16:49
顶楼有描述 2008-08-18

作者: flyinspace     时间: 2008-8-21 16:51
现在假设你的文件夹里的文件都是按日期生成的。(我不理是什么文件名了) 千万不要乱自己建立文件夹了哦。:)嘿嘿。 那么给你一个简单的代码。不过不太安全,你要保证里面的文件不可以乱 下面是一句话代码 skip 是指跳过前 5 条
for /f "skip=5 tokens=* " %%i in ('dir /b /o-d /ad-h-s') do echo 要删除的文件名为:[%%i],语法格式: [rd /s /q "%%i"]
这里的代码可以测试,如果你发现满足你的条件。那么你就可以把rd那里的东西取出来了。。。。 记得,上面的条件是需要满足你说的每天建立一个备份文件夹的情况下才可以使用的。。而且该备份文件夹里不可以有其他的文件夹了。只能存在备份的文件。。 [ Last edited by flyinspace on 2008-8-21 at 04:59 PM ]

作者: terse     时间: 2008-8-21 18:01
翻个老贴给你 不知道时间格式和你对不
@echo off
set TT=5&set "ph=d:\000"
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
    if %p3% gtr %TT%  goto ppp
:nxt
set/a p2-=1
   if %p2% equ 0 set/a p1-=1,p2=12
   set/a PN2="!(p1%%4)&!(!(p1%%100))|!(p1%%400)",PN2=28+PN2
   for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3+=%%i
   if %p3% leq %tt% goto nxt
:ppp
set/a p3-=tt
setlocal enabledelayedexpansion
   for %%i in (p2 p3) do if !%%i! lss 10 set %%i=0!%%i!
     for /f "skip=7 tokens=1,3*" %%i in ('dir /ad /tc "%ph%" 2^>nul^|find /v "字节"') do (
       if %p1%-%p2%-%p3% gtr %%i rd /s /q "%ph%\%%k"
)
pause&exit

作者: qwertl     时间: 2008-8-23 22:46
vbs文件是否在windows98、xp\2000\2003系统下都可以运行的? HAT的自动删N日前文件VBS似懂非懂 -------------------------------------------------------------------------------- 我要在win2000下自动删除目录rardata下的15天前的文件,要怎样改呢?win2003下有forfile是比较方便. @echo off >"%temp%\MyDate.vbs" echo dt=date()-5 >>"%temp%\MyDate.vbs" echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2) >>"%temp%\MyDate.vbs" echo wscript.echo s for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do set FiveDay=%%a for /f %%a in ('dir /b /ad "D:\000"') do ( if "%%a" lss "%FiveDay%" ( rd /s /q "%%a" ) ) [ Last edited by qwertl on 2008-8-23 at 10:56 PM ]

作者: HAT     时间: 2008-8-23 23:32    标题: Re 21楼
@echo off
setlocal enabledelayedexpansion
set SrcDir=D:\rardata
>"%tmp%\MyDel.vbs" echo dt=date()-15
>>"%tmp%\MyDel.vbs" echo s=right(year(dt),4) ^& right("0" ^& month(dt),2) ^& right("0" ^& day(dt),2)
>>"%tmp%\MyDel.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%tmp%\MyDel.vbs"') do set DateFlag=%%a
for /f "tokens=*" %%a in ('dir /s /b /a-d "%SrcDir%"') do (
  set FileDate=%%~ta
  set FileDate=!FileDate:-=!
  set FileDate=!FileDate:~0,8!
  if !FileDate! lss %DateFlag% (
    del /f /q "%%a"
  )
)

作者: qwertl     时间: 2008-8-24 18:58
win2000的%data%是这样格式: 星期日 2008-08-24

作者: HAT     时间: 2008-8-24 20:05    标题: Re 23楼
还不知道怎样修改这个吗?可以看看set的帮助。
@echo off
setlocal enabledelayedexpansion
set SrcDir=D:\rardata
>"%tmp%\MyDel.vbs" echo dt=date()-15
>>"%tmp%\MyDel.vbs" echo s=right(year(dt),4) ^& right("0" ^& month(dt),2) ^& right("0" ^& day(dt),2)
>>"%tmp%\MyDel.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%tmp%\MyDel.vbs"') do set DateFlag=%%a
for /f "tokens=*" %%a in ('dir /s /b /a-d "%SrcDir%"') do (
  set FileDate=%%~ta
  set FileDate=!FileDate:-=!
  set FileDate=!FileDate:~4,10!
  if !FileDate! lss %DateFlag% (
    del /f /q "%%a"
  )
)

作者: qwertl     时间: 2008-8-24 22:31
谢谢HAT的耐心指点! 现在看正找到延迟变量的内容,批处理的内容也真不少。 如果要执行的批处理不存放在D:\rardata目录下,for /f "tokens=*" %%a in ('dir /s /b /a-d "%SrcDir%"') 的dir后要指定删去文件的目录路径吧? 这两句是起什么作用呢? s=right(year(dt),4) ^& right("0" ^& month(dt),2) ^& right("0" ^& day(dt),2) wscript.echo s [ Last edited by qwertl on 2008-8-24 at 10:46 PM ]

作者: HAT     时间: 2008-8-24 23:06
批处理放在什么地方都行,因为数据的目录是这里指定的: set SrcDir=D:\rardata s=right(year(dt),4) ^& right("0" ^& month(dt),2) ^& right("0" ^& day(dt),2) wscript.echo s 调用VBS获取格式化的系统日期: www.cn-dos.net/forum/viewthrea ...

作者: AppleWolf     时间: 2008-8-25 20:47
这个我写好了,用的方法比较老套
set usbdisk=E:
set befor2days=
set nowdate=

echo wscript.echo dateadd("d",-2,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
if %m% LSS 9 set m=0%m%
if %d% LSS 9 set d=0%d%
set/a befor2days=%y%%m%%d%

echo wscript.echo dateadd("d",-0,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
if %m% LSS 9 set m=0%m%
if %d% LSS 9 set d=0%d%
set/a nowdate = %y%%m%%d%

........中间省略,日期整理为:20080825 这种格式,并以此为目录。

dir %usbdisk%\ /ad/on/b>%tmp%\usbdir.tmp
for /f "delims=" %%i in (%tmp%\usbdir.tmp) do (
			if %%i lss %befor2days% (
															rd /s/q %usbdisk%\%%i
															)
下面是判断是否是2天前的,如果是,就删,如果不是,就跳过。 希望各位高手不要笑我,我解决的办法有点笨。

作者: qwertl     时间: 2008-9-15 02:09
我们经常要在日常的工作中查找文件,要说linux下最强大的文件查找工具,非find莫属。find可以从文件名、读取修改时间、大小、类型等等来筛选文件,可以完成日常几乎所有的查找需求。   来看一个简单的例子:   find /tmp/ -name 'galeki*'   意思就是在/tmp目录下找出以“galeki”开头的文件,-name指出是对文件名进行筛选,是不是很简单明了?除了文件名,find还有更强大的筛选条件:   1.时间: 参数 意义 -atime n 上一次存取时间在n*24小时前以内的文件 用linux的find来实现是简单 -ctime n 上一次状态改变在n*24小时前以内的文件 -mtime n 上一次修改时间在n*24小时前以内的文件 -newer file 比file所指的文件还要新的文件

作者: yuehong     时间: 2008-10-20 23:28
没一个测试成功的。。 2000的时间格式为: 当前日期: 2008-10-20 星期一 希望哪位高手给个完整的

作者: dddyjq1     时间: 2008-10-21 01:15
翻个老贴给你 ,测试成功的 @echo off SET TT=1 set p1=%date:~0,4% set p2=%date:~5,2% set p3=%date:~8,2% setlocal enabledelayedexpansion for /l %%a in (1,1,3) do ( for /f "delims=0 tokens=*" %%i in ("!p%%a!") do set p%%a=%%i ) if %p3% gtr %TT% goto ppp :nxt set/a p2-=1 if %p2% equ 0 set/a p1-=1&&set p2=12 SET/a PN1=%p1%%%4 set PN2=28 if %PN1% EQU 0 set pN2=29 for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3=%p3%+%%i if %p3% leq %tt% goto nxt :ppp set/a p3=%p3%-%tt% set p2=0%p2% set p2=%p2:~-2,2% set p3=0%p3% set p3=%p3:~-2,2% for /r "C:\新建文件夹\" %%i in (*.*) do set t=%%~ti &&call :loop "%%~fi" pause goto :eof :loop if not "%~1" == "%~f0" ( IF %p1%%p2%%p3% gtr %t:~0,4%%t:~5,2%%t:~8,2% del %1 )

作者: yuehong     时间: 2008-10-21 18:38
Originally posted by dddyjq1 at 2008-10-21 01:15 AM: 翻个老贴给你 ,测试成功的 @echo off SET TT=1 set p1=%date:~0,4% set p2=%date:~5,2% set p3=%date:~8,2% setlocal enabledelayedexpansion for /l %%a in (1,1,3) do ( for /f "del ...
2000下面还是不行 出现: 此时不应有 "。 此时不应有 "。 此时不应有 "。 此时不应有 "。 此时不应有 "。

作者: terse     时间: 2008-10-21 19:48
我这边的情况:
@echo off
set TT=5&set "ph=d:\000"
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
    if %p3% gtr %TT%  goto ppp
:nxt
set/a p2-=1
   if %p2% equ 0 set/a p1-=1,p2=12
   set/a PN2="!(p1%%4)&!(!(p1%%100))|!(p1%%400)",PN2=28+PN2
   for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3+=%%i
   if %p3% leq %tt% goto nxt
:ppp
set/a p3-=tt
setlocal enabledelayedexpansion
   for %%i in (p2 p3) do if !%%i! lss 10 set %%i=0!%%i!
     for /f "skip=7 tokens=1,3*" %%i in ('dir /ad /tc "%ph%" 2^>nul^|find /v "字节"') do (
       if %p1%-%p2%-%p3% gtr %%i echo rd /s /q "%ph%\%%k"
)
pause&exit
附件 1: aaa.gif (2008-10-21 19:48, 4.97 KiB, 下载附件所需积分 1点 )



作者: yuehong     时间: 2008-10-21 22:09
Originally posted by terse at 2008-10-21 07:48 PM: 我这边的情况: [code] @echo off set TT=5&set "ph=d:\000" for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%% ...
测试成功,感谢!! 要是d:\000下面的文件也要删除呢?怎么处理?麻烦了。。。

作者: terse     时间: 2008-10-21 23:13
Originally posted by yuehong at 2008-10-21 22:09: 测试成功,感谢!! 要是d:\000下面的文件也要删除呢?怎么处理?麻烦了。。。
其实这个就是我20楼 给你的 你竟然顶到这里 删文件 你要先dir /a-d /b 然后 判断时间 后 del

作者: aphasia     时间: 2008-10-27 16:18
很好啊

作者: qwertl     时间: 2008-11-3 11:56
在win2003下正常删 set FileDate=2008-10-27 22:20 set FileDate=!FileDate:-=! set FileDate=!FileDate:~0,8! if !FileDate! LSS 20081018 (echo ....) 在win2000下要怎样改这个代码呢? set FileDate=08-10-22 17:56 set FileDate=!FileDate:-=! set FileDate=!FileDate:~0,8! if !FileDate! LSS 20081023 (echo ....) set desfolder=e:\rardata setlocal enabledelayedexpansion >"%tmp%\MyDel.vbs" echo dt=date()-11 >>"%tmp%\MyDel.vbs" echo s=right(year(dt),4) ^& right("0" ^& month(dt),2) ^& right("0" ^& day(dt),2) >>"%tmp%\MyDel.vbs" echo wscript.echo s for /f %%a in ('cscript /nologo "%tmp%\MyDel.vbs"') do set DateFlag=%%a echo %DateFlag% pause for /f "tokens=*" %%a in ('dir /s /b /a-d "%desfolder%"') do ( set FileDate=%%~ta 这里取得的文件日期与xp 及2003不同. set FileDate=!FileDate:-=! set FileDate=!FileDate:~0,8! if !FileDate! lss %DateFlag% ( echo "%%a" ) ) pause