标题: [求助]对以时间命名的文件进行选择删除和分类
[打印本页]
作者: easonL
时间: 2008-5-23 10:49
标题: [求助]对以时间命名的文件进行选择删除和分类
现在需要对log文件进行处理,文件名的命名规则如下:
[YYYYMMDDhh24miss].log
例)
D:\tabiplaza\yado\debug\20080522000200.log
批处理要求:
1、六个月前的文件,删除
2、五个月前的文件,进行分类,每个文件按照月份放入对应的文件夹(以月份命名)。
例如:D:\tabiplaza\yado\debug\20080522000200.log->文件夹:200805
由于初次接触批处理,基本上属于准备入门状态,请求版主以及各位大虾帮忙出出注意!不胜感激!
(另外,搜索没找到什么结果,也有可能搜索的关键字不对,希望指教!)
[
Last edited by easonL on 2008-5-26 at 03:19 PM ]
作者: HAT
时间: 2008-5-23 11:20
假设现在已经对5个月前的log分类了,下个月处理的时候是否需要在判断分类文件夹里面的文件是否超过6个月呢?
作者: easonL
时间: 2008-5-23 11:25
需要的,我的想法是:
下个月执行批处理的话,首先根据文件名来判断下,如果是六个月前的文件夹,就直接删除整个文件夹。
例如:现在2008年5月,那么200712这个文件夹我就直接删除好了
作者: 26933062
时间: 2008-5-23 13:34
放在D:\tabiplaza\yado\debug文件夹运行,
未测试。。。
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:-\/. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-5
)
if %mm% leq 0 set /a nn=1
set /a m=(12+mm)%%12,y=yy-nn
if %m% equ 0 set m=12
set m=0%m%
set yy=%y%%m:~-2%
for /f "delims=" %%a in ('dir/b/ad') do if %%a leq %yy% rd/q/s "%%a"
for /f "delims=" %%a in ('dir/b/a-d *.log') do (
set "str=%%~nxa"
set "str=!str:~0,6!"
if !str! leq %yy% (del/q "%%a") else (
if not exist !str!\ md !str!
move "%%a" "!str!"
)
)
pause
[
Last edited by 26933062 on 2008-5-23 at 03:38 PM ]
作者: easonL
时间: 2008-5-23 14:01
Quote: |
Originally posted by 26933062 at 2008-5-23 01:34 PM:
放在D:\tabiplaza\yado\debug文件夹运行,
未测试。。。
:[code]
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:-\. " %%a in ("%date%") d ... |
|
非常感谢,我正在测试,不过遇到一些问题,继续请教
1、我保存在D:\tabiplaza\yado\debug底下,命名未debug.bat
2、想让它输出点提示信息,可是cmd那个黑屏总是一闪就没有了,这是为什么?
呵呵,觉得自己真的很菜,不过没办法,学习总是这样一个过程,多多赐教,不胜感激!
作者: 26933062
时间: 2008-5-23 14:05
一闪就没有了,是代码有错误,不好意识,粗心大意将%yy%写成了%yy%%
现以改正,再试试。。
作者: easonL
时间: 2008-5-23 14:10
跑到for /f "delims=" %%a in ('dir/b/ad') do if %%a leq %yy%% rd/q/s "%%a"
这一句的时候出错:
The syntax of the command is incorrect.
原因正在调查中
作者: 26933062
时间: 2008-5-23 14:15
都说了这一句有错,你重新复制4楼代码再试试。。。。
作者: easonL
时间: 2008-5-23 14:17
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:-\. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-5
)
if %mm% leq 0 set /a nn=1
set /a m=(12+mm)%%12,y=yy-nn
if %m% equ 0 set m=12
set m=0%m%
set yy=%y%%m:~-2%
for /f "delims=" %%a in ('dir/b/ad') do if %%a leq %yy% rd/q/s "%%a"
for /f "delims=" %%a in ('dir/b/a-d *.log') do (
set "str=%%~nxa"
if !str:~0,6! leq %yy% (del/q "%%a") else (
if not exist !str:~0,6!\ md !str:~0,6!
move "%%a" "!str:~0,6!"
)
)
pause
----------------------------------------------------------------------------------------
将后面两个运算变量%yy%后,运行的错误是:
6! was unexpected at this time.
好像是最后那句if还有错,呵呵,费神再看看,谢谢
作者: 26933062
时间: 2008-5-23 14:28
汗!果然,
以修改并测试成功。。。
作者: easonL
时间: 2008-5-23 14:31
呵呵,是的!现在已经能够分类了,感谢!
老大,但是删除超过时间的文件的功能没有实现,呵呵
作者: 26933062
时间: 2008-5-23 14:34
我测试可以啊!
if !str! leq %yy% (del/q "%%a")
这句就是删除文件的啊?
作者: easonL
时间: 2008-5-23 14:42
啊?不是吧,我测试的时候,总是建立对应的文件夹,然后把文件放进去(包括六个月前的)。
我觉得可能是目录结构的差异?
我这边的目录结构是:
D:\tabiplaza\yado\debug\底下放文件夹、文件
是这样吗?
作者: 26933062
时间: 2008-5-23 14:47
我在abcd文件夹里创建了以下这些log文件
然后运行4楼的代码。
abcd文件夹里只剩下200801-----2008-05文件夹,里面是相应的文件。
已经没有2007开头的文件了,难道不对?
:
200701dfjg.log
200702dfgs.log
200703fhhhgh.log
200710sfysh.log
200711sdfhsh.log
200712sfdhsh.log
200801sdfhsghgh.log
200802sdfhgsh.log
200805sfdhstsr.log
200803sfdhs.log
200804sghsgh.log
200701dfjgfg.log
200702dfgssdfg.log
200703fhhhghsdg.log
200710sfyshsfg.log
200711sdfhshsdfg.log
200712sfdhshsfg.log
200801sdfhsghghsfg.log
200802sdfhgshsdg80.log
200805sfdhstsrsdfg678.log
200803sfdhssgj68.log
200804sghsghh6.log
作者: easonL
时间: 2008-5-23 14:54
晕倒,果然是目录结构不一样,呵呵,怪我看代码,不能很好理解啊,菜鸟菜鸟啊
老大,两个问题:
1、D:\tabiplaza\yado\debug下面放的是bat文件,这个应该对的!
2、你的abcd文件夹的目录路径什么?
哎,要不是急着做出来,我一定等到能完全看懂代码的时候,再向你好好请教!
作者: 26933062
时间: 2008-5-23 14:59
你如果把bat文件放在D:\tabiplaza\yado\debug文件夹里运行的话,那么我的abcd文件夹目录路径就不重要了。
你的D:\tabiplaza\yado\debug文件夹里除了你说的log文件外,还有其它文件吗?
D:\tabiplaza\yado\debug文件夹里,都还有些什么文件夹?
或者你运行下面的代码把a.txt结果贴出来看看
@echo off
for /f "delims=" %%a in ('dir/b/ad') do echo %%a>>a.txt
pause
作者: easonL
时间: 2008-5-23 15:13
现在我这边的情况是这样:
D:\tabiplaza\yado\debug下放置的是log文件和bat文件
我并没有建立abcd文件夹
跑出来的结果是:
D:\tabiplaza\yado\debug底下生成了以年月命名的文件夹,文件夹里面放置的是log文件,这个过程没有删除文件(包括过时的文件和文件夹)
另外,我看到代码里面“'dir/b/ad'‘,这句有没有关系?
作者: 26933062
时间: 2008-5-23 15:22
for /f "delims=" %%a in ('dir/b/ad') do if %%a leq %yy% rd/q/s "%%a"
这一句 是判断D:\tabiplaza\yado\debug文件夹里的文件夹若小于6个月就删除(文件夹名都是以年月为名)
你说D:\tabiplaza\yado\debug底下生成了以年月命名的文件夹,这些文件夹难道有200801以前的文件夹吗?
运行bat文件后,D:\tabiplaza\yado\debug文件夹里应该没有log文件了才对,因为小于200801的文件都删除了,大于或等于200801的文件都移动到了相应的文件夹内。
难道不是这样?
作者: easonL
时间: 2008-5-23 15:26
1、D:\tabiplaza\yado\debug文件夹里面除了log文件,没有其他文件了(当然啦,还有就是bat文件)
2、经过bat运行一把之后,D:\tabiplaza\yado\debug底下的文件夹有:
200703
200709
200801
200802
200803
200808
作者: 26933062
时间: 2008-5-23 15:29
怎么会这样呢?
你运行以下代码,把结果贴来看看。。。
:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:-\. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-5
)
if %mm% leq 0 set /a nn=1
set /a m=(12+mm)%%12,y=yy-nn
if %m% equ 0 set m=12
set m=0%m%
set yy=%y%%m:~-2%
echo "%yy%"
pause
作者: easonL
时间: 2008-5-23 15:30
不好意思,刚才没有没有看到你回复,我就回复了上面的内容
运行bat文件后,D:\tabiplaza\yado\debug文件夹里应该没有log文件,已经移到了相应的文件夹里面了,但是小于200801的文件夹依然存在!!
我突然想起来有一个情况,想跟你说下,我的系统是英文系统,这个会不会影响?
我怕系统的时间格式有差异,影响结果?
作者: easonL
时间: 2008-5-23 15:32
Quote: |
Originally posted by 26933062 at 2008-5-23 03:29 PM:
怎么会这样呢?
你运行以下代码,把结果贴来看看。。。
:[code]
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:-\. " %%a in ("%date ... |
|
运行结果是:
D:\tabiplaza\yado\debug>test2
"1607"
Press any key to continue . . .
作者: 26933062
时间: 2008-5-23 15:33
啊?????
有没有搞错啊??
确实是时间格式导致的。
你再运行
echo %date%
结果是什么?
[
Last edited by 26933062 on 2008-5-23 at 03:35 PM ]
作者: easonL
时间: 2008-5-23 15:35
Quote: |
Originally posted by 26933062 at 2008-5-23 03:33 PM:
啊?????
有没有搞错啊??
你再运行
echo %date%
结果是什么? |
|
echo出来的结果:
2008/05/23
作者: 26933062
时间: 2008-5-23 15:37
for /f "tokens=1,2 delims=:-\. " %%a in ("%date%") do (
把这句改为
for /f "tokens=1,2 delims=:-/. " %%a in ("%date%") do (
即可
或再复制4楼代码运行
作者: easonL
时间: 2008-5-23 15:40
哇!!!!!!
太强大了,果然好了!!
呵呵,是什么原因呢?能不能给解析一下?
作者: 26933062
时间: 2008-5-23 15:51
delims=:-\. 我之前为确保无误用了:-\.这4种符号来切割%date%为的是把日期分成年月日,却不想你的日期分割符偏偏是 /
唉!。。。 百密一疏。。。
其实只要delims=/ 就可以了的。
[
Last edited by 26933062 on 2008-5-23 at 03:52 PM ]
作者: easonL
时间: 2008-5-23 16:00
首先表示感谢!!非常谢谢你的帮忙!
呵呵,本来写代码就是需要经过大量debug的,纯属正常!只是不是自己的环境下调试,这个错误被放大了而已!
对P的运行机制不懂,还麻烦您继续答疑一下!
1、我们现在把bat放在D:\tabiplaza\yado\debug下,如果我在环境变量中加入
D:\tabiplaza\yado\debug,这样的话是不是就可以随处运行bat文件了?
可现在问题是我如果想改变bat文件的路径,比如我想放在C:\底下,而D:\tabiplaza\yado\debug底下还是放log文件,该怎么改变?
2、学习P的准备入门阶段,据我自己的学习经验,必须大量练习外,您还有没有什么特别科学的经验,可不可以指教一下,谢谢
作者: 26933062
时间: 2008-5-23 16:10
经验就是:大量练习,及多看别人的帖
要在其它位置运行bat,考虑的问题要多一点,以下代码未测试。。。
:
@echo off&setlocal enabledelayedexpansion
set "lj=D:\tabiplaza\yado\debug"
for /f "tokens=1,2 delims=:-\/. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-5
)
if %mm% leq 0 set /a nn=1
set /a m=(12+mm)%%12,y=yy-nn
if %m% equ 0 set m=12
set m=0%m%
set yy=%y%%m:~-2%
for /f "delims=" %%a in ('dir/b/ad "%lj%"') do if %%a leq %yy% rd/q/s "%lj%\%%~nxa"
for /f "delims=" %%a in ('dir/b/a-d "%lj%\*.log"') do (
set "str=%%~nxa"
set "str=!str:~0,6!"
if !str! leq %yy% (del/q "%lj%\%%~nxa") else (
if not exist "%lj%\!str!\" md "%lj%\!str!"
move "%lj%\%%~nxa" "%lj%\!str!"
)
)
pause
作者: easonL
时间: 2008-5-23 16:13
恩,好的,谢谢,继续学习中!碰到问题在向您请教!
不胜感激!
作者: easonL
时间: 2008-5-26 15:26
银牌会员 【26933062】看见了的话,帮我完善下!!!!谢谢
那天测试的时候,漏了一个case,就是比如现在是6月份了,那么我们应该将200801前的文件和文件夹删除!
但是现在的情况是这样的,计算出来的日期是200701前的东西删除!这不对
好像是这段命令的原因,帮忙分析下(好像if %mm% gtr 0 这种情况也做了日期转换了)
if %mm% leq 0 set /a nn=1
set /a m=(12+mm)%%12,y=yy-nn
if %m% equ 0 set m=12
set m=0%m%
set yy=%y%%m:~-2%
各位大虾,帮帮忙,谢谢
作者: easonL
时间: 2008-5-26 15:32
Quote: |
Originally posted by 26933062 at 2008-5-23 04:10 PM:
经验就是:大量练习,及多看别人的帖
要在其它位置运行bat,考虑的问题要多一点,以下代码未测试。。。
:[code]
@echo off&setlocal enabledelayedexpansi ... |
|
这个是最终的P
作者: easonL
时间: 2008-5-26 15:39
呵呵,自己搞明白了
在if %mm% leq 0 set /a nn=1前面多添加一种case就好了
添加:
if %mm% gtr 0 set /a nn=0
作者: 26933062
时间: 2008-5-26 15:42
Quote: |
Originally posted by easonL at 2008-5-26 15:39:
呵呵,自己搞明白了
在if %mm% leq 0 set /a nn=1前面多添加一种case就好了
添加:
if %mm% gtr 0 set /a nn=0 |
|
那样是不对的,
改这里
for /f "tokens=1,2 delims=:-\/. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-
5
)
作者: easonL
时间: 2008-5-26 15:58
Quote: |
Originally posted by 26933062 at 2008-5-26 03:42 PM:
那样是不对的,
改这里
for /f "tokens=1,2 delims=:-\/. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-5
) |
|
啊??您好像没有改什么嘛,跟原来的对比,没有看出来呢,呵呵
作者: easonL
时间: 2008-5-26 16:16
银牌会员 【26933062】大虾,还有顺便把我那样改为什么不对,给稍微解析一下,拜托了!
作者: 26933062
时间: 2008-5-26 16:20
计算部分好像确实有误,容我想想。。
作者: 26933062
时间: 2008-5-26 16:25
没错啊!
你现在是什么问题?
作者: easonL
时间: 2008-5-26 16:30
有错的!我描述下问题:
假如现在是6月份了,那么我们应该将200801以前的文件和文件夹删除,对吧?
可是现在不是这样的,结果是只将200701之前的文件和文件夹删除了。
时间计算那边出了问题,貌似!您给看看
作者: easonL
时间: 2008-5-26 16:33
等一下,我再仔细确认下!!
作者: 26933062
时间: 2008-5-26 16:35
怎么可能?
你测试以下代码。。。
:
@echo off
::下面是假设当前日期为2008年6月,可自行修改测试
set date=2008/6
::::::::::::::::::::::::::::::
for /f "tokens=1,2 delims=:-\/. " %%a in ("%date%") do (
set /a yy=%%a,mm=100%%b%%100-5
)
if %mm% leq 0 set /a nn=1
set /a m=(12+mm)%%12,y=yy-nn
if %m% equ 0 set m=12
set m=0%m%
set yy=%y%%m:~-2%
echo.&echo 删除 %yy% 以前的文件(含%yy%)
echo.&pause
作者: easonL
时间: 2008-5-26 16:38
汗~~~~~~~~~~
怎么现在测试的结果跟刚才不一样了!应该是没有问题的!
真的对不起啊!浪费你的时间了
不过真的很奇怪啊,我自己在看看刚才怎么回事