Обработка нескольких условий с помощью errorlevel

Вопрос или проблема

Используя скрипт для зависимостей Python, я хочу приостановить выполнение, если уровень ошибки возвращает 1, и выйти, если выполнение команд прошло успешно и уровень ошибки возвращает 0.

py devscripts/install_deps.py --include py2exe
py devscripts/make_lazy_extractors.py
py -m bundle.py2exe
if %errorlevel% equ "1" (pause) else (exit /b)

В настоящее время скрипт закрывает окно терминала независимо от значения уровня ошибок, что мне нужно сделать, чтобы соответствовать моим требованиям?

Используемые сравнения не эквивалентны и не равны по своим элементам: отсутствие двойных кавычек вокруг первого элемента заставляет cmd трактовать его как integer, тогда как заключенная в кавычки "1" обрабатывается как строка.

:: Примечание: Пример рассматривает значение уровня ошибки как 1. // %errorlevel% equ 1

 if [ " ]%errorlevel%[ " ] == [ " ] 1 [ " ] (pause) else (exit /b) ✅
 
 if [ " ]%errorlevel%[ " ] == [ " ] 1 [ " ] (pause) else (exit /b) ❌
 if [ " ]%errorlevel%[ " ] == [ " ] 1 [ " ] (pause) else (exit /b) ❌

 if [ " ]%errorlevel%[ " ] equ [ " ] 1 [ " ] (pause) else (exit /b) ❌
 if [ " ]%errorlevel%[ " ] equ [ " ] 1 [ " ] (pause) else (exit /b) ❌

 if [ " ]%errorlevel%[ " ] equ [ " ] 1 [ " ] (pause) else (exit /b) ✅
 if [   ]%errorlevel%[   ] equ [   ] 1 [   ] (pause) else (exit /b) ✅
 if      %errorlevel%      equ       1       (pause) else (exit /b) ✅

       Integer      equ   Integer   true 
 if %errorlevel%    equ   integer  (pause) else (exit /b)

      "Strings"     equ  "Strings"  true 
 if "%errorlevel%"  equ     "1"    (pause) else (exit /b)

      "Strings"     equ  "Strings"  true 
 if "%errorlevel%"  ==      "1"    (pause) else (exit /b)

  • Чтобы сделать сравнения сопоставимыми и равными:
if       1        equ   1  (true) else (false)
if      "1"       ==   "1" (true) else (false)
if  %errorlevel%  equ   1  (true) else (false)
if "%errorlevel%" equ  "1" (true) else (false)
if "%errorlevel%" ==   "1" (true) else (false)


Некоторые дополнительные материалы:

Ответ или решение

Для успешного управления многоусловными ситуациями с использованием параметра errorlevel в Windows CMD, важно понимать, что правильное использование числовых и строковых сравнений имеет критическое значение для корректного выполнения вашего скрипта. В вашем случае, вам нужно остановить выполнение, если errorlevel возвращает 1, и выйти из скрипта, если выполнение команд прошло успешно и errorlevel возвращает 0.

Вот как можно исправить ваш скрипт:

py devscripts/install_deps.py --include py2exe
py devscripts/make_lazy_extractors.py
py -m bundle.py2exe

if %errorlevel% equ 1 (
    pause
) else (
    exit /b
)

Важные моменты:

  1. Сравнение errorlevel: Использование equ (равно) для целых чисел, например, if %errorlevel% equ 1 является правильным, так как это четкое целочисленное сравнение.
  2. Избегайте использования кавычек: Как указано в вашем вопросе, использование кавычек для сравнения errorlevel с "1" сделает сравнение строковым, что приведет к неожиданным результатам. Следует проводить только числовые сравнения, когда речь идет о errorlevel.
  3. Не дублируйте логику: Если вы хотите, чтобы программа выходила при ошибках, оставляйте команду exit /b в последнем условии. Это уменьшит вероятность возникновения путаницы в управлении потоками выполнения.

Результат:

При выполнении команд, если хотя бы одна из них завершится с кодом ошибки 1, терминал приостановит выполнение, и вы сможете увидеть, что произошло. Если же все команды пройдут успешно (errorlevel = 0), сценарий завершится без дополнительных действий.

Дополнительная информация:

Если вам нужна более подробная информация о командах, вы можете ознакомиться с документацией; вот некоторые ссылки:

Используя вышеуказанные рекомендации, ваш сценарий будет функционировать так, как вы и ожидаете, эффективно обрабатывая возможные ошибки во время выполнения.

Оцените материал
Добавить комментарий

Капча загружается...