Board logo

标题: [文件操作] 批处理如何循环检查文件修改日期? [打印本页]

作者: kris2000    时间: 2011-4-20 17:27     标题: 批处理如何循环检查文件修改日期?

我是batch新手,请大家帮我看看这个问题。
我有Folder1,Folder2...Folder5五个文件夹,想将这五个文件夹中的文件修改日期大于等于GenerateDate的显示出来,在论坛中找到一段代码,做了一下简单修改,如下:
  1. set GenerateDate=20110301
  2. set Filedir=c:
  3. set Folder1=aa
  4. set Folder2=bb
  5. set Folder3=cc
  6. set Folder4=dd
  7. set Folder5=ee
  8. @echo off
  9. setlocal enabledelayedexpansion
  10. for /f "delims=" %%a in ('dir /b /a-d %Filedir%\%Folder1%\*.*') do (
  11.   set num=%%~ta
  12.   set num=!num:~0,10!
  13.   set num=!num:-=!
  14.   if !num! geq %GenerateDate%  echo %%a
  15. )
  16. pause
  17. exit
复制代码
我有三个问题:
1.三句set num=。。。都是什么意思,请大家帮我解释一下?
2.怎么修改一下上面的代码,变成对五个文件夹都检查一遍?
3.我想看看num到底是什么值,我在for循环里加个一条echo num 为什么只显示num,而不是num对应的值?
作者: hanyeguxing    时间: 2011-4-20 17:36

本帖最后由 hanyeguxing 于 2011-4-20 17:39 编辑

1,是否包含隐藏目录、隐藏文件?
2,这5个目录是否在当前目录下,或指定的某目录下?
3,这5个目录是否都在同一目录下?
4,目录中除了这5个目录,还有别的目录吗?
5,只检查5个目录中的文件,包括不包括这5个目录中的子目录?

ps:应该是echo !num!
作者: batman    时间: 2011-4-20 17:40

  1. @echo off
  2. for %%a in (aa bb cc dd ee) do (
  3.      for /r c:\%%a %%b in (*) do (
  4.           for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq "20110301" echo %%b
  5.      )
  6. )
  7. pause>nul
复制代码

作者: batman    时间: 2011-4-20 17:43

1# kris2000
1、这几句是变量赋值和截取字符。

2、见楼上的代码。

3、echo !num!。

4、多看看基础教程。
作者: kris2000    时间: 2011-4-21 09:15

谢谢batman!
我按照你的方法改了一下:
  1. @echo off
  2. for %%a in (%FaultTop1% %FaultTop2% %FaultTop3% %FaultTop4% %FaultTop5% %FaultTop6% %FaultTop7% %FaultTop8% %FaultTop9% %FaultTop10%) do (
  3.      for /r %Filedir%\%%a %%b in (*) do (
  4.           for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq %GenerateDate% echo %%b
  5.      )
  6. )
  7. pause
  8. exit
复制代码
这段代码是用来被其他batch文件调用的,FaultTop1...和Filedir都是在其他batch中定义的变量。

测试中我发现for /r %Filedir%\%%a %%b in (*) 这个循环总是进不去,(路径本身是没有问题的)。请大家帮我看看怎么回事?
作者: hanyeguxing    时间: 2011-4-21 11:45

本帖最后由 hanyeguxing 于 2011-4-21 14:13 编辑
  1. @echo off&setlocal enableDelayedExpansion
  2. for /l %%a in (1,1,10) do call:a "!FaultTop%%a!"
  3. pause&exit
  4. :a
  5. for /r "%Filedir%\%~1" %%b in (*) do for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq "%GenerateDate%" echo;%%b
复制代码
语法错误:在 for /开关 "选项" %%a in (set) do (...) 中,选项部分不能使用延迟变量 !a! 和 for 变量 %%a ,而只能使用直接变量 %a% 和参数 %1
以下3个示例写法均为语法错误:
for /d /r c:\%%a %%b in (*) do
for /r "%Filedir%\%%a" %%b in (*) do
for /f "tokens=%%a delims=!a!" %%c in (123.txt) do
作者: batman    时间: 2011-4-21 12:22

原来以为只有for /f "选项"中会出现这种情况,原来for/开关都有这种情况,受教!
作者: CrLf    时间: 2011-4-21 13:05

本帖最后由 zm900612 于 2011-4-21 13:07 编辑

比较日期大小时可以不用去掉/号,因为位数是固定的,当成字符串比较也不会出错。
另一种思路是:
  1. @echo off
  2. for /f "tokens=12*" %%a in ('dir /s /a-d aa\ bb\ cc\ dd\^|findstr "^^2"^|sort /r') do if defined y (echo %%c) else if %%a gtr 2011/04/21 set y=1
  3. pause
复制代码

作者: CrLf    时间: 2011-4-21 13:14

原来以为只有for /f "选项"中会出现这种情况,原来for/开关都有这种情况,受教!
batman 发表于 2011-4-21 12:22

运行for嵌套的bat时,打开echo on,会看到for语句运行前是先解释整个语块,语法无误时再解释子语句,然后扩展变量延迟,若在开关或参数中使用变量延迟,解释子语句时参数中的变量延迟尚未被解释,所以会提示“此时不应有!str!”。
作者: kris2000    时间: 2011-4-21 13:45

我运行了一下hanyeguxing 的代码,在执行到call:a "!FaultTop%%a!"时,提示“命令语法不正确”,请再帮我看看。
  1. @echo off&setlocal enableDelayedExpansion
  2. for /l %%a in (1,1,10) do call:a "!FaultTop%%a!"
  3. pause&exit
  4. :a
  5. for /r "%Filedir%\%~1" %%b in (*) do for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq "%GenerateDate"% echo;%%b
复制代码
看来我抽时间基础学习了。
作者: hanyeguxing    时间: 2011-4-21 14:15

汗一个,"%GenerateDate"% 应该写成 "%GenerateDate%"
作者: plp626    时间: 2011-4-21 14:49

如果是大于等于20110301

那么到现在4月21号,文件很少的,可以findstr
  1. dir/a-d/tw folder1 folder2 folder3 folder4 folder5|findstr "2011-0[3-4]-[0-9][0-9]"
复制代码

作者: kris2000    时间: 2011-4-21 16:33

我改的代码,call只做了一次,为什么?
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /l %%a in (1,1,10) do call:a "!FaultTop%%a!"
  4. pause
  5. exit
  6. :a
  7. for /r "%Filedir%\%~1" %%b in (*.*) do for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq "%GenerateDate%" echo %%b
  8. pause
  9. exit
复制代码

作者: kris2000    时间: 2011-4-22 17:35

顶一下,大家帮我看看上面这段代码为什么call只做了一次?
作者: CrLf    时间: 2011-4-22 17:41

我改的代码,call只做了一次,为什么?
@echo off
setlocal enableDelayedExpansion

for /l %%a in (1,1,10) do call:a "!FaultTop%%a!"
pause
exit

:a

for /r "%Filedir%\%~1" %%b in (*.*) do for /f ...
kris2000 发表于 2011-4-21 16:33

exit /b
::系统帮助中这样解释:指定要退出当前批处理脚本而不是 CMD.EXE
作者: hanyeguxing    时间: 2011-4-22 18:00

call:a
....
pause&exit
:a
.....
exit /b
在这里使用 exit /b 或 goto:eof ,如果这里已是批处理结尾,不使用也可以




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