[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]for 循环中 call 语句不能调用标签

大概问题是,为什么在for循环中,明明写对了 call :l_lable ,在循环中却并未调用到:l_lable 这个标签呢,循环肯定是进行了的。

是这样的,我写了一个批处理strstr.bat,用于查找子字符串的位置,输入三个参数,一个是字符串,一个是要查找的子字符串,一个是是否忽略大小写,用变量cexer输出查找到的子字符串位置。批处理如下:
  1. :l_strstr
  2.     @echo off
  3.     @set _string=%~1
  4.     @set _substr=%~2
  5.     @set _icase=%~3
  6.     @call strlen %_string%
  7.     @set _strlen=%cexer%
  8.    
  9.     @call strlen %_substr%
  10.     @set _sublen=%cexer%
  11.         
  12.     @if "%_icase%" equ "" @goto :l_loop
  13.     @if %_icase% equ 0 @goto :l_loop
  14.    
  15. :l_upper
  16.     @call strup %_string%
  17.     @set _string=%cexer%
  18.    
  19.     @call strup %_substr%
  20.     @set _substr=%cexer%
  21. :l_loop
  22.     @set /a _maxidx=%_strlen%-%_sublen%
  23.     @for /l %%i in (0,1,%_maxidx%) do (
  24.         @call echo %%_string:~%%i,%_sublen%%% %%i
  25.         @call :l_check %%_string:~%%i,%_sublen%%% %%i
  26.     )
  27.    
  28.     @set cexer=-1
  29.     @goto :l_return
  30. :l_check
  31.     if "%1" equ "%_substr%" (
  32.         @set cexer=%2
  33.         @goto :l_return
  34.     )
  35.     @goto :eof
  36. :l_return
  37.     @echo on
  38.     @goto :eof
复制代码
其中的 strlen.bat 是我写的一个批处理用于计算字符串的长度,用cexer变量返回(这个批处理是没问题的)
写了一个test.bat测试strstr.bat:
  1. @set string="012345ABC90"
  2. @call strstr %string% "ab"
  3. @echo %cexer%
  4. @pause
复制代码
发现批处理strstr中,for循环中的语句
  1. @call :l_check %%_string:~%%i,%_sublen%%% %%i
复制代码
并未调用子标签 :l_check,就好像直接跳过了这一句似的。
如果把test.bat为如下(给strstr.bat调用增加一个参数,忽略大小写)
  1. @set string="012345ABC90"
  2. @call strstr %string% "ab" 1
  3. @echo %cexer%
  4. @pause
复制代码
则循环的最后三次call会成功调用:l_check。
很奇怪,为什么明明写对了 call :l_check ,却调用不到标签呢?

[ 本帖最后由 neohost 于 2011-1-17 17:44 编辑 ]
1

评分人数

    • hanyeguxing: 感谢给帖子标题标注[已解决]字样PB + 2

返回列表