找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29206|回复: 11

[文本处理] 字符查询测试的BAT脚本为何出错?

[复制链接]
发表于 2013-1-24 22:14:59 | 显示全部楼层 |阅读模式
  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我上传到附件里了。如果有知道的兄弟,帮忙给指教一下吧,谢谢啊!
发表于 2013-1-24 22:26:43 | 显示全部楼层
本帖最后由 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:请楼主以后像我这样把代码括起来
发表于 2013-1-24 22:54:21 | 显示全部楼层
按照楼主的思路:
  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. )
复制代码
 楼主| 发表于 2013-1-25 10:25:12 | 显示全部楼层
回复 2# batman

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

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

为什么在if-else中,else之后的代码始终没有执行呢?
 楼主| 发表于 2013-1-25 10:25:59 | 显示全部楼层
回复 3# BAT-VBS


  您好!首先,谢谢您给出的代码,您的这套代码比我的强多了,变量传递用的很好,给我非常大的启发。但是您的代码存在一样的问题,就是在if-else中,else之后的代码始终没有执行。我想知道这是为什么?谢谢啊!
发表于 2013-1-25 12:43:30 | 显示全部楼层
回复 4# yj850624

因为findstr /m这一行如果找不到的话就会返回空,而返回空的话,这条for语句根本就不会执行的。
发表于 2013-1-25 12:49:09 | 显示全部楼层
回复 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
复制代码
发表于 2013-1-25 15:41:14 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2013-1-25 18:47:04 | 显示全部楼层
回复 6# hankerer


    非常感谢啊!原来是这样的,我也做了相关的实验,证明的确如此啊。不知这算不算for语句的一个小bug呢?哈哈。
 楼主| 发表于 2013-1-25 18:49:11 | 显示全部楼层
回复 7# hankerer


    if语句中的defined参数,我之前看的教程中没有,查阅cmd命令帮助学习了,在这里用的真好,真巧。谢谢啊!
 楼主| 发表于 2013-1-25 18:56:10 | 显示全部楼层
回复 8# terse


    wow!
    说实话,我是初学者,所以代码写的有些罗嗦。感谢前面的几位坛友,顺着我的思路帮我解决问题。而您的代码能达到目的并且很简洁,这的确是我要学习的,并且是我下一步要改进的地方。感谢您的帮忙!
发表于 2013-1-25 19:12:36 | 显示全部楼层
回复 9# yj850624


    不是bug,它的工作方式就是那个样子的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 02:32 , Processed in 0.020265 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表