Board logo

标题: [其他] [已解决]批处理循环中call子程序时endlocal命令失效 [打印本页]

作者: Taurus    时间: 2009-9-19 22:55     标题: [已解决]批处理循环中call子程序时endlocal命令失效

/举例如下:
@echo off
set str=endlocal is success

for %%a in (1) do (
    setlocal enabledelayedexpansion
    set str=endlocal is failed
    call :subroutine
)
cls
echo %str%
pause
exit
::=======================================
:subroutine
endlocal
goto :eof

·为何:subroutine的endlocal会失去作用呢?
·是否和call机制有关?
·及以上情况该如何处理?

谢~

[ 本帖最后由 Taurus 于 2009-9-21 15:16 编辑 ]
作者: Lumiere    时间: 2009-9-20 00:52     标题: 回复 1楼 的帖子

用call相当于调用子程序,所以你的endlocal放在子程序段,其实结束的只是被调用的子程序的setlocal,不过这里没有而已。可以看做程序从call起转到其他地方执行,其他地方就是endlocal,要注意这是在其他地方执行的,回转以后再往下执行,并没有再在for循环体这个符合语句内找到endlocal的语句,所以for设置的环境变量值还是会取代之前的str
作者: Taurus    时间: 2009-9-20 01:23

原帖由 Lumiere 于 2009-9-20 00:52 发表
用call相当于调用子程序,所以你的endlocal放在子程序段,其实结束的只是被调用的子程序的setlocal,不过这里没有而已。可以看做程序从call起转到其他地方执行,其他地方就是endlocal,要注意这是在其他地方执行的, ...

谢;

那有没有方法可以在子程序结束父程序的setlocal?
作者: Lumiere    时间: 2009-9-20 19:08

我觉得是不太可能的。除非你在子程序里用exit结束整个程序。
作者: Taurus    时间: 2009-9-21 15:14

原帖由 Lumiere 于 2009-9-20 19:08 发表
我觉得是不太可能的。除非你在子程序里用exit结束整个程序。

嗯,结果换了个方法避过这问题,解决了;

只是好奇call回上层程序再endlocal又会如何呢?
以下这样也不行,结果把:a独立当成一个子程序...
迟点才再试验一下...
@echo off
set str=endlocal is success

for %%a in (1) do (
    goto :b
    ::===============a==================
    :a
    endlocal
    goto :eof
    ::===============a==================
    :b
    setlocal enabledelayedexpansion
    set str=endlocal is failed
    call :subroutine
)
cls
echo %str%
pause
exit
::=======================================
:subroutine
call :a
endlocal
goto :eof



再次谢谢帮忙

[ 本帖最后由 Taurus 于 2009-9-21 15:47 编辑 ]




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