如果我使用以下Windows批处理代码段并运行它:echo fooif 1 == 1 ( echo bar goto asdf :asdf echo baz) else ( echo quux)我期望的输出是:foobarbaz但是我得到了:foobarbazquux如果我注释掉这一goto asdf行,它会给出我期望的输出。该echo quux行不应该exectuted,所以为什么goto语句的存在导致这样的事情发生?更新:对于它的价值,这里有一个替代方法可以正确地实现我最初的意图:goto BEGIN:doit echo bar goto asdf :asdf echo baz goto :EOF:BEGINecho fooif 1 == 1 ( call :doit) else ( echo quux)但是,这不能回答我的原始问题。
3 回答
慕的地8271018
TA贡献1796条经验 获得超4个赞
括号内的所有内容都被视为一条直线,只需单击即可处理,解释和执行。您的脚本到达goto asdf并跳出该块/行。在标签上:asdf,没有括号,因此它开始逐行读取行。它到达else,但是if之间没有任何关系:asdf,else因此忽略它。
为防止出现此类问题,我始终使用goto或callon if和for语句,而不是块。这样可以解决更多goto语句的问题,也可以解决很多变量的问题。
使用方法goto:
echo foo
if 1 == 1 goto bar
echo quux
goto nextbit
:bar
echo bar
goto asdf
:asdf
echo baz
:nextbit
:: more script...
或使用call:
echo foo
if 1 == 1 (call :bar) else (call :quux)
:: more script...
exit /b
:bar
echo bar
goto asdf
:asdf
echo baz
exit /b
:quux
echo quux
exit /b
- 3 回答
- 0 关注
- 573 浏览
添加回答
举报
0/150
提交
取消