Board logo

标题: 批处理如何在命令执行结果中筛选符合条件的并汇总? [打印本页]

作者: qq1178662380    时间: 2010-8-11 10:23     标题: 批处理如何在命令执行结果中筛选符合条件的并汇总?

比如,我有一个dos下可执行的程序:myexe.exe,myexe的执行过程是输入命令“ myexe baidu.com",则会返回一个值“百度一下,你就知道”,即返回输出网页上方的网页标题。
现在,问题是,如何用myexe.exe对文本文件mytxt.txt中的网址进行筛选(mttxt是一个文本文件,每行一个网址,有数千行),根据返回的结果保存。
要求:命令执行3秒钟无结果的,标记为“404”并保存;命令执行3秒钟有结果的,如果为“powered by ***”,则标记为“***bbs”并保存;命令执行3秒钟有结果的,如果不含有“powered by ”的,则标记为“unknow”并保存。
要求执行结果同样是个数千行的文本文件,同mytxt.txt一样,不过每行的内容是“ ***bbs”“404”“unknow”三者其中之一。
那位高手给个大概的代码,我看自己能不能改改完善一下,谢谢!
作者: a6c123    时间: 2010-8-11 12:12

  1. @echo off
  2. :: ------------------------ 设置 ------------------------
  3. set App="myexe.exe"
  4. set UrlList="mttxt.txt"
  5. set Output="_执行结果.txt"
  6. :: ------------------------ /设置 -----------------------
  7. :: 生成用于延时的 vbs
  8. >"%temp%\delay.vbs" echo WScript.sleep 3000
  9. :: 统计网址数量,以便查看执行进度
  10. set /a UrlNum = 0, n = 0
  11. for /f "usebackq" %%a in (%UrlList%) do set /a UrlNum += 1
  12. :: 读取网址列表文件
  13. for /f "usebackq delims=" %%a in (!UrlList!) do call :Sub "%%a"
  14. del "%temp%\delay.vbs"
  15. exit /b
  16. :Sub
  17. :: 显示进度
  18. set /a n += 1
  19. title %n%/%UrlNum%
  20. echo %1
  21. :: 处理网址,并延时
  22. start "" /b %App% %1 > "%temp%\result.tmp"
  23. "%temp%\delay.vbs"
  24. :: 如果等待 3 秒后,要强制结束%App%进程,请去掉下一行前面的冒号
  25. :: for %%a in (%App%) do taskkill /f /im "%%~nxa" >nul 2>nul
  26. :: 读取执行结果
  27. set Result=
  28. set /p Result=<"%temp%\result.tmp"
  29. :: 判断执行结果
  30. >>%Output% (
  31.     if not defined Result (
  32.         echo 404
  33.     ) else (
  34.         if "%Result:powered by =%" neq "%Result%" (
  35.             echo %Result:*powered by =%bbs
  36.         ) else (
  37.             echo unknow
  38.         )
  39.     )
  40. )
  41. goto :eof
复制代码

[ 本帖最后由 a6c123 于 2010-8-11 15:41 编辑 ]
作者: qq1178662380    时间: 2010-8-11 15:18

谢谢楼上的高手。还有一个问题,刚才描述的不是很清楚,应该是这样的:
命令执行3秒钟有结果的,如果包含有“powered by ”字样的,比如“***1 powered by ***2”,则标记为“***2bbs”并保存;命令执行3秒钟有结果的,如果不含有“powered by ”的,则标记为“unknow”并保存。
这里重点不是等于“powered by ***”,而是包含,因为结果各种字符串都有,所以上面的那个判定不太适用。这一句代码应该如何改呢?
作者: a6c123    时间: 2010-8-11 15:25     标题: 回复 3楼 的帖子

已修改
                                              .
作者: qq1178662380    时间: 2010-8-11 15:48

请问一下下面这三行的第二行该如何解释啊:
-------------------------------------------------------------------
:: 读取执行结果
set Result=
set /p Result=<"%temp%\result.tmp"
-------------------------------------------------------------------
作者: a6c123    时间: 2010-8-11 15:53     标题: 回复 5楼 的帖子

清空变量 Result 的值。

因为如果 "%temp%\result.tmp" 的内容为空的话,执行 set /p Result=<"%temp%\result.tmp" 后,Result 的值还是之前的,而不是空。

[ 本帖最后由 a6c123 于 2010-8-11 15:59 编辑 ]
作者: qq1178662380    时间: 2010-8-11 16:10

谢谢了,回复真快啊。
本人水平太菜了,就不浪费时间了,仔细研究研究代码吧。




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