Batch file 批处理文件中的子例程

Batch file 批处理文件中的子例程,batch-file,Batch File,给定以下代码: @Echo off ECHO Start ECHO Calling SUB_A CALL :SUB_A ECHO Calling SUB_B CALL :SUB_B :SUB_A ECHO In SUB_A GOTO:EOF :SUB_B ECHO In SUB_B GOTO:EOF ECHO End 我预计这一产出: Start Calling SUB_A In SUB_A Calling SUB_B In SUB_B End 但我明白

给定以下代码:

@Echo off
ECHO Start
ECHO Calling SUB_A
CALL :SUB_A
ECHO Calling SUB_B
CALL :SUB_B

:SUB_A
    ECHO In SUB_A
    GOTO:EOF

:SUB_B
    ECHO In SUB_B
    GOTO:EOF

ECHO End
我预计这一产出:

Start
Calling SUB_A
In SUB_A
Calling SUB_B
In SUB_B
End
但我明白了:

Start
Calling SUB_A
In SUB_A
Calling SUB_B
In SUB_B
In SUB_A

我在这里做错了什么?

在你的第
行调用:SUB_B
之后,批处理文件会转到SUB_A。如果你不想,你需要在那里放一行
转到
行。

行调用:SUB_B
返回,脚本继续到下几行:

:SUB_A           # no effect from this one
ECHO In SUB_A    # prints message
如果您希望呼叫停止,则需要在呼叫后插入一个
GOTO:EOF


批处理文件不是结构化程序;它们是一系列指令,具有一些基本功能,如转到和调用。

如果要从调用返回,请使用带/B参数的EXIT命令(因为只有“EXIT”将终止批处理文件)

例如:

CALL :SUB_ONE
CALL :SUB_TWO

GOTO :EOF

:SUB_ONE
ECHO Hello from one
EXIT /B

:SUB_TWO
ECHO Hello from two
EXIT /B

:EOF

我发现这比
goto:EOF
更可取,因为您可以添加一个返回值作为ERRORLEVEL:
exit/B%RetVal%
一个注释-您不应该定义
EOF
标签<代码>转到:EOF
开箱即用。还请注意,您正在调用
:EOF
,您只能定义
EOF
,该函数将由
GOTO-EOF
调用。需要在“调用”之后和“子例程”名称之前使用冒号。我以前从未使用过它们,但在这里使用过,而且在那之后它就起作用了。