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

[其他] [已解决]批处理循环中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 编辑 ]
1

评分人数

    • keen: 感谢主动给标题标注[已解决]字样PB + 2
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

回复 1楼 的帖子

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

TOP

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

谢;

那有没有方法可以在子程序结束父程序的setlocal?
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

我觉得是不太可能的。除非你在子程序里用exit结束整个程序。
1

评分人数

Still with wax

TOP

原帖由 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 编辑 ]
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

返回列表