Board logo

标题: [文件操作] 批处理如何删除某目录下的固定文件夹中指定日期的规则文件?[结帖] [打印本页]

作者: lky216    时间: 2013-4-10 22:16     标题: 批处理如何删除某目录下的固定文件夹中指定日期的规则文件?[结帖]

本帖最后由 lky216 于 2013-4-30 15:50 编辑

公司的一些计算机,有一个D:\user\,是客户的文件夹集合,里面都是客户设置的英文名称的子文件夹,各个客户(例:A;B;AAC)的目录下又有两个文件夹,1:log,2:doc
现在由于log日志占用了很大的空间,想删除指定日期前的log文件,

由于doc文件夹可能过多的文件,现在想直接在D:\user中,直接搜索log文件夹下的指定日期之前的ex*.log日志文件删除,保留这个日期之后的日志文件。而不搜索doc,从而提高运行效率。
或者是直接搜索,D:\user\*\log这个意思的,doc文件夹实在大

我是新手,只操作了搜索D:\user整个目录的,有800个客户,运行了8分钟才操作了一部分。
我在C盘测试,用了一秒就删除了测试用的ex*.log文件,可见D:\user有太多东西了。

我用论坛里的代码:
  1. @echo off
  2. ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  3. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  4. ::本例调用了临时VBS代码进行日期计算,并统一设置系统日期格式,处理完毕
  5. ::之后再把日期格式恢复成原来的状态。摆脱了对reg命令(XP系统自带)的依赖。
  6. rem 指定待删除文件的存放路径
  7. set SrcDir=C:\Test\BatHome
  8. rem 指定天数
  9. set DaysAgo=1
  10. >"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  11. >>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control Panel\International\sShortDate")
  12. for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (
  13.     set "RegDateOld=%%a"
  14. )
  15. >"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  16. >>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"
  17. cscript /nologo "%temp%\UnifyDate.vbs"
  18. >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
  19. >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  20. >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
  21. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  22.     set "DstDate=%%a"
  23. )
  24. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  25. for /r "%SrcDir%" %%a in (*.*) do (
  26.     if "%%~ta" leq "%DstDate%" (
  27.         if exist "%%a" (
  28.             echo del /f /q "%%a"
  29.         )
  30.     )
  31. )
  32. >"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  33. >>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"
  34. cscript /nologo "%temp%\RecoverDate.vbs"
  35. pause
复制代码
27楼结帖子
作者: lky216    时间: 2013-4-10 22:18

在此先谢谢各位了,如果可以的话 帮忙指点下 感激不尽
作者: BAT-VBS    时间: 2013-4-11 18:30

你这个代码是从哪里抄的?是不是抄漏了一部分
作者: lky216    时间: 2013-4-12 14:20

回复 3# BAT-VBS

不好意思 少了一行,我重新弄了,这个是从论坛复制的源文件,
我只是修改了路径和天数,以及echo去掉,就是没有显示要删除的文件了,直接删除了的意思
还有文件*.*我改为ex*.log
作者: BAT-VBS    时间: 2013-4-12 21:26

回复 4# lky216


    然后呢?你的问题是什么呢?
作者: terse    时间: 2013-4-13 18:35

本帖最后由 terse 于 2013-4-13 18:38 编辑

试试WMIC 日期问题不通用
  1. @echo off
  2. set "fd=20130101"
  3. set "ph=D:\user\log\"
  4. for /f "tokens=*" %%i in ("%ph%") do set d=%%~di&set "p=%%~pi"
  5. wmic datafile where "drive='%d%' and path='%p:\=\\%' and FileName like 'ex%%' and extension='log' and LastModified<'%fd%'" call delete
复制代码

作者: lky216    时间: 2013-4-14 12:35

回复 5# BAT-VBS

我应该写得有清楚了吧,就是清理日志文件。因为一个客户一天一个日志,也挺多的空间占用
全文件夹下搜索太慢,因为doc很多文件。
就是直接跳过doc去搜索log的
作者: lky216    时间: 2013-4-14 12:35

回复 6# terse

