批处理文件中的子例程

时间:2010-09-14 23:15:07

标签: 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

但我明白了:

Start
Calling SUB_A
In SUB_A
Calling SUB_B
In SUB_B
In SUB_A

我在这里做错了什么?

3 个答案:

答案 0 :(得分:50)

如果要从CALL返回,可以使用带/ 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

答案 1 :(得分:15)

CALL :SUB_B返回,脚本进入下几行:

:SUB_A           # no effect from this one
ECHO In SUB_A    # prints message

如果您希望它停在那里,您需要在通话后插入GOTO:EOF

批处理文件不是结构化程序;它们是一系列指令,带有一些类似BASIC的GOTO和CALL功能。

答案 2 :(得分:3)

在您的行CALL :SUB_B之后,批处理文件会转到SUB_A。如果你不想要它,你需要在那里放一个GOTO行。