标题: [文本处理] 【已解决】批处理怎样遍历指定目录并查找指定文件的内容? [打印本页]
作者: fish509008 时间: 2015-12-18 14:35 标题: 【已解决】批处理怎样遍历指定目录并查找指定文件的内容?
本帖最后由 fish509008 于 2015-12-22 14:53 编辑
遍历指定目录下的文件夹,文件夹名称就是“程序名称”,每个“程序名称”文件夹下有compile.log里面有版本
然后解析生成一个文件apprevision.txt,内容如下:
程序名称 版本号 备注
文件夹1 内版本1
文件夹2 内版本2
文件夹3 内版本3
...
下面的compile.log文件内容中要查找的内容就是“Revision: 32”,(版本号)32,然后把该compile.log的上层目录(程序名称)写入文件
Compile log of application: mobilelife_user cancellation
Version: 1.0 Revision: 32
Compile date/time: 2015-10-22 19:16:32
Elapsed time: 8.63 seconds
Summary: Total of 76 steps and 34 objects compiled.
Total errors(0) and warnings(0).
...
补充:如果该目录下没有compile.log文件则输出该目录(程序名称)不存在即可。
备注:批处理执行的目录和指定目录不在同一个磁盘里
作者: flyinnet9 时间: 2015-12-18 15:02
本帖最后由 flyinnet9 于 2015-12-18 15:04 编辑
。。。。。。。。。。。。。。。。。。。。。。。。。。。。- @echo off
- set /p p=指定完整路径:
- cd /d %p%
- if not exist apprevision.txt echo.程序名称 版本号 备注>apprevision.txt
- for /f "delims=" %%a in ('dir /ad /b') do (
- pushd "%%a"
- if exist "%%a\compile.log" (
- for /f "tokens=4" %%b in ('findstr "Revision:" "%%a\compile.log"') do (
- echo.%%~na %%b>>apprevision.txt
- )
- ) else echo.%%a\compile.log不存在
- popd
- )
- pause
复制代码
作者: fish509008 时间: 2015-12-18 15:27
回复 2# flyinnet9
执行后就停留在指定目录里,后面的for语句没有执行
作者: flyinnet9 时间: 2015-12-18 15:59
回复 3# fish509008
错误信息贴上来看看
作者: fish509008 时间: 2015-12-18 17:06
回复 4# flyinnet9
D:\findrev\New Folder>set /p p=C:\apps\install
C:\apps\install
我打开echo显示了,没有任何报错的
作者: pcl_test 时间: 2015-12-18 20:23
回复 5# fish509008 复制代码
是让你运行后输入(或复制粘贴)路径后按一下回车键
或者直接改成这样复制代码
作者: WHY 时间: 2015-12-18 20:43
不加 pushd 和 popd 试试呢?
作者: fish509008 时间: 2015-12-21 15:55
回复 6# pcl_test
改成set "p=C:\apps\install"我也没调过去。
作者: fish509008 时间: 2015-12-21 15:56
不加 pushd 和 popd 试试呢?
WHY 发表于 2015-12-18 20:43
不加这个肯定不行啊,不在同一个目录,找不到的。
作者: fish509008 时间: 2015-12-21 15:57
本帖最后由 fish509008 于 2015-12-21 15:59 编辑
研究了下,下面是可以执行的代码,但是感觉执行时间稍微有点长。有看到这的欢迎给出优化建议!- @echo off
- set targetPath=指定完整路径
- set logFile=%~dp0apprevision.txt
- echo.程序名称 版本号 备注 >"%logFile%"
- pushd "%targetPath%"
- for /f "delims=" %%a in ('dir /ad /b') do (
- if exist "%%a\compile.log" (
- for /f "tokens=4" %%b in ('findstr "Revision:" "%%a\compile.log"') do (
- echo.%%~na %%b >>"%logFile%"
- )
- ) else (echo.%%a 未编译 >>"%logFile%")
- pause
- )
- pause& exit /b
复制代码
作者: DAIC 时间: 2015-12-21 16:50
回复 10# fish509008
也许这样可以稍微快一点点:- @echo off
- set targetPath=指定完整路径
- set logFile=%~dp0apprevision.txt
- >"%logFile%" echo 程序名称 版本号 备注
- pushd "%targetPath%"
- (for /f "delims=" %%a in ('dir /ad /b') do (
- if exist "%%a\compile.log" (
- for /f "tokens=4" %%b in ('type "%%a\compile.log" ^| findstr "Revision:"') do (
- echo %%~na %%b
- )
- ) else (
- echo %%a 未编译
- )
- ))>>"%logFile%"
- pause
复制代码
作者: WHY 时间: 2015-12-21 20:48
回复 9# fish509008
10#的pushd和popd被你偷吃了?
作者: WHY 时间: 2015-12-21 20:51
findstr 放在for 外层,效率上也许会好些:- @echo off
- set "targetPath=D:\test\"
- pushd "%targetPath%"
- (
- echo;程序名称 版本号 备注
- for /f "tokens=1,5delims=\:" %%i in ('findstr /is "Revision:" *.log^|findstr /ib "[^\\]*\\compile\.log:"')do (
- echo;%%i %%j
- )
- for /d %%i in (*) do if not exist "%%i\compile.log" echo;%%i 未编译
- )>"%~dp0apprevision.txt"
- pause
复制代码
作者: fish509008 时间: 2015-12-22 11:09
回复 11# DAIC
执行时间还是比较长,大略计时了下 大约1分钟,是我这目录太多吗?
作者: fish509008 时间: 2015-12-22 11:10
findstr 放在for 外层,效率上也许会好些:
WHY 发表于 2015-12-21 20:51
方外层我也试了,时间上看基本没太大区别的。
作者: DAIC 时间: 2015-12-22 11:53
回复 14# fish509008
是的。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |