Как получить коды выхода в командной строке Windows
Узнайте, как получать коды выхода приложений в Windows cmd.exe с помощью %ERRORLEVEL%. Полное руководство с примерами пакетных файлов, альтернативами PowerShell и лучшими практиками для надежной обработки ошибок в скриптах.
Как получить код выхода приложения из командной строки Windows?
Я запускаю программу и хочу увидеть её код возврата (поскольку она возвращает разные коды в зависимости от разных ошибок).
Я знаю, что в Bash я могу сделать это, выполнив:
echo $?
Что мне делать при использовании cmd.exe в Windows?
Чтобы получить код выхода приложения из командной строки Windows с помощью cmd.exe, можно использовать переменную окружения %ERRORLEVEL%. Просто выполните команду echo %ERRORLEVEL% после запуска вашей программы, чтобы отобразить код возврата. Эта переменная автоматически сохраняет код выхода последней выполненной команды, аналогично тому, как $? работает в Bash.
Содержание
- Базовый метод получения кодов выхода
- Поведение переменной ErrorLevel
- Примеры реализации в пакетных файлах
- Альтернатива в PowerShell
- Расширенная обработка ErrorLevel
- Типичные сценарии использования
- Лучшие практики и устранение неполадок
Базовый метод получения кодов выхода
Простой способ получить код выхода последней выполненной команды в Windows cmd.exe:
your_program.exe
echo %ERRORLEVEL%
Например:
notepad.exe
echo %ERRORLEVEL%
Это отобразит код возврата, возвращенный notepad.exe при закрытии. Переменная %ERRORLEVEL% является псевдопеременной, которая автоматически содержит код выхода последней завершенной команды.
Важное замечание:
%ERRORLEVEL%на практике не чувствительна к регистру, поэтому%errorlevel%,%ErrorLevel%и%ERRORLEVEL%работают одинаково.
Поведение переменной ErrorLevel
Система errorlevel в Windows CMD работает иначе, чем в Unix/Linux:
- Сравнение уровней ошибок: В пакетных файлах
if errorlevel 1проверяет, равен ли код выхода 1 или больше, а не именно 1 - Проверка диапазона: Необходимо проверять от высшего к низшему:cmd
if errorlevel 2 ( echo Уровень ошибки 2 или выше ) else if errorlevel 1 ( echo Уровень ошибки 1 ) else ( echo Успех (уровень 0) )
Согласно документации SS64, никогда не пытайтесь устанавливать %ERRORLEVEL% с помощью SET, так как это создаст пользовательскую переменную с именем %ERRORLEVEL%, которая будет иметь приоритет над внутренней псевдопеременной.
Примеры реализации в пакетных файлах
Вот практические примеры реализации проверки кодов ошибок в пакетных файлах:
Простая проверка ошибок
@echo off
my_program.exe
if errorlevel 1 (
echo Программа завершилась с ошибкой кода %errorlevel%
exit /b %errorlevel%
) else (
echo Программа успешно завершена
)
Расширенная обработка ошибок с несколькими уровнями
@echo off
application.exe
if errorlevel 3 (
echo Произошла критическая ошибка - выход
exit /b 3
) else if errorlevel 2 (
echo Предупреждение: Обнаружена некритическая проблема
exit /b 2
) else if errorlevel 1 (
echo Произошла незначительная ошибка, но продолжаем работу
exit /b 1
) else (
echo Успех: Программа завершена без ошибок
exit /b 0
)
Использование условных операторов
@echo off
your_command.exe && (
echo Команда выполнена успешно
) || (
echo Команда завершилась с ошибкой уровня %errorlevel%
)
Как показано в примере на SuperUser, вы также можете использовать операторы && и || для условного выполнения на основе кодов ошибок.
Альтернатива в PowerShell
Если вы работаете в PowerShell вместо cmd.exe, подход отличается:
your_program.exe
echo "Код выхода: $LastExitCode"
Автоматическая переменная $LASTEXITCODE в PowerShell сохраняет код выхода последнего запущенного нативного приложения (Win32), как указано в документации Lindevs.
Для специфичной для PowerShell проверки ошибок:
your_program.exe
if ($LASTEXITCODE -eq 0) {
Write-Host "Программа выполнена успешно"
} else {
Write-Host "Программа завершилась с ошибкой кода $LASTEXITCODE"
}
Расширенная обработка ErrorLevel
Обработка отрицательных кодов выхода
Windows cmd.exe может обрабатывать отрицательные коды выхода, хотя это менее распространено. Вы можете получить их с помощью:
cmd /V:ON /c "cmd /C exit -1"
echo Уровень ошибки: !errorlevel!
Как демонстрируется в обсуждении на SuperUser, отрицательные коды ошибок работают в среде Windows.
Сброс ErrorLevel
Если вам нужно сбросить errorlevel, можно использовать:
ver >nul
Эта команда устанавливает errorlevel в 0 без вывода каких-либо данных.
Типичные сценарии использования
Скрипты установки приложений
@echo off
msiexec /i setup.msi
if errorlevel 1605 (
echo Продукт уже установлен
) else if errorlevel 1618 (
echo Другая установка уже выполняется
) else if errorlevel 0 (
echo Установка успешно завершена
) else (
echo Установка завершилась с ошибкой %errorlevel%
)
Операции с файлами
@echo off
copy source.txt destination.txt
if errorlevel 1 (
echo Копирование файла не удалось
exit /b 1
)
echo Файл успешно скопирован
Сетевые операции
@echo off
ping example.com
if errorlevel 1 (
echo Сеть недоступна или хост не отвечает
) else (
echo Сетевое подключение в порядке
)
Лучшие практики и устранение неполадок
Лучшие практики
- Всегда проверяйте коды ошибок после критических операций
- Используйте осмысленные коды выхода в своих скриптах (0=успех, 1=общая ошибка, 2+ специфические ошибки)
- Документируйте ваши коды выхода для других пользователей
- Тестируйте обработку ошибок как в сценариях успеха, так и в сценариях сбоя
Советы по устранению неполадок
- Если
%ERRORLEVEL%не работает, проверьте, не создали ли вы случайно пользовательскую переменную с таким именем - Используйте
ver >nulдля сброса errorlevel в 0 - Для сложных сценариев рассмотрите использование PowerShell для более совершенной обработки ошибок
- Помните, что
if errorlevel Xпроверяет значения >= X, а не именно X
Справочник распространенных кодов ошибок
| Код | Значение | Пример |
|---|---|---|
| 0 | Успех | Нормальное завершение программы |
| 1 | Общая ошибка | Файл не найден, доступ запрещен |
| 2 | Некорректное использование встроенной команды | Недопустимый синтаксис команды |
| 126 | Выполняемая команда не может быть запущена | Проблема с правами доступа или поврежденный исполняемый файл |
| 127 | Команда не найдена | Недопустимый путь или имя команды |
Используя эти техники, вы можете эффективно отслеживать и обрабатывать коды выхода приложений в среде Windows cmd.exe, обеспечивая надежную обработку ошибок для ваших скриптов и автоматизированных задач.
Источники
- Как получить код выхода приложения из командной строки Windows? - Stack Overflow
- Errorlevel и коды выхода - Windows CMD - SS64
- Windows: Получение кода выхода (ErrorLevel) - CMD & PowerShell - ShellHacks
- Как проверить код выхода последней команды в пакетном файле? - Super User
- Получение кода выхода последней команды в Windows | Lindevs
- Как получить код выхода предыдущей команды в Windows при использовании условного выполнения? - Super User
- Получение кода выхода приложения из командной строки Windows? - DevOpsSchool.com
Заключение
Получение кодов выхода приложений в Windows cmd.exe является простым с использованием переменной %ERRORLEVEL%. Помните, что сравнение errorlevel работает иначе, чем в Unix-системах - if errorlevel 1 проверяет значения 1 или больше. Для более сложных сценариев переменная $LASTEXITCODE в PowerShell предлагает дополнительную гибкость. Всегда реализуйте правильную обработку ошибок в своих скриптах для обеспечения надежности и предоставления осмысленной обратной связи пользователям.