Почему cmd.exe имеет различное поведение на уровне ошибок на 64-разрядной машине?
-
20-09-2019 - |
Вопрос
Если я создам пакетный скрипт с именем temp.bat (например), содержащий:
exit /b 1
Когда я запускаю его различными способами, я получаю различное поведение в моей 32-разрядной системе XP по сравнению64-разрядная система XP.
На 32-разрядном:
> temp.bat
> echo %ERRORLEVEL%
1
> cmd /c temp.bat
> echo %ERRORLEVEL%
0
На 64-разрядной:
> temp.bat
> echo %ERRORLEVEL%
1
> cmd /c temp.bat
> echo %ERRORLEVEL%
1
Я просмотрел cmd.exe параметры, и мне не удалось найти какие-либо параметры, управляющие тем, как он распространяет информацию об уровне ошибок из пакетных сценариев.На данный момент я не могу найти никакого рационального объяснения этой разнице.
Решение
Вы должны быть осторожны с exit / b, поскольку на самом деле он работает некорректно не во всех экземплярах.Например:
temp.bat&&echo 0||echo 1
Если temp.bat содержит exit /b 1, вы ожидаете, что будет напечатано 1, но это не так.К сожалению, единственный способ действительно установить рабочий код выхода для пакетного файла - это использовать @%COMSPEC% /C exit 1
в качестве Последние строка в пакетном файле
Другие советы
Проблема с примером Андерса заключается в том, что он использует файл .bat.Если вы используете файл .cmd, выход работает так, как задокументировано.
Основной смысл наличия обоих файлов .bat и .cmd, по-видимому, заключается в обратной совместимости:если выполняется файл .bat, cmd пытается эмулировать CLI до NT, command.com который имел гораздо более простую обработку ошибок.
По крайней мере, таково мое предположение.Я наткнулся на эту тему, когда искал в Google официальные документы по .bat /.cmd, которые, похоже, я не могу найти.