Вопрос или проблема
Используя скрипт для зависимостей 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
)
Важные моменты:
- Сравнение
errorlevel
: Использованиеequ
(равно) для целых чисел, например,if %errorlevel% equ 1
является правильным, так как это четкое целочисленное сравнение. - Избегайте использования кавычек: Как указано в вашем вопросе, использование кавычек для сравнения
errorlevel
с "1" сделает сравнение строковым, что приведет к неожиданным результатам. Следует проводить только числовые сравнения, когда речь идет оerrorlevel
. - Не дублируйте логику: Если вы хотите, чтобы программа выходила при ошибках, оставляйте команду
exit /b
в последнем условии. Это уменьшит вероятность возникновения путаницы в управлении потоками выполнения.
Результат:
При выполнении команд, если хотя бы одна из них завершится с кодом ошибки 1
, терминал приостановит выполнение, и вы сможете увидеть, что произошло. Если же все команды пройдут успешно (errorlevel = 0
), сценарий завершится без дополнительных действий.
Дополнительная информация:
Если вам нужна более подробная информация о командах, вы можете ознакомиться с документацией; вот некоторые ссылки:
Используя вышеуказанные рекомендации, ваш сценарий будет функционировать так, как вы и ожидаете, эффективно обрабатывая возможные ошибки во время выполнения.