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

[文本处理] set=0后echo却为空,奇怪的问题!

我写了一个批处理文件 strchr.bat 查找字符串当中某字符的位置,文件内容如下:
  1. :l_strchr
  2.     @setlocal enabledelayedexpansion
  3.     @set _a1=%~1
  4.     @set _a2=%~2
  5.     @set _rt=-1
  6.     @if "%_a1%" equ "" @goto :l_fail
  7.     @if "%_a2%" equ "" @goto :l_fail
  8.    
  9. :l_loop
  10.     @if "%_a1%" neq "" (
  11.         @set /a _rt+=1
  12.         @if "!_a1:~0,1!" equ "%_a2%" (
  13.             @goto :l_found
  14.         )
  15.         @set _a1=%_a1:~1%
  16.         @goto :l_loop
  17.     )
  18.     @set result=-1
  19.     @goto :l_exit
  20. :l_found
  21.     set result=%_rt%
  22.     @goto :l_exit
  23. :l_exit
  24.     @endlocal
  25.     @goto :eof
复制代码



我写了一个测试文件 test.bat
  1. @call strchr "abc" "a"
  2. @echo %result%
  3. @pause
复制代码



输出当中看到是执行了 set result=0 这一句的:
但是 echo %result% 这一行却把%result%识别为空,输出为"ECHO 处于打开状态",就好像识别不到%result%一样。
奇怪了,明明 set result=0 了,为什么 echo %result%却显示不出来呢?

请问大家知道这是怎么回事吗?

已解决,原来因为使用了setlocal,所以批处理末尾隐含有一个endlocal,这个enclocal调用会把环境变量%result%置空了,至于为什么会置空不明白。这里使用setlocal开启变量延迟,是因为在if嵌套中,如果不迟延会报错,这里的解决办法是不直接使用变量延迟,而改用goto,使解释器不执行嵌套内的%arg1%替换,在goto过去时再进行,相当于进行了延迟。

:l_strchr
    @set _a1=%~1
    @set _a2=%~2
    @set _rt=-1

    @if "%_a1%" equ "" @goto :l_fail
    @if "%_a2%" equ "" @goto :l_fail
   

:l_loop
    @if "%_a1%" neq "" (
        @goto l_check
    )
    @set result=-1
    @goto :eof


:l_check
    @set /a _rt+=1
    @if "%_a1:~0,1%" equ "%_a2%" (
        @goto :l_found
    )
    @set _a1=%_a1:~1%
    @goto :l_loop


:l_found
    set result=%_rt%
    @goto :eof
1

评分人数

TOP

在 endlocal 处使用 endlocal&set 变量名=值 以使该变量被保存
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表