中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » (已结)如果在WINDOWS下DOS命令行删除N天以前的文件
« [1] [2] [3] »
作者:
标题: (已结)如果在WINDOWS下DOS命令行删除N天以前的文件 上一主题 | 下一主题
songyujob
初级用户





积分 25
发帖 6
注册 2005-8-25
状态 离线
『楼 主』:  (已结)如果在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 ]

2005-8-25 10:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
songyujob
初级用户





积分 25
发帖 6
注册 2005-8-25
状态 离线
『第 2 楼』:  

没人知道吗?

2005-8-25 11:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

Re songyujob:

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



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-8-25 11:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 4 楼』:  

我反问楼主一下,知道如何提问吗?

我的签名中有答案。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-8-25 12:06
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
songyujob
初级用户





积分 25
发帖 6
注册 2005-8-25
状态 离线
『第 5 楼』:  



  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 ]

2005-8-25 13:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
songyujob
初级用户





积分 25
发帖 6
注册 2005-8-25
状态 离线
『第 6 楼』:  



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

我的签名中有答案。

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

[ Last edited by songyujob on 2005-8-25 at 13:53 ]

2005-8-25 13:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 7 楼』:  

话都已经骂出口了,还有什么不好意思的。我不是谁,但至少在论坛里比你懂规矩的多。我倒可以反问你:你以为你是谁?

说话酸溜溜是个人的风格,试问我说错了什么?是不是想帮助你解决问题呢?



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-8-25 17:19
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 8 楼』:  

我试了一下,这个命令对楼主解决问题是有帮助的:

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



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-8-25 17:38
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 9 楼』:  

Re songyujob:

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

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

      2、使用日期标记:首先建立从今天起前7个日期的标记,可能是文件,也可能是环境变量。然后在程序执行开始时,判断这些标记是否在今天被更新,如果未被更新则建立今天的标记,删除最早期的标记,如果更新则跳过此步;然后判断要处理的文件日期是否匹配这些标记,如果匹配则保留,否则删除。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-8-25 18:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
songyujob
初级用户





积分 25
发帖 6
注册 2005-8-25
状态 离线
『第 10 楼』:  

其实在AIX系统上很容易实现,find .... -mtime +N,所以突发奇想在WINDOWS服务器上来自动实现对DB2归档日志的删除,看来要写个小程序实现了,用DOS带的命令会比较困难些!

[ Last edited by songyujob on 2005-8-26 at 10:39 ]

2005-8-26 10:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

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 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-8-26 12:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
songyujob
初级用户





积分 25
发帖 6
注册 2005-8-25
状态 离线
『第 12 楼』:  

非常感谢!非常!

2005-8-26 13:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 13 楼』:  

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 ]



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-8-26 18:04
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 14 楼』:  



  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

强啊!!!



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-8-26 19:00
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 15 楼』:  

Re Climbing:

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

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

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

[ Last edited by willsort on 2005-8-26 at 19:33 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-8-26 19:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: