Board logo

标题: (已结)如果在WINDOWS下DOS命令行删除N天以前的文件 [打印本页]

作者: songyujob     时间: 2005-8-25 10:47    标题: (已结)如果在WINDOWS下DOS命令行删除N天以前的文件

请教:如果在WINDOWS下DOS命令行删除N天以前的某些文件?谢谢!

---------- Edited by willsort  ----------
解决方案如下(总的解题方向在9楼):
1、set /a将日期与相对天数进行相互换算,以求得差值日期(22楼);
2、每日运行以不断更新日期列表,取列表前的最早日期为差值日期(11楼);
3、采用第三方工具进行差值日期的获取与比较(zybird,17、19楼);
另外,删除固定日期前文件的代码也已完成(Climbing,13楼)。
---------- Edited by willsort ----------


[ Last edited by willsort on 2005-9-2 at 15:35 ]
作者: songyujob     时间: 2005-8-25 11:30
没人知道吗?
作者: willsort     时间: 2005-8-25 11:36
Re songyujob:

      请告知你使用的Windows的版本。另外,请说明N天以前是特指的某些日期,还是通指的前N天?
作者: Climbing     时间: 2005-8-25 12:06
我反问楼主一下,知道如何提问吗?

我的签名中有答案。
作者: songyujob     时间: 2005-8-25 13:48


  Quote:
Originally posted by willsort at 2005-8-25 11:36:
Re songyujob:

      请告知你使用的Windows的版本。另外,请说明N天以前是特指的某些日期,还是通指的前N天?

是命令执行时间点时 前N天的文件,比如删除8天前的所有文件。是通指8天前,没有具体指是哪些文件!
windows 2000 server or windows 2003 server
3KS!!

[ Last edited by songyujob on 2005-8-25 at 13:51 ]
作者: songyujob     时间: 2005-8-25 13:52


  Quote:
Originally posted by Climbing at 2005-8-25 12:06:
我反问楼主一下,知道如何提问吗?

我的签名中有答案。

不好意思!首先BS你这样的人,说话酸溜溜的,你以为你是谁呀!

[ Last edited by songyujob on 2005-8-25 at 13:53 ]
作者: Climbing     时间: 2005-8-25 17:19
话都已经骂出口了,还有什么不好意思的。我不是谁,但至少在论坛里比你懂规矩的多。我倒可以反问你:你以为你是谁?

说话酸溜溜是个人的风格,试问我说错了什么?是不是想帮助你解决问题呢?
作者: Climbing     时间: 2005-8-25 17:38
我试了一下,这个命令对楼主解决问题是有帮助的:

for /f "tokens=*" %f in ('dir /b/s') do @if %~tf LSS 2005-08-17 echo %~tf %f
作者: willsort     时间: 2005-8-25 18:47
Re songyujob:

      先发解题思路,具体代码限于个人原因可能需要等几天。

      1、使用日期计算:计算得到有效的应保留的文件的七天日期,然后对应每个文件的日期进行判断;日期计算可以采用专门的第三方程序,比如date,也可以用set /a进行计算,不过在计算年与月的进位时可能会遇到一些麻烦。

      2、使用日期标记:首先建立从今天起前7个日期的标记,可能是文件,也可能是环境变量。然后在程序执行开始时,判断这些标记是否在今天被更新,如果未被更新则建立今天的标记,删除最早期的标记,如果更新则跳过此步;然后判断要处理的文件日期是否匹配这些标记,如果匹配则保留,否则删除。
作者: songyujob     时间: 2005-8-26 10:37
其实在AIX系统上很容易实现,find .... -mtime +N,所以突发奇想在WINDOWS服务器上来自动实现对DB2归档日志的删除,看来要写个小程序实现了,用DOS带的命令会比较困难些!

[ Last edited by songyujob on 2005-8-26 at 10:39 ]
作者: willsort     时间: 2005-8-26 12:06
Re songyujob:

      按思路2整理出的代码,需要你做全面的测试。
