2010-09-14 99 views
25

考慮下面的代碼:子程序在批處理文件

@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 

什麼我錯在這裏做什麼?

回答

14

CALL :SUB_B回報,劇本進行到接下來的幾行:

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

您需要調用後插入一個GOTO:EOF,如果你想讓它停在那裏。

批處理文件不是結構化程序;它們是一些指令序列,帶有一些類似BASIC的設備,用於GOTO和CALL。

3

在你的行CALL :SUB_B之後,批處理文件進入SUB_A。如果你不想要它,你需要在那裏放置一條GOTO線。

42

如果你想從一個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 
+5

我覺得這是最好'轉到:EOF',你可以添加一個返回值ERRORLEVEL:'退出/ B%將RetVal%' – SvenS 2013-05-07 07:16:14

+6

一個音符 - 你不應該定義' EOF標籤。 「GOTO:EOF」開箱即用。另外請注意,您正在調用':EOF',並且只能定義'EOF',它將由'GOTO EOF'調用。 – Nux 2013-11-19 16:10:36