Подтвердить что ты не робот

Подпрограммы в пакетных файлах

С учетом следующего кода:

@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

Что я здесь делаю неправильно?

4b9b3361

Ответ 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.