:: DateDel.bat - 演示删除7日前(含第7日前)修改的文件
:: Will Sort - 2005-8-26 - CMD@WinXP
:: Note: 不要将此批处理文件置于需要选择删除文件的目录中
::       程序只是进行了删除演示,若演示无误,删除del前面的echo即可正常执行
::       如果首次执行的日期不是2005-8-26,则需调整第四行代码中的保留日期列表
::       程序需要每日运行至少一次,以便自动更新日期列表
@echo off
if "%1"==":" goto %2
if exist %temp%.\_DateDel.bat %temp%.\_DateDel.bat
%0 : Update 2005-08-20 2005-08-21 2005-08-22 2005-08-23 2005-08-24 2005-08-25 2005-08-26

:Update
setlocal EnableExtensions
set today=%date:~0,10%
if not "%today%"=="%9" %0 : Update %4 %5 %6 %7 %8 %9 %today%
echo %0 : Update %3 %4 %5 %6 %7 %8 %9 >%temp%.\_DateDel.bat

:Delete
for /r %%f in (*.*) do if "%%~tf" LEQ "%3" echo del "%%f"

:End
[ Last edited by willsort on 2005-8-26 at 19:18 ]
作者: songyujob     时间: 2005-8-26 13:51
非常感谢!非常!
作者: Climbing     时间: 2005-8-26 18:04
Re willsort:

你的批处理是不是每次运行前都要调整一下保留日期列表呢?如果是这样,那就太麻烦了,还不如我前面那一条命令来得简洁。
:: DelOldFile.cmd - 演示删除指定日期前的所有文件
:: Climbing - 2005-8-26 - CMD@WinXP
@echo off
if "%1"=="" goto _usage
set dst=.\.
if not "%2"=="" if exist %2\. (set dst=%2\.) else (goto _err1)
for /f "tokens=*" %%f in ('dir /b/s %dst%') do if %%~tf LSS %1 del /f /q %%f && echo 删除 %%f
goto _quit

:_usage
echo DelOldFile.cmd   - 删除指定目录指定日期以前的所有文件
echo Version 1.0 Copyleft by Climbing
echo 语法: DelOldFile ^<日期^>  [目标目录]
echo         ^<日期^>   必须指定的参数,日期格式为:%date%,该日期前的文件都会被删除(不含该日期)
echo         [目标目录]  可选参数,指定要删除文件的目录,默认为当前目录
goto _quit

:_err1
echo 错误:指定的%2目录不存在!

:_quit
set dst=
:End
示例:假设今天是8月26日,我要删除2天以前的文件,也就是删除8月23日以前的文件,目标目录是d:\arch,那么用法如下:
DelOldFile 2005-08-23  d:\arch

在Windows 2003的cmd下测试通过。

后记:
经WillSort兄提点,可以将上面的批处理中for /f那一行修改为:
for /r %dst% %%f in (*.*) do if %%~tf LSS %1 del /f /q %%f && echo 删除 %%f
效果是一样的。

[ Last edited by Climbing on 2005-8-26 at 21:38 ]
作者: JonePeng     时间: 2005-8-26 19:00


  Quote:
Originally posted by Climbing at 2005-8-25 17:38:
for /f "tokens=*" %f in ('dir /b/s') do @if %~tf LSS 2005-08-17 echo %~tf %f

强啊!!!
作者: willsort     时间: 2005-8-26 19:17
Re Climbing:

      我在11楼的程序首次运行时需要调整代码中的日期列表,此后需要每日运行一次以自动更新 %TEMP%.\_DateDel.bat 中的日期列表,其中 :Update 段的代码便是用来实现这一任务的。所以它适用于每日运行的批处理程序中。

      发帖后不久,我就注意到忘记将每日运行加入程序注意事项中,只是忙于探索实现思路1的方案,以便一同发出,所以迟迟未改。现在,就在原代码上加上新的注意事项。

      至于你写的代码,我现在还没有看明白你使用 for /f "tokens=*" 而非 for /r 的用意所在,可以解释一下吗?

[ Last edited by willsort on 2005-8-26 at 19:33 ]
作者: Climbing     时间: 2005-8-26 20:17
Re Will Sort:

