Почему cmd.exe имеет различное поведение на уровне ошибок на 64-разрядной машине?

StackOverflow https://stackoverflow.com/questions/1924497

  •  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, которые, похоже, я не могу найти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top