标题: [文件操作] 批处理如何循环检查文件修改日期? [打印本页]
作者: kris2000 时间: 2011-4-20 17:27 标题: 批处理如何循环检查文件修改日期?
我是batch新手,请大家帮我看看这个问题。
我有Folder1,Folder2...Folder5五个文件夹,想将这五个文件夹中的文件修改日期大于等于GenerateDate的显示出来,在论坛中找到一段代码,做了一下简单修改,如下:- set GenerateDate=20110301
- set Filedir=c:
- set Folder1=aa
- set Folder2=bb
- set Folder3=cc
- set Folder4=dd
- set Folder5=ee
-
- @echo off
- setlocal enabledelayedexpansion
-
- for /f "delims=" %%a in ('dir /b /a-d %Filedir%\%Folder1%\*.*') do (
- set num=%%~ta
- set num=!num:~0,10!
- set num=!num:-=!
- if !num! geq %GenerateDate% echo %%a
-
- )
- pause
- 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
- @echo off
- for %%a in (aa bb cc dd ee) do (
- for /r c:\%%a %%b in (*) do (
- for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq "20110301" echo %%b
- )
- )
- pause>nul
复制代码
作者: batman 时间: 2011-4-20 17:43
1# kris2000
1、这几句是变量赋值和截取字符。
2、见楼上的代码。
3、echo !num!。
4、多看看基础教程。
作者: kris2000 时间: 2011-4-21 09:15
谢谢batman!
我按照你的方法改了一下:- @echo off
- for %%a in (%FaultTop1% %FaultTop2% %FaultTop3% %FaultTop4% %FaultTop5% %FaultTop6% %FaultTop7% %FaultTop8% %FaultTop9% %FaultTop10%) do (
- for /r %Filedir%\%%a %%b in (*) do (
- for /f "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq %GenerateDate% echo %%b
- )
- )
- pause
- exit
复制代码
这段代码是用来被其他batch文件调用的,FaultTop1...和Filedir都是在其他batch中定义的变量。
测试中我发现for /r %Filedir%\%%a %%b in (*) 这个循环总是进不去,(路径本身是没有问题的)。请大家帮我看看怎么回事?
作者: hanyeguxing 时间: 2011-4-21 11:45
本帖最后由 hanyeguxing 于 2011-4-21 14:13 编辑
- @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 "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 编辑
比较日期大小时可以不用去掉/号,因为位数是固定的,当成字符串比较也不会出错。
另一种思路是:- @echo off
- 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
- 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!"时,提示“命令语法不正确”,请再帮我看看。- @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 "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- 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只做了一次,为什么?- @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 "tokens=1-3 delims=-/\:" %%c in ("%%~tb") do if "%%c%%d%%e" geq "%GenerateDate%" echo %%b
-
- pause
- 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 |