2010-09-14 12 views
25

Dado el siguiente código:subrutinas en archivos por lotes

@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 

espero que esta salida:

Start 
Calling SUB_A 
In SUB_A 
Calling SUB_B 
In SUB_B 
End 

Pero me sale esto:

Start 
Calling SUB_A 
In SUB_A 
Calling SUB_B 
In SUB_B 
In SUB_A 

¿qué estoy haciendo mal aquí?

Respuesta

14

Los retornos de línea CALL :SUB_B, la secuencia de comandos procede a las siguientes líneas:

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

es necesario insertar un GOTO:EOF después de la llamada si desea que se detenga allí.

Los archivos de proceso por lotes no son programas estructurados; son una secuencia de instrucciones con algunas funciones de tipo BÁSICO para GOTO y CALL.

3

Después de su línea CALL :SUB_B, el archivo por lotes pasa a SUB_A. Si no lo desea, debe poner allí una línea GOTO.

42

Si desea regresar de una LLAMADA, use el comando EXIT con el argumento/B (ya que "EXIT" solo terminará el archivo por lotes).

Por ejemplo:

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

Me parece preferible 'Ir a: EOF' como se puede añadir un valor de retorno como ERRORLEVEL:' salida/B% RetVal% ' – SvenS

+6

Una nota - no se debe definir' Etiqueta EOF' 'GOTO: EOF' funciona de la caja. También tenga en cuenta que está llamando ': EOF' y solo puede definir' EOF' que sería llamado por 'GOTO EOF'. – Nux

Cuestiones relacionadas