Другое

Как получить коды выхода в командной строке Windows

Узнайте, как получать коды выхода приложений в Windows cmd.exe с помощью %ERRORLEVEL%. Полное руководство с примерами пакетных файлов, альтернативами PowerShell и лучшими практиками для надежной обработки ошибок в скриптах.

Как получить код выхода приложения из командной строки Windows?

Я запускаю программу и хочу увидеть её код возврата (поскольку она возвращает разные коды в зависимости от разных ошибок).

Я знаю, что в Bash я могу сделать это, выполнив:

echo $?

Что мне делать при использовании cmd.exe в Windows?

Чтобы получить код выхода приложения из командной строки Windows с помощью cmd.exe, можно использовать переменную окружения %ERRORLEVEL%. Просто выполните команду echo %ERRORLEVEL% после запуска вашей программы, чтобы отобразить код возврата. Эта переменная автоматически сохраняет код выхода последней выполненной команды, аналогично тому, как $? работает в Bash.

Содержание

Базовый метод получения кодов выхода

Простой способ получить код выхода последней выполненной команды в Windows cmd.exe:

cmd
your_program.exe
echo %ERRORLEVEL%

Например:

cmd
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%, которая будет иметь приоритет над внутренней псевдопеременной.

Примеры реализации в пакетных файлах

Вот практические примеры реализации проверки кодов ошибок в пакетных файлах:

Простая проверка ошибок

cmd
@echo off
my_program.exe

if errorlevel 1 (
    echo Программа завершилась с ошибкой кода %errorlevel%
    exit /b %errorlevel%
) else (
    echo Программа успешно завершена
)

Расширенная обработка ошибок с несколькими уровнями

cmd
@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
)

Использование условных операторов

cmd
@echo off
your_command.exe && (
    echo Команда выполнена успешно
) || (
    echo Команда завершилась с ошибкой уровня %errorlevel%
)

Как показано в примере на SuperUser, вы также можете использовать операторы && и || для условного выполнения на основе кодов ошибок.

Альтернатива в PowerShell

Если вы работаете в PowerShell вместо cmd.exe, подход отличается:

powershell
your_program.exe
echo "Код выхода: $LastExitCode"

Автоматическая переменная $LASTEXITCODE в PowerShell сохраняет код выхода последнего запущенного нативного приложения (Win32), как указано в документации Lindevs.

Для специфичной для PowerShell проверки ошибок:

powershell
your_program.exe
if ($LASTEXITCODE -eq 0) {
    Write-Host "Программа выполнена успешно"
} else {
    Write-Host "Программа завершилась с ошибкой кода $LASTEXITCODE"
}

Расширенная обработка ErrorLevel

Обработка отрицательных кодов выхода

Windows cmd.exe может обрабатывать отрицательные коды выхода, хотя это менее распространено. Вы можете получить их с помощью:

cmd
cmd /V:ON /c "cmd /C exit -1"
echo Уровень ошибки: !errorlevel!

Как демонстрируется в обсуждении на SuperUser, отрицательные коды ошибок работают в среде Windows.

Сброс ErrorLevel

Если вам нужно сбросить errorlevel, можно использовать:

cmd
ver >nul

Эта команда устанавливает errorlevel в 0 без вывода каких-либо данных.

Типичные сценарии использования

Скрипты установки приложений

cmd
@echo off
msiexec /i setup.msi

if errorlevel 1605 (
    echo Продукт уже установлен
) else if errorlevel 1618 (
    echo Другая установка уже выполняется
) else if errorlevel 0 (
    echo Установка успешно завершена
) else (
    echo Установка завершилась с ошибкой %errorlevel%
)

Операции с файлами

cmd
@echo off
copy source.txt destination.txt

if errorlevel 1 (
    echo Копирование файла не удалось
    exit /b 1
)

echo Файл успешно скопирован

Сетевые операции

cmd
@echo off
ping example.com

if errorlevel 1 (
    echo Сеть недоступна или хост не отвечает
) else (
    echo Сетевое подключение в порядке
)

Лучшие практики и устранение неполадок

Лучшие практики

  1. Всегда проверяйте коды ошибок после критических операций
  2. Используйте осмысленные коды выхода в своих скриптах (0=успех, 1=общая ошибка, 2+ специфические ошибки)
  3. Документируйте ваши коды выхода для других пользователей
  4. Тестируйте обработку ошибок как в сценариях успеха, так и в сценариях сбоя

Советы по устранению неполадок

  • Если %ERRORLEVEL% не работает, проверьте, не создали ли вы случайно пользовательскую переменную с таким именем
  • Используйте ver >nul для сброса errorlevel в 0
  • Для сложных сценариев рассмотрите использование PowerShell для более совершенной обработки ошибок
  • Помните, что if errorlevel X проверяет значения >= X, а не именно X

Справочник распространенных кодов ошибок

Код Значение Пример
0 Успех Нормальное завершение программы
1 Общая ошибка Файл не найден, доступ запрещен
2 Некорректное использование встроенной команды Недопустимый синтаксис команды
126 Выполняемая команда не может быть запущена Проблема с правами доступа или поврежденный исполняемый файл
127 Команда не найдена Недопустимый путь или имя команды

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

Источники

  1. Как получить код выхода приложения из командной строки Windows? - Stack Overflow
  2. Errorlevel и коды выхода - Windows CMD - SS64
  3. Windows: Получение кода выхода (ErrorLevel) - CMD & PowerShell - ShellHacks
  4. Как проверить код выхода последней команды в пакетном файле? - Super User
  5. Получение кода выхода последней команды в Windows | Lindevs
  6. Как получить код выхода предыдущей команды в Windows при использовании условного выполнения? - Super User
  7. Получение кода выхода приложения из командной строки Windows? - DevOpsSchool.com

Заключение

Получение кодов выхода приложений в Windows cmd.exe является простым с использованием переменной %ERRORLEVEL%. Помните, что сравнение errorlevel работает иначе, чем в Unix-системах - if errorlevel 1 проверяет значения 1 или больше. Для более сложных сценариев переменная $LASTEXITCODE в PowerShell предлагает дополнительную гибкость. Всегда реализуйте правильную обработку ошибок в своих скриптах для обеспечения надежности и предоставления осмысленной обратной связи пользователям.

Авторы
Проверено модерацией
Модерация