Лучший способ проверить уровень ошибок

Я пишу пакетный скрипт для запуска в ОС Win 10. Однако у меня возникают проблемы с проверкой уровня ошибок существующего статуса команды Windows. Слабо я решил использовать следующий способ:

findstr /I /C:"EXIT_FAILURE" /I /C:"UNKNOWN" file 
if '%ERRORLEVEL%'=='0' goto CHECKFAILED

findstr /I /C:"EXIT_SUCCESS" file 
if '%ERRORLEVEL%'!='0' goto CHECKFAILED

exit /B 0

:CHECKFAILED
exit /B 2

Это правильный способ проверить - я имею в виду сравнение уровня ошибок в виде строки или использования в одинарных кавычках?

Уровень ошибки при проверке его числовых значений приводит к пониманию соображений, которые предоставляет команда, например:

if ERRORLEVEL 0

будет означать TRUE для ERRORLEVEL >=0. Точно так же есть и другие соображения.

Следовательно, правильно ли использовать? & сравнить ERRORLEVEL как строку, как указано выше?


person Programmer    schedule 03.07.2019    source источник
comment
Нет - в этом вопросе говорится об использовании ERRORLEVEL в командных блоках IF.   -  person Programmer    schedule 03.07.2019
comment
Это зависит от варианта использования; нет правильного или неправильного способа проверить уровень ошибок, а это означает, что любой ответ, который мы даем, будет основан на мнении. Тем не менее, двойные кавычки лучше подходят для сравнения, чем одинарные.   -  person SomethingDark    schedule 03.07.2019
comment
Проверить if /?; != не является допустимым компаратором.   -  person Stephan    schedule 03.07.2019
comment
Одна строка с несколькими командами с использованием пакетного файла Windows также отвечает на ваш вопрос.   -  person Mofi    schedule 04.07.2019


Ответы (1)


Вот альтернативный подход с использованием условных операторов && и ||. Он основан на вашем предыдущем посте, который, похоже, связан с тем же вопросом, использование уровней ошибок.

Условные операторы работают примерно так:

  • && 'если предыдущая команда выполнена успешно'
  • || 'если предыдущая команда не удалась'.
@Echo Off
If "%~4"=="" Exit /B 1
If Not Exist "%~3" Exit /B 1
If Not Exist "%~2\%~1" Exit /B 1
If Not Exist "%__APPDIR__%findstr.exe" Exit /B 1

Set "arg1=%~1"
Set "logfile=%~3\%~4.%arg1:.=_%.res"

Copy /V /Y "%~2\%~1" "%logfile%" 1>NUL 2>&1 || Exit /B 1

Set "findstr=%__APPDIR__%findstr.exe"
Set "errno=0"

"%findstr%" /I "EXIT_FAILURE UNKNOWN" "%logfile%" 1>NUL 2>&1 && (Set "errno=2"
) || "%findstr%" /I "PASS" "%logfile%" 1>NUL 2>&1 || Set "errno=2"

Exit /B %errno%

Таким образом, если команда findstr выполнена успешно, то есть хотя бы одна из строк совпала, он выполнит команду set, т.е. определить значение номера ошибки. Если команда findstr не удалась, т.е. ни одна из строк не совпала, команда set также не смогла бы определить значение номера ошибки, а это означает, что будет запущена вторая команда findstr. Если вторая команда findstr не соответствует строке, значение номера ошибки будет set, иначе останется значение по умолчанию 0.

person Compo    schedule 03.07.2019