ERRORLEVEL возвращаются исполняемыми файлами, надежными для обработки ошибок в пакетных сценариях

Это общая тема для обсуждения ERRORLEVEL, возвращаемого исполняемыми файлами в Windows. Я пишу скрипт для установки HTTP-сервера Apache в качестве службы Windows.

httpd -k install 

Исполняемый файл httpd возвращает

  • ERRORLEVEL 1 при наличии ошибки в файле конфигурации.
  • ERRORLEVEL 2, когда служба уже установлена.
  • ERRORLEVEL 0 для успеха.

Можно ли вообще обрабатывать ошибки на основе ERRORLEVEL, возвращаемого исполняемыми файлами? Нужно ли нам полагаться на другие средства для обработки кодов возврата команд, которые мы запускаем в наших пакетных сценариях?


person vivekIndia    schedule 26.08.2016    source источник


Ответы (1)


каждый программист может обрабатывать коды выхода (возвращенные %errorlevel%) по своему усмотрению. Существует общее мнение, что 0 означает «успех», а любое ненулевое значение означает «какую-то ошибку». Но на это нельзя полагаться.

Хороший пример — ping. Если вы пропингуете несуществующий IP-адрес в своей собственной сети, он вернет
Answer from <localhost>: destination unreachable.
Вы можете подумать, что это не удалось, и, следовательно, ожидать ненулевой уровень ошибки, но очевидно, что программист подумал: «Ну, вот является ответом, значит, он выполнен успешно"

Некоторые внутренние команды не затрагивают уровень ошибки, некоторые всегда возвращают ноль, некоторые всегда возвращают 1 (robocopy, спасибо aschipfl).
Исполняемые файлы do устанавливают уровень ошибки (спасибо Aacini), но как зависит от программатора. Некоторые из них всегда нулевые, большинство из них действительно пригодные для использования уровни ошибок.

Извините, что вынужден вам сказать: вы не можете полагаться на общие правила для %errorlevel%. Вы должны проверить это для каждой отдельной команды/исполняемого файла (либо по документации (если вам очень повезло), либо попробовав)

person Stephan    schedule 26.08.2016
comment
...только противоположный пример: robocopy возвращает ненулевое ErrorLevel даже в случае успеха... - person aschipfl; 26.08.2016
comment
Небольшое примечание: все исполняемые файлы, содержащиеся в *.exe файлах, изменяют уровень ошибки, только внутренняя команда может сохранить уровень ошибки. - person Aacini; 26.08.2016