Проверьте, возвращает ли процесс 0 с помощью пакетного файла - PullRequest
33 голосов
/ 15 декабря 2010

Я хочу запустить процесс с командным файлом и, если он возвращает ненулевое значение, сделать что-то еще. Мне нужен правильный синтаксис для этого.

Примерно так:

::x.bat

@set RetCode=My.exe
@if %retcode% is nonzero
   handleError.exe

В качестве бонуса вы можете рассмотреть вопрос об ответе на следующие вопросы:)

  • Как написать составной оператор с if?
  • Если приложение My.exe не запускается из-за отсутствия какой-либо библиотеки DLL, будет ли работать моя? Если нет, то как я могу обнаружить, что My.exe не удалось запустить?

Ответы [ 4 ]

54 голосов
/ 15 декабря 2010

ERRORLEVEL будет содержать код возврата последней команды. К сожалению, вы можете проверить только >=.

Обратите особое внимание на эту строку в документации MSDN для оператора If :

уровень ошибки Число

Определяет истинное условие только если предыдущая программа запускаемый Cmd.exe вернул код выхода больше или равно Число .

Таким образом, чтобы проверить 0, нужно думать нестандартно:

IF ERRORLEVEL 1 GOTO errorHandling
REM no error here, errolevel == 0
:errorHandling

Или, если вы хотите сначала написать код обработки ошибок:

IF NOT ERRORLEVEL 1 GOTO no_error
REM errorhandling, errorlevel >= 1
:no_error

Дополнительная информация о программировании на BAT: http://www.ericphelps.com/batch/ Или, более конкретно, для Windows cmd: MSDN с использованием пакетных файлов

14 голосов
/ 15 декабря 2010

Как написать составной оператор с помощью if?

Вы можете написать составной оператор в блоке if, используя скобки.Первая скобка должна стоять на одной строке с if, а вторая на отдельной строке.

if %ERRORLEVEL% == 0 (
    echo ErrorLevel is zero
    echo A second statement
) else if %ERRORLEVEL% == 1 (
    echo ErrorLevel is one
    echo A second statement
) else (
   echo ErrorLevel is > 1
   echo A second statement
)
3 голосов
/ 15 декабря 2010

Проект, над которым я работаю, мы делаем что-то вроде этого. Мы используем ключевое слово errorlevel, поэтому оно выглядит примерно так:

call myExe.exe
if errorlevel 1 (
  goto build_fail
)

Кажется, это работает для нас. Обратите внимание, что вы можете вводить несколько команд в скобках, например, эхо или что-то еще. Также обратите внимание, что build_fail определяется как:

:build_fail
echo ********** BUILD FAILURE **********
exit /b 1
1 голос
/ 25 января 2019

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

Итак, вот ответ на этот вопрос:

if %ERRORLEVEL% NEQ 0 exit %ERRORLEVEL%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...