более ранний ответ из Вики очень хорош. Здесь происходит некоторое дополнительное недокументированное (или, по крайней мере, неясное) поведение.
В вашем вопросе у вас несколько более сложная ситуация, но, скажем, вы вызываете / запускаете пакетный файл из оригинала, используя 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 часа
Я не пробовал ничего нового, я просто начал все сначала, и это сработало с первого раза. Сравнение с предыдущими версиями файлов показало мне эту (видимо) небольшую разницу. Оказывается, не существует такой вещи, как "маленькое" изменение !