标题: [文本处理] set=0后echo却为空,奇怪的问题! [打印本页]
作者: neohost 时间: 2011-1-17 04:16 标题: set=0后echo却为空,奇怪的问题!
我写了一个批处理文件 strchr.bat 查找字符串当中某字符的位置,文件内容如下:
- :l_strchr
- @setlocal enabledelayedexpansion
- @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 "" (
- @set /a _rt+=1
- @if "!_a1:~0,1!" equ "%_a2%" (
- @goto :l_found
- )
- @set _a1=%_a1:~1%
- @goto :l_loop
- )
- @set result=-1
- @goto :l_exit
-
- :l_found
- set result=%_rt%
- @goto :l_exit
-
- :l_exit
- @endlocal
- @goto :eof
复制代码
我写了一个测试文件 test.bat
- @call strchr "abc" "a"
- @echo %result%
- @pause
复制代码
输出当中看到是执行了 set result=0 这一句的:
但是 echo %result% 这一行却把%result%识别为空,输出为"ECHO 处于打开状态",就好像识别不到%result%一样。
奇怪了,明明 set result=0 了,为什么 echo %result%却显示不出来呢?
请问大家知道这是怎么回事吗?
作者: neohost 时间: 2011-1-17 04:38
已解决,原来因为使用了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
作者: hanyeguxing 时间: 2011-1-17 08:46
在 endlocal 处使用 endlocal&set 变量名=值 以使该变量被保存
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |