выход /B 0 не работает

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

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

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

exit /B 0

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

So:

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), тот же результат! В первом случае он зависает, во втором мое окно закрывается как положено...

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


person murxx    schedule 21.05.2010    source источник


Ответы (3)


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

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

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

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

person Vicky    schedule 21.05.2010
comment
Но для goto:EOF я не могу выдать уровень ошибки, верно? :С - person murxx; 21.05.2010
comment
Я пробовал с goto :EOF, но никакой разницы: D:›goto :EOF Затем процесс зависает, пока я не закрою другие окна процесса! ;( - person murxx; 21.05.2010

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

В вашем вопросе у вас несколько более сложная ситуация, но скажем, вы вызываете/запускаете пакетный файл из оригинала, используя 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 часа

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

person JonathanDavidArndt    schedule 20.09.2018

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

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

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

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

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

start "" cmd /c "startServer.bat"
person Frank Bollack    schedule 21.05.2010
comment
Нет, это тоже не работает... Как я уже сказал, это работает следующим образом: call scriptA.bat › log.txt -----> там я вызываю: start startServer.bat До этого я использовал: call scriptA. летучая мышь | tee log.txt -----› там звоню: start startServer.bat С tee-командой не получается, почему то... - person murxx; 21.05.2010
comment
@murxx: Спасибо за отзыв. В общем, вы должны опубликовать как можно больше подробностей о своей проблеме. В противном случае довольно трудно догадаться, где может быть проблема. Лучше всего, если вы всегда показываете код, который создает проблемы. Кроме того, вы должны завести привычку принимать полезные ответы на свои вопросы. - person Frank Bollack; 21.05.2010