嘿嘿,之所以我只用for /f,是因为说实在的,我一直没有太搞明白for命令的很多用法,至少我一直就不太明白for /r是什么意思,但刚才我自己试了一下,终于是明白一点儿了,所以我那条命令可以改成:
for /r %dst% %%f in (*.*) do if %%~tf LSS %1 del /f /q %%f && echo 删除 %%f

呵呵,原因就是这么简单,我对技术的追求不象Wil兄那样执着,我的目标就是完成任务就好。说实在的,我对Wil兄写批处理的技巧是打心底里佩服的,但却感觉自己永远也达不到这种水平,而且我觉得Wil兄的批处理技巧是有余了,但实在不容易让人看明白,你楼上那个批处理,直到回这个帖子的时候我才算是看明白了。
作者: zybird     时间: 2005-8-29 13:40
前些天我写了两个Dos下的小程序,刚好可以完成这项任务。

批处理的内容是这样的:
******************************************************
@echo off

rem ============================================
rem 这个批处理的作用是删除d:\datafile里面
rem 最后一次修改是7天之前(不包括7天)的
rem 所有文件(包括所有子目录里的文件)
rem ============================================



rem ============================================
rem 得到7天前的日期
rem 如果今天是8月25,则7天前是日期是 8月18日
rem ============================================
GetInfo.COM /d:-7
set theDay=%year%-%mon%-%day%



rem ============================================
rem   这是在D:\datafile中搜索8天前(含8天)修改过的文件
rem  即8月17日 及 之前 修改的文件
rem ============================================
attrib/s d:\datafile\*.* -h -r -s
:Loop
dirt.com /d:-%theDay% d:\datafile\*.* /q
if %DirtRet%==Fail goto end
del %FPath%\%FName%
goto Loop

:end


******************************************************



里面的DirT.com和GetInfo.com可以到http://www.13886.com/soft//下载,


win2000的Dos里del命令好象有一个参数,可以在删除文件的时候不用用户的确认,你可以在del %FPath%\%FName%里加入那个参数

[ Last edited by zybird on 2006-5-6 at 13:38 ]
作者: Climbing     时间: 2005-8-29 17:02
这两个命令倒挺有意思,也很有用,能不能直接用附件传到这里来,因为那个网址无法访问了。
作者: zybird     时间: 2005-8-29 18:47


  Quote:
Originally posted by Climbing at 2005-8-29 05:02 PM:
这两个命令倒挺有意思,也很有用,能不能直接用附件传到这里来,因为那个网址无法访问了。

在ys168上不知道为什么总是会出现无法下载,现在我上传到这里。

如果使用的过程,有什么疑问或出现什么错误,请告诉我!谢谢!


Getinfo.com 和 dirt.com   可以直接在下面这个网址下载了!!

http://www.13886.com/soft/

[ Last edited by zybird on 2006-5-6 at 13:37 ]
作者: Climbing     时间: 2005-8-29 23:47
谢谢zybird朋友,这两个命令都是用Qbasic开发的吧?
作者: zybird     时间: 2005-8-30 13:10
不客气!

这是用 tc++ 3.0写的
作者: willsort     时间: 2005-9-2 15:25
Re All:

      因为个人原因,一个星期没有来论坛了,发现变化真是不小!现在附上9楼解题思路中1提到的set /a计算日期差值的方案。至于第三方程序,zybird的程序已经很好了,向 zybird 兄致敬。
:: DateDel2.bat - 删除指定路径下指定日数以前修改的文件
:: Will Sort - 2005-9-2 - CMD@WinXP
:: 注意事项:参数%1指定日数,昨天为1,前天为2,依次类推
::           参数%1指定文件路径,省略时将处理当前路径
:: 核心算法:Ritchie Lawrence, updated 2002-08-13. Version 1.1
::
@echo off & setlocal ENABLEEXTENSIONS
call :Date2Day %date:~0,10% sdays
set /a sdays-=%1
call :Day2Date %sdays% difdate
echo 将删除 %cd% 下 %difdate% 前的修改的以下文件:
for /r %2 %%f in (*.*) do if "%%~tf" LEQ "%difdate%" echo "%%f"
goto :EOF

:Date2Day
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (
  set yy=%%a & set mm=%%b & set dd=%%c
)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF

