为了账号安全,请及时绑定邮箱和手机立即绑定

(Windows批处理)如果块的行为非常奇怪,请转到其中

(Windows批处理)如果块的行为非常奇怪,请转到其中

慕尼黑5688855 2019-10-21 12:45:28
如果我使用以下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


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 538 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信