Почему cmd.exe по-разному ведет себя на 64-битном компьютере? - PullRequest
5 голосов
/ 17 декабря 2009

Если я создаю пакетный скрипт с именем 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 и не смог найти ни одной опции, управляющей тем, как она распространяет информацию об уровне ошибок из пакетных сценариев. На данный момент я не могу найти никакого рационального объяснения этой разницы.

Ответы [ 2 ]

7 голосов
/ 19 декабря 2009

Вы должны быть осторожны с выходом / b, поскольку он не работает правильно во всех случаях. Например:

temp.bat&&echo 0||echo 1

Если temp.bat содержит exit / b 1, вы ожидаете, что 1 будет напечатано, но это не так. К сожалению, единственный способ действительно установить рабочий код завершения для командного файла - это использовать @%COMSPEC% /C exit 1 в качестве строки last в командном файле

3 голосов
/ 27 июля 2010

Проблема с примером Андерса заключается в том, что он использует файл .bat. Если вы используете файл .cmd, выход работает в соответствии с документацией.

Основной смысл наличия файлов .bat и .cmd, похоже, заключается в обратной совместимости: если он выполняет файл .bat, cmd пытается эмулировать до-NT CLI, command.com, который обрабатывал ошибки намного проще.

По крайней мере, это моя догадка. Я наткнулся на эту ветку, пока искал официальные документы по вещи .bat / .cmd, которую я не могу найти.

...