:Day2Date
setlocal ENABLEEXTENSIONS
set /a i=%1,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
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
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%-%mm%-%dd%&goto :EOF

作者: smileseeker     时间: 2005-10-17 19:56
请问下各位大侠
为什么在win2000的命令行下无法显示year mon day 等环境变量?

D:\MULTIT~1\Getinfo>getinfo /d:-2
D:\MULTIT~1\Getinfo>echo %day%
%day%
作者: smileseeker     时间: 2005-10-17 20:10
Quote:
Originally posted by Climbing at 2005-8-25 17:38:
for /f "tokens=*" %f in ('dir /b/s') do @if %~tf LSS 2005-08-17 echo %~tf %f  

强啊!!!



同意!!!

[ Last edited by smileseeker on 2005-10-17 at 20:12 ]
作者: zybird     时间: 2005-10-19 21:10
getinfo.com目前还无法修改cmd.exe中的环境变量,cmd.exe跟dos不一样
作者: tianlei     时间: 2005-11-10 00:20
“for /f "tokens=*" %f in ('dir /b/s') do @if %~tf LSS 2005-08-17 echo %~tf %f”
里面的“%”在这里代表什么呀,请哪位指点一下?
作者: tyh     时间: 2007-6-8 09:35
我靠,看不懂````晕了。
作者: ningshaody     时间: 2007-10-10 10:23    标题: 能不删除文件夹

上面方法删除文件好用,能不能不删除文件夹?
作者: ribood     时间: 2007-10-10 19:24
菜鸟请教地区为英文的操作系统 date显示为10/10/2007 wed 批处理应该怎么写??
作者: lzmuhioin     时间: 2007-10-12 09:54
牛人啊,,,太强了...学得不少
作者: verywondful     时间: 2007-12-10 23:47
真是太强了,这都可以写出来.
总算是来对地方了.真是叹为观止
作者: oicu     时间: 2007-12-11 02:35
可以先用set来设置date的格式。

  Quote:
Originally posted by ribood at 2007-10-10 07:24 PM:
菜鸟请教地区为英文的操作系统 date显示为10/10/2007 wed 批处理应该怎么写??


作者: aspirer     时间: 2007-12-11 20:58
Windows 03 server 不是有一个 forfiles 吗?
省去这么多麻烦
作者: fzp1978321     时间: 2008-2-3 01:27
里面的DirT.com和GetInfo.com可以到http://www.13886.com/soft//下载,


这个地址已经无效了吧,这两个参数怎么得到呢?
作者: yuehong     时间: 2008-7-16 13:58


  Quote:
Originally posted by aspirer at 2007-12-11 08:58 PM:
Windows 03 server 不是有一个 forfiles 吗?
省去这么多麻烦

2000下面无法使用!


DirT.com和GetInfo.com

测试在2000下面使用也不正常!!!!

[ Last edited by yuehong on 2008-10-21 at 21:09 ]
作者: pretty1225     时间: 2009-7-28 06:06
新手上路,好多都不太明白.多學習,謝謝!
作者: asp     时间: 2009-8-12 23:15
叹为观止,好贴
作者: mwm5     时间: 2009-10-22 12:23


  Quote:
Originally posted by yuehong at 2008-7-16 13:58:


2000下面无法使用!


DirT.com和GetInfo.com

测试在2000下面使用也不正常!!!!

[ Last edited by yuehong on 2008-10-21 at 21:09 ]

2003下的forfiles直接拷贝到2000或者xp就可以了的。。呵呵
作者: mwm5     时间: 2009-10-22 12:28


  Quote:
Originally posted by Climbing at 2005-8-25 17:38:
我试了一下,这个命令对楼主解决问题是有帮助的:

for /f "tokens=*" %f in ('dir /b/s') do @if %~tf LSS 2005-08-17 echo %~tf %f

经测试%~tI扩展所返回的时间相当于 dir /tw返回的时间,也就是相当于last modified的时间,呵呵

如果限定是n天前创建,或者n天没有访问(使用 )过的文件呢?

问题可能复杂一些了~~
作者: liweish1     时间: 2010-5-20 16:35
加油,我啥 时候也有这水平就好了!

先拿走!!!!