标题: [文件操作] 批处理如何删除某目录下的固定文件夹中指定日期的规则文件?[结帖] [打印本页]
作者: 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有太多东西了。
我用论坛里的代码:- @echo off
-
- ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
-
- ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
-
- ::本例调用了临时VBS代码进行日期计算,并统一设置系统日期格式,处理完毕
-
- ::之后再把日期格式恢复成原来的状态。摆脱了对reg命令(XP系统自带)的依赖。
-
-
-
- rem 指定待删除文件的存放路径
-
- set SrcDir=C:\Test\BatHome
-
- rem 指定天数
-
- set DaysAgo=1
-
- >"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
-
- >>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control Panel\International\sShortDate")
-
- for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (
-
- set "RegDateOld=%%a"
-
- )
-
- >"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
-
- >>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"
-
- cscript /nologo "%temp%\UnifyDate.vbs"
-
- >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
-
- >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
-
- >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
-
- for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
-
- set "DstDate=%%a"
-
- )
-
- set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
-
- for /r "%SrcDir%" %%a in (*.*) do (
-
- if "%%~ta" leq "%DstDate%" (
-
- if exist "%%a" (
-
- echo del /f /q "%%a"
-
- )
-
- )
-
- )
-
- >"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
-
- >>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"
-
- cscript /nologo "%temp%\RecoverDate.vbs"
-
- 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 日期问题不通用- @echo off
- set "fd=20130101"
- set "ph=D:\user\log\"
- for /f "tokens=*" %%i in ("%ph%") do set d=%%~di&set "p=%%~pi"
- 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 - @echo off
- setlocal enabledelayedexpansion
- set "fd=20130101"
- for /d %%a in ("D:\user\*") do (
- for /f "tokens=*" %%i in ("%%a\log") do (
- set "d=%%~di"
- set "p=%%~pi"
- )
- wmic datafile where "drive='!d!' and path='!p:\=\\!' and FileName like 'ex%%' and extension='log' and LastModified<'%fd%'" call delete
- )
复制代码
作者: 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
运行前先备份- @echo off
- set "fd=20130415000000"
- set "d=d:"
- set "p=\user\"
- set "ext=log"
- for /f "tokens=*" %%p in ('dir /b /ad "%d%%p%"') do (
- 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 (
- for /f "tokens=1,2* delims=. " %%a in ("%%i %%j") do (
- if "%%a" lss "%fd%" echo del "%%~fc"
- )
- )
- )
- 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
代码- @echo off
- setlocal enabledelayedexpansion
- set "fd=20130501000000"
- set "d=c:"
- set "p=\user\"
- set "ext=log"
- for /f "tokens=*" %%p in ('dir /b /ad "%d%%p%"') do (
- 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 (
- for /f "tokens=1,2* delims=. " %%a in ("%%i %%j") do (
- if "%%a" lss "%fd%" echo del "%%~fc"
- )
- )
- )
- pause
复制代码
echo结果- del "c:\user\liky\log\ex20130430.log"
- del "c:\user\wxh\log\ex20130430.log"
- 请按任意键继续. . .
复制代码
可以了,去掉echo也可以了,谢谢。
当初显示和删除不一样。。。
标记下,日后回报。
另外,每N个客户如果没有日志文件的话,就会回显一行 无可用范例
把del的文件,echo保存为deldate.txt日志咯?
作者: CrLf 时间: 2013-4-30 19:47
linux 的 find.exe 可以这样:- find.exe 目录 -mtime +40
- rem 搜索目录下修改日期在 40 天前的文件
复制代码
作者: apang 时间: 2013-4-30 21:01
这样可以不?- @echo off
- for /f "delims=" %%a in ('xcopy /d:05-01-2013 /ls *.log c:\') do set "%%a=1"
- for /r %%a in (*.log) do if not defined %%a echo %%a
- Rem 查找2013年5月1日之前修改的文件
- 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 |