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

如果我使用以下Windows批处理代码段并运行它:


echo foo

if 1 == 1 (

    echo bar

    goto asdf

    :asdf

    echo baz

) else (

    echo quux

)

我期望的输出是:


foo

bar

baz

但是我得到了:


foo

bar

baz

quux

如果我注释掉这一goto asdf行,它会给出我期望的输出。该echo quux行不应该exectuted,所以为什么goto语句的存在导致这样的事情发生?


更新:对于它的价值,这里有一个替代方法可以正确地实现我最初的意图:


goto BEGIN


:doit

    echo bar

    goto asdf

    :asdf

    echo baz

    goto :EOF


:BEGIN


echo foo

if 1 == 1 (

    call :doit

) else (

    echo quux

)

但是,这不能回答我的原始问题。


慕尼黑5688855
浏览 542回答 3
3回答

慕的地8271018

括号内的所有内容都被视为一条直线,只需单击即可处理,解释和执行。您的脚本到达goto asdf并跳出该块/行。在标签上:asdf,没有括号,因此它开始逐行读取行。它到达else,但是if之间没有任何关系:asdf,else因此忽略它。为防止出现此类问题,我始终使用goto或callon if和for语句,而不是块。这样可以解决更多goto语句的问题,也可以解决很多变量的问题。使用方法goto:echo fooif 1 == 1 goto barecho quuxgoto nextbit:barecho bargoto asdf:asdfecho baz:nextbit:: more script...或使用call:echo fooif 1 == 1 (call :bar) else (call :quux):: more script...exit /b:barecho bargoto asdf:asdfecho bazexit /b:quuxecho quuxexit /b
打开App,查看更多内容
随时随地看视频慕课网APP