выход / B 0 не работает - PullRequest
5 голосов
/ 21 мая 2010

У меня следующая проблема:

Я создал пакетный скрипт, который вызывает себя там (для возможности записи журнала параллельно). В скрипте я запускаю другой процесс (например, start startServer.bat), который запускает процесс Java и постоянно открыт.

В моем исходном скрипте я жду 30 секунд, проверяю, запущен ли процесс, и делаю:

exit /B 0

К сожалению, это не работает, окно показывает, что выход / B 0 оценивается, но окно все еще остается открытым. Когда я закрываю окно с другим процессом (то есть «дочерние» процессы запускаются в моем .bat), мой скрипт продолжает работать.

Итак:

scriptA.bat

-> in there I call: start startServer.bat
-> wait 30 seconds
-> check is server is started
-> exit /B 0
Process hangs up!

Что очень странно, если я оберну другой сценарий, например:

scriptB.bat

-> call scriptA.bat
-----> in there I call: start startServer.bat
-----> wait 30 seconds
-----> check if server is started
-----> exit /B 0
-> scriptA.bat continues without any hangup!

Я тоже попробовал то же самое с выходом 0 (без / B), тот же результат! В первом случае он зависает, во втором случае мое окно закрывается, как и ожидалось ...

Кто-нибудь из вас когда-либо сталкивался с такой проблемой и знает, что здесь не так? Процесс зависает!

Ответы [ 3 ]

8 голосов
/ 21 мая 2010

Здесь есть хорошее объяснение всех вариантов выхода из пакетного скрипта: http://www.robvanderwoude.com/exit.php

В частности, с этой страницы:

Онлайн-справка DOS (HELP EXIT) не дает понять, что параметр / B выходит из текущего экземпляра сценария, который не обязательно совпадает с выходом из текущего сценария. То есть если скрипт находится в фрагменте кода CALLed, EXIT / B выходит из CALL, а не сценария.

Так что вы определенно не хотите exit /b 0 в этом случае. Если просто exit 0 не работает, попробуйте GOTO:EOF.

0 голосов
/ 20 сентября 2018

более ранний ответ из Вики очень хорош. Здесь происходит некоторое дополнительное недокументированное (или, по крайней мере, неясное) поведение.

В вашем вопросе у вас несколько более сложная ситуация, но, скажем, вы вызываете / запускаете пакетный файл из оригинала, используя exit /b 0 в вызываемом пакетном файле и ожидаете, что ERRORLEVEL доступно в оригинале.

Оригинал

@echo off
start "" /b /wait cmd /c "startServer.bat"
if ERRORLEVEL 1 echo Exit code is one  & exit /b 1
if ERRORLEVEL 0 echo Exit code is zero & exit /b 0

Детский пакетный файл

@echo off
exit /b 0

Чтобы это работало, необходимо использовать команду start с определенными параметрами. В зависимости от параметров, они могут быть в определенном порядке. (!)

Согласно документации по SS64 при запуске , вы должны иметь возможность использовать переключатели /b и /wait. В документации не указывается, что порядок этих переключателей имеет значение, но это имеет значение.

Например, это будет НЕ работать (команды работают не по порядку, и ERRORLEVEL не возвращается):

start "" /wait /b cmd /c "startServer.bat"

Но это работает точно так, как ожидалось:

start "" /b /wait cmd /c "startServer.bat"

Единственная разница заключается в замене переключателей /b и /wait.


Я обнаружил это случайно, выполнив следующие действия:

  • Проверил всю документацию, которую смог найти на start и call и cmd
  • Несколько часов ударился головой о стену, пробуя все, что мог придумать
  • встал и вернулся через 24 часа

Я не пробовал ничего нового, я просто начал все сначала, и это сработало с первого раза. Сравнение с предыдущими версиями файлов показало мне эту (видимо) небольшую разницу. Оказывается, не существует такой вещи, как "маленькое" изменение !

0 голосов
/ 21 мая 2010

Полагаю, ваша проблема заключается в команде start. Следующая выдержка из справки start /? может указывать на проблему:

Команда / программа

Если это внутренняя команда cmd или командный файл, то командный процессор запускается с ключом / K для cmd.exe. Это означает, что окно останется после выполнения команды.

Если это не внутренняя команда cmd или пакетный файл, то это программа и будет работать как оконный приложение или консольное приложение.

В качестве решения вы можете попробовать изменить команду запуска следующим образом:

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