谢谢 我吃饭完就试试看
作者: lky216    时间: 2013-4-14 14:57

回复 6# terse

这个路径是不是有点问题,800多个客户,甚至是1300多个,
D:\user\A_client\log\
D:\user\A_client\doc\
不要搜索D:\user\A_client\doc\这个类似的目录的
客户有很多。A_client client_Z  XIAMEN_liworld 等等不固定的客户名字。我之前有说了。
是log doc是固定的
作者: terse    时间: 2013-4-14 16:04

回复 9# lky216
这个是绝对路径 "D:\user\log\"
也就是代码只操作 "D:\user\log\"里  log 文件
作者: pclshuke    时间: 2013-4-14 16:11

顶楼主的小屁屁。
作者: lky216    时间: 2013-4-14 16:12

回复 10# terse
没有这个文件夹,只有d:\user\clinet_name\log
作者: lky216    时间: 2013-4-14 16:17

回复 11# pclshuke


    你会被和谐的
作者: BAT-VBS    时间: 2013-4-14 16:38

回复 12# lky216
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "fd=20130101"
  4. for /d %%a in ("D:\user\*") do (
  5.     for /f "tokens=*" %%i in ("%%a\log") do (
  6.         set "d=%%~di"
  7.         set "p=%%~pi"
  8.     )
  9.     wmic datafile where "drive='!d!' and path='!p:\=\\!' and FileName like 'ex%%' and extension='log' and LastModified<'%fd%'" call delete
  10. )
复制代码

作者: lky216    时间: 2013-4-14 19:57

回复 14# BAT-VBS


    我试试看,中午用了10帖,不能回复,忘记了
作者: lky216    时间: 2013-4-14 21:36

回复 14# BAT-VBS

我弄了,打开提示 无可用范例
后来把enable那行去掉,提示

错误:
代码 = 0x80041017
说明 = 无效查询
设备 = WMI
错误:
代码 = 0x80041017
说明 = 无效查询
设备 = WMI
作者: terse    时间: 2013-4-14 23:10

回复 16# lky216
不行的话 只能FOR里比较文件时间后 DEL
作者: lky216    时间: 2013-4-14 23:13

回复 17# terse

主要是跳过doc这个目录 不要搜索这个目录
其他的我就不懂了,我是小白,
作者: terse    时间: 2013-4-15 00:06

回复 18# lky216
这个呢?
代码如正常显示 去掉最后的 ECHO
运行前先备份
  1. @echo off
  2. set "fd=20130415000000"
  3. set "d=d:"
  4. set "p=\user\"
  5. set "ext=log"
  6. for /f "tokens=*" %%p in ('dir /b /ad "%d%%p%"') do (
  7.     for /f "skip=1 tokens=1*" %%i in ('wmic datafile where "drive='%d%' and path='%p:\=\\%%%p\\log\\' and FileName like 'ex%%' and extension='%ext%'" get name^,LastModified') do (
  8.         for /f "tokens=1,2* delims=. " %%a in ("%%i %%j") do (
  9.            if "%%a" lss "%fd%" echo del "%%~fc"
  10.         )
  11.     )
  12. )
  13. pause
复制代码

作者: lky216    时间: 2013-4-16 08:40

回复 19# terse


    十分感谢。如遇特殊情况需要再次麻烦您修改的,可以付费。
作者: BAT-VBS    时间: 2013-4-16 13:16

回复 20# lky216


    下次去『有偿求助区』发帖吧
作者: lky216    时间: 2013-4-16 14:02

本帖最后由 lky216 于 2013-4-16 14:11 编辑

回复 19# terse
没去掉echo的话,是正常的。中文的:"复件 ex20130415.log"就没有被删除,这个大概知道,是只查找英文的,我这边也是全英文的ex*.log
   
另外,把我批处理的同级目录文件删除了,在盘符根目录的三四个文件都删除了。去掉echo的话。- -
作者: lky216    时间: 2013-4-16 14:03

本帖最后由 lky216 于 2013-4-16 14:41 编辑

回复 21# BAT-VBS


    不好结算。说给*元,怕到时候要修改。如果运行的时候,没有满足所说的功能的话,要修改
