Подпрограммы в пакетных файлах - PullRequest
31 голосов
/ 15 сентября 2010

Учитывая следующий код:

@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 ]

50 голосов
/ 19 ноября 2011

Если вы хотите вернуться из 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
15 голосов
/ 15 сентября 2010

Возвращается строка CALL :SUB_B, скрипт переходит к следующим нескольким строкам:

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

Вам нужно вставить GOTO:EOF после вызова, если вы хотите, чтобы он на этом остановился.

Пакетные файлы не являются структурированными программами; они представляют собой последовательность инструкций с некоторым BASIC-подобным средством для GOTO и CALL.

3 голосов
/ 15 сентября 2010

После вашей строки CALL :SUB_B командный файл падает до SUB_A.Если вы этого не хотите, вам нужно поставить туда строку GOTO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...