Board logo

标题: [文本处理] 【已解决】批处理怎样遍历指定目录并查找指定文件的内容? [打印本页]

作者: 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 编辑

。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  1. @echo off
  2. set /p p=指定完整路径:
  3. cd /d %p%
  4. if not exist apprevision.txt echo.程序名称        版本号        备注>apprevision.txt
  5. for /f "delims=" %%a in ('dir /ad /b') do (
  6.   pushd "%%a"
  7.   if exist "%%a\compile.log" (
  8.     for /f "tokens=4" %%b in ('findstr "Revision:" "%%a\compile.log"') do (
  9.       echo.%%~na %%b>>apprevision.txt
  10.     )
  11.   ) else echo.%%a\compile.log不存在
  12.   popd
  13. )
  14. 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
  1. set /p p=指定完整路径:
复制代码
是让你运行后输入(或复制粘贴)路径后按一下回车键

或者直接改成这样
  1. set "p=C:\apps\install"
复制代码

作者: 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 编辑

研究了下,下面是可以执行的代码,但是感觉执行时间稍微有点长。有看到这的欢迎给出优化建议!
  1. @echo off
  2. set targetPath=指定完整路径
  3. set logFile=%~dp0apprevision.txt
  4. echo.程序名称 版本号 备注 >"%logFile%"
  5. pushd "%targetPath%"
  6. for /f "delims=" %%a in ('dir /ad /b') do (
  7.   if exist "%%a\compile.log" (
  8.     for /f "tokens=4" %%b in ('findstr "Revision:" "%%a\compile.log"') do (
  9.       echo.%%~na %%b >>"%logFile%"
  10.     )
  11.   ) else (echo.%%a 未编译 >>"%logFile%")
  12. pause
  13. )
  14. pause& exit /b
复制代码

作者: DAIC    时间: 2015-12-21 16:50

回复 10# fish509008


也许这样可以稍微快一点点:
  1. @echo off
  2. set targetPath=指定完整路径
  3. set logFile=%~dp0apprevision.txt
  4. >"%logFile%" echo 程序名称 版本号 备注
  5. pushd "%targetPath%"
  6. (for /f "delims=" %%a in ('dir /ad /b') do (
  7.     if exist "%%a\compile.log" (
  8.         for /f "tokens=4" %%b in ('type "%%a\compile.log" ^| findstr "Revision:"') do (
  9.             echo %%~na %%b
  10.         )
  11.     ) else (
  12.         echo %%a 未编译
  13.     )
  14. ))>>"%logFile%"
  15. pause
复制代码

作者: WHY    时间: 2015-12-21 20:48

回复 9# fish509008


    10#的pushd和popd被你偷吃了?
作者: WHY    时间: 2015-12-21 20:51

findstr 放在for 外层,效率上也许会好些:
  1. @echo off
  2. set "targetPath=D:\test\"
  3. pushd "%targetPath%"
  4. (
  5.     echo;程序名称        版本号        备注
  6.     for /f "tokens=1,5delims=\:" %%i in ('findstr /is "Revision:" *.log^|findstr /ib "[^\\]*\\compile\.log:"')do (
  7.         echo;%%i    %%j
  8.     )
  9.     for /d %%i in (*) do if not exist "%%i\compile.log" echo;%%i    未编译
  10. )>"%~dp0apprevision.txt"
  11. 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://bbs.bathome.net/) Powered by Discuz! 7.2