作者: BAT-VBS    时间: 2013-4-16 14:16

回复 23# lky216


改功能就加钱呗
功能没实现就减钱或者不给钱呗
这有什么不好结算的
你发帖时说给50,最后你愿意给500,又不会有人拦着你。
作者: terse    时间: 2013-4-16 14:35

回复 22# lky216
你什么环境  按理 ECHO 正常的话 不会删除同级目录下文件 WMIC 处理 NAME 是绝对路径的
方便的话 贴下 ECHO 结果
作者: lky216    时间: 2013-4-18 16:10

回复 25# terse


    最近忙死了。。。不好意思,一会我这边测试看看下给您回复。
作者: lky216    时间: 2013-4-30 15:47

本帖最后由 lky216 于 2013-4-30 16:05 编辑

回复 25# terse


    文件夹 PATH 列表
卷序列号为 E094-8C28
C:.
│  1.txt
│  
└─user
    │  新建 文本文档.txt
    │  
    ├─liky
    │  │  新建 文本文档.txt
    │  │  
    │  ├─doc
    │  └─log
    │          ex20130430.log
    │         
    └─wxh
        │  新建 文本文档.txt
        │  
        ├─doc
        │      新建 文本文档.txt
        │      
        └─log
                ex20130430.log
            代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "fd=20130501000000"
  4. set "d=c:"
  5. set "p=\user\"
  6. set "ext=log"
  7. for /f "tokens=*" %%p in ('dir /b /ad "%d%%p%"') do (
  8.     for /f "skip=1 tokens=1*" %%i in ('wmic datafile where "drive='%d%' and path='%p:\=\\%%%p\\log\\' and FileName
  9. like 'ex%%' and extension='%ext%'" get name^,LastModified') do (
  10.         for /f "tokens=1,2* delims=. " %%a in ("%%i %%j") do (
  11.            if "%%a" lss "%fd%" echo del "%%~fc"
  12.         )
  13.     )
  14. )
  15. pause
复制代码
echo结果
  1. del "c:\user\liky\log\ex20130430.log"
  2. del "c:\user\wxh\log\ex20130430.log"
  3. 请按任意键继续. . .
复制代码
可以了,去掉echo也可以了,谢谢。
当初显示和删除不一样。。。
标记下,日后回报。

另外,每N个客户如果没有日志文件的话,就会回显一行 无可用范例
把del的文件,echo保存为deldate.txt日志咯?
作者: CrLf    时间: 2013-4-30 19:47

linux 的 find.exe 可以这样:
  1. find.exe 目录 -mtime +40
  2. rem 搜索目录下修改日期在 40 天前的文件
复制代码

作者: apang    时间: 2013-4-30 21:01

这样可以不?
  1. @echo off
  2. for /f "delims=" %%a in ('xcopy /d:05-01-2013 /ls *.log c:\') do set "%%a=1"
  3. for /r %%a in (*.log) do if not defined %%a echo %%a
  4. Rem 查找2013年5月1日之前修改的文件
  5. pause
复制代码

作者: lky216    时间: 2013-4-30 21:31

回复 28# CrLf


  谢谢,总是能学习到一些东东,从前辈这里。
  exe的,我搜索怎么说是微软的
作者: lky216    时间: 2013-4-30 21:31

回复 29# apang


    我是新手啊,看不太懂,不过我保存了。。
作者: CrLf    时间: 2013-4-30 22:05

回复 30# lky216


    同名同姓
作者: Demon    时间: 2013-4-30 22:09

回复  lky216


    同名同姓
CrLf 发表于 2013-4-30 22:05


你还真把头像反色了啊
作者: lky216    时间: 2013-4-30 22:11

回复 33# Demon


    没有吧。。。他弄GIF图就潮了,两色变换中。。。
作者: CrLf    时间: 2013-5-1 01:16

回复 33# Demon


    咦?老兄难道不使用缓存,怎么这么快就发现了...
    赶脚他说得有道理,就反了一下,唔,如此果然更有色狼啸月的味道




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2