Подпрограммы в пакетных файлах
С учетом следующего кода:
@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
Что я здесь делаю неправильно?
Ответы
Ответ 1
Возвращается строка CALL :SUB_B
, script переходит к следующим строкам:
:SUB_A # no effect from this one
ECHO In SUB_A # prints message
Вам нужно вставить GOTO:EOF
после вызова, если вы хотите, чтобы он там остановился.
Пакетные файлы не являются структурированными программами; это последовательность инструкций с некоторым BASIC-подобным средством для GOTO и CALL.
Ответ 2
Если вы хотите вернуться из CALL, вы используете команду EXIT с аргументом /B (поскольку только "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
Ответ 3
После вашей строки CALL :SUB_B
пакетный файл попадает в SUB_A. Если вы этого не хотите, вам нужно поставить строку GOTO
.