Board logo

标题: [文本处理] 字符查询测试的BAT脚本为何出错? [打印本页]

作者: yj850624    时间: 2013-1-24 22:14     标题: 字符查询测试的BAT脚本为何出错?

  1. @echo off & setlocal EnableDelayedExpansion
  2. title 字符查询测试脚本
  3. color 0a
  4. for /f "delims=" %%i in (1.txt) do (
  5.   set string=%%i
  6.   echo !string!
  7.   for /f "delims=" %%t in ('findstr /m "!string!" 2.txt') do (
  8.     set str=%%t
  9.     call :abc
  10. )
  11. )
  12. pause
  13. exit
  14. :abc
  15. if not "!str!"=="" (
  16. echo !string!存在于文件:!str! >>reasult.txt
  17. set str=
  18. ) else (
  19. echo !string!不存在 >>reasult1.txt
  20. )  
  21. :eof
复制代码
这段代码的大意是想凡是在2.txt凡是能查找到的关键字都写到reasult.txt文件中了,同时还想把没有查到的关键字写到reasult1.txt中,但是在if子句中前半句可执性,后半句else子句执行不了。这是为什么啊??有人能解释一下吗?谢谢!

配套的1.txt和2.txt我上传到附件里了。如果有知道的兄弟,帮忙给指教一下吧,谢谢啊!
作者: batman    时间: 2013-1-24 22:26

本帖最后由 batman 于 2013-1-24 22:28 编辑
  1. findstr /g:1.txt 2.txt>reasult.txt
  2. findstr /v /g:1.txt 2.txt>reasult1.txt
复制代码
ps:请楼主以后像我这样把代码括起来
作者: BAT-VBS    时间: 2013-1-24 22:54

按照楼主的思路:
  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3.     for /f "delims=" %%t in ('findstr /m "%%i" 2.txt') do (
  4.         call :abc %%i %%t
  5.     )
  6. )
  7. goto :eof
  8. :abc
  9. if "%2" neq "" (
  10.     >>reasult.txt echo %1存在于文件:%2
  11. ) else (
  12.     >>reasult1.txt echo %1不存在
  13. )
复制代码

作者: yj850624    时间: 2013-1-25 10:25

回复 2# batman

您好!首先,不好意思。下次发帖我会将代码括起来的。您提供的代码中给findstr加上/v参数能达到我的目标,中文

的cmd帮助机器翻译的太抽象了,我理解的不好所致。您的方法曲线救国、非常巧妙,但是不知您可否指出我的代码中

为什么在if-else中,else之后的代码始终没有执行呢?
作者: yj850624    时间: 2013-1-25 10:25

回复 3# BAT-VBS


  您好!首先,谢谢您给出的代码,您的这套代码比我的强多了,变量传递用的很好,给我非常大的启发。但是您的代码存在一样的问题,就是在if-else中,else之后的代码始终没有执行。我想知道这是为什么?谢谢啊!
作者: hankerer    时间: 2013-1-25 12:43

回复 4# yj850624

因为findstr /m这一行如果找不到的话就会返回空,而返回空的话,这条for语句根本就不会执行的。
作者: hankerer    时间: 2013-1-25 12:49

回复 5# yj850624


   改成这样试试吧
  1. @echo off & setlocal EnableDelayedExpansion
  2. title 字符查询测试脚本
  3. color 0a
  4. for /f "delims=" %%i in (1.txt) do (
  5.    set string=%%i
  6.    echo !string!in 1.txt
  7.    for /f "delims=" %%t in ('findstr /m "!string!" 2.txt') do (
  8.      set str=%%t
  9.    )
  10.   if defined str (
  11. echo !string!存在于文件:!str! >>reasult.txt
  12.          ) else (
  13.              echo !string!不存在 >>reasult1.txt
  14.         )
  15. )
  16. pause
复制代码

作者: terse    时间: 2013-1-25 15:41

本帖最后由 terse 于 2013-1-25 15:57 编辑

上面变量 STR 不清呢
去除变量 直接写
  1. @echo off & setlocal EnableDelayedExpansion
  2. title 字符查询测试脚本
  3. color 0a
  4. for /f "delims=" %%i in (1.txt) do (
  5.    (for /f "delims=" %%j in ('findstr /im "%%i" 2.txt') do (
  6.        >>reasult.txt echo %%i存在于文件:%%j
  7.    ))||>>reasult1.txt echo %%i不存在
  8. )
  9. pause
复制代码

作者: yj850624    时间: 2013-1-25 18:47

回复 6# hankerer


    非常感谢啊!原来是这样的,我也做了相关的实验,证明的确如此啊。不知这算不算for语句的一个小bug呢?哈哈。
作者: yj850624    时间: 2013-1-25 18:49

回复 7# hankerer


    if语句中的defined参数,我之前看的教程中没有,查阅cmd命令帮助学习了,在这里用的真好,真巧。谢谢啊!
作者: yj850624    时间: 2013-1-25 18:56

回复 8# terse


    wow!
    说实话,我是初学者,所以代码写的有些罗嗦。感谢前面的几位坛友,顺着我的思路帮我解决问题。而您的代码能达到目的并且很简洁,这的确是我要学习的,并且是我下一步要改进的地方。感谢您的帮忙!
作者: BAT-VBS    时间: 2013-1-25 19:12

回复 9# yj850624


    不是bug,它的工作方式就是那个样子的。




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