Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/424: Рейтинг темы: голосов - 424, средняя оценка - 4.58
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
#1

Коды возврата ошибок (расшифровки ErrorLevel)*

20.12.2012, 22:21. Просмотров 77336. Ответов 32

Коды возврата ошибок (встроенных команд и других программ)

Как получить код возврата

Для новичков - очень подробно расписано в теме: Выполнение действия, если операция копирования прошла неуспешно

Порядок получения код возврата
Запускаем приложение, следующей командой проверяем переменную %ErrorLevel%. Есть еще такие варианты написания.
Например,
Bash
1
2
3
4
::Упаковать все документы
rar.exe a arch.rar *.doc
::Вывести на экран код возврата
Echo %ErrorLevel%
Не забываем, что внутри скобок и под циклом ErrorLevel можно получить только включив отложенное расширение переменных среды:
Bash
1
2
3
4
5
Setlocal EnableDelayedExpansion
(
  copy /y *.doc d:\*.*
  if !errorlevel!==0 Echo Operation Successful
)
В языках высокого уровня код возврата можно получить API функцией:

GetExitCodeProcess
GetExitCodeThread

А задать код при выходе из программы с помощью функций:

ExitProcess
ExitThread

либо указав число, которое вернет основная функция,
например main в C++:
Код
return 5;
или в AutoIt:
Код
Exit 5


Как сгенерировать код возврата


В Batch:
1. Выполнив команду, которая возвращает Errorlevel, например: cmd /c exit /b 5
где 5 - произвольный код в пределах от -2147483648 до +2147483647

В языках высокого уровня код возврата можно сгенерировать API функцией:
ExitProcess - http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
при этом приложение будет завершено.

Дополнение от Alterex на счет set ErrorLevel=



Общепринятые коды возврата консольных команд DWORD-коды
Преобразование текста ошибок в пользовательский код возврата.

Перечень ErrorLevel в этой теме:

WinRAR (rar.exe)
cmd.exe
copy
xcopy

RoboCopy
ARJ32/Console
7-Zip
msiexec, WMIC
WGET
ping
Windows Scripting Host
FC
Ошибки, возвращаемые FTP-сервером
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 22:21
Ответы с готовыми решениями:

Параноя возврата ошибок. Стоит ли проверять каждое действие? Когда останавливаться?
Если... если..если.. Партянка будет длинной.. Например, через 10 лет села...

Сгенерировать коды ошибок CMD
Добрый, помогите плиз сгенерировать сообщения об ошибках в командной строке CMD...

Коды ошибок Windows
Вам приходилось встречать при работе на компьютере раздражающие всплывающие...

Проверка %ERRORLEVEL%
Добрый день! Помогите пожалуйста. После запуска команды необходимо сделать...

%ERRORLEVEL% в Windows Embedded CE 6.0
@echo off set count=0 :begin set /A count=count+1 ping localhost -n 10 ...

32
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
18.01.2013, 17:38 #2
А как можно подглядеть возвращаемые командами коды ошибок errorlevel?
В разделе Предложения по совершенствованию увидел только что планируется выложить данную инфу, как успехи?)
0
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
18.01.2013, 21:05 #3
Badger, тыц
0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
18.01.2013, 21:13  [ТС] #4
sov44, ну там не так много.

Это наверное больше вопрос ко мне, что надо бы развивать тему, раз предложил =)
Badger, все это время, готового не находил по встроенным командам (ай-да и не искал).
Если что найдете, выкладываем. Пока информации 0. Есть только по другим (внешним) программам, вроде WinRAR.

А для тестирования вручную нужно готовить среду, чтобы испытать команды в разных ситуациях (то ли это нехватка прав, работа с заблокированным объектом) и т.д.

По другой предложенной темы (ключи) инфы довольно много.
1
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
21.01.2013, 14:41 #5
Цитата Сообщение от sov44 Посмотреть сообщение
тыц
Улыбнули Не видел еще такого.
Цитата Сообщение от Dragokas Посмотреть сообщение
Если что найдете, выкладываем.
Поищем.
0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
22.01.2013, 02:56  [ТС] #6
Ну что же начнем собирать.

Архиватор WinRAR
rar.exe

Код возврата
Описание
0Операция успешно завершена.
1Предупреждение. Произошли некритические ошибки.
2Произошла критическая ошибка.
3Неверная контрольная сумма CRC32. Данные повреждены.
4Предпринята попытка изменить заблокированный архив.
5Произошла ошибка записи на диск.
6Произошла ошибка открытия файла.
7Ошибка при указании параметра в командной строке.
8Недостаточно памяти для выполнения операции.
9Ошибка при создании файла.
10Нет файлов, удовлетворяющих указанной маске, и параметров.
255Операция была прервана пользователем.
3
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
22.01.2013, 19:43 #7
"VERIFY dummy_text" will set %ERRORLEVEL% to 1
0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
22.01.2013, 20:05  [ТС] #8
Charles Kludge, все равно не понял как она работает.
Написано, что по-умолчанию - выключена.
Т.е. ключ /V в Copy
Bash
Copy /V file1 file2
"временно включет проверку" результата записи и возвращает некий ненулевой ErrorLevel в случае провала.
На чем бы проверить? - может, флешку вытянуть в процессе записи...
0
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
22.01.2013, 22:11 #9
Common command / program exit codes / error levels
0 Успешное завершение/Program suseccfully completed.
1 Некорректная ф-ция/Incorrect function.
2 Файл не найден/The system cannot find the file specified.
3 Путь не найден/The system cannot find the path specified.
5 Доступ запрещён/Access is denied. Нет прав доступа к ресурсу.
9009./ 0x2331 программа не распознана как внутренняя или внешняя команда или батник/Program is not recognized as an internal or external command, operable program or batch file.
3221225477. 0xC0000005 Ошибка доступа/Access violation. Некорректное завершение или крах.
3221225495. 0xC0000017 Закончилась виртуальная память/Not enough virtual memory is available.
3221225786. 0xC000013A Приложение завершено по CTRL+C/The application terminated as a result of a CTRL+C.
3221225794. 0xC0000142 Ошибка инициализации приложения/The application failed to initialize properly. Обычно возникает при попытке запуска приложения (через иконку на десктопе), на которое у юзверя нет прав. Другая причина - ошибка инициализации gdi32.dll или user32.dll.
3221226505. 0xC0000409 Переполнение стека/Stack buffer overflow / overrun. Критическая ошибка в самом приложении.
3221225725. 0xC00000FD Стек исчерпан/Stack buffer underrun. Критическая ошибка в самом приложении.
3
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
22.01.2013, 22:18  [ТС] #10
Ок, Charles Kludge, исправился. Раз некоторые приложения для кода возврата выделяют буфер DWORD,
думаю, будет нелишним опубликовать и такие значения:

cmd.exe

Код Oct из DWORD
Описание
-4294958287программа не распознана как внутренняя или внешняя команда или батник/Program is not recognized as an internal or external command, operable program or batch file.
-1073741819Ошибка доступа/Access violation. Некорректное завершение или крах.
-1073741801Закончилась виртуальная память/Not enough virtual memory is available.
-1073741510Приложение завершено по CTRL+C (или принудительное завершение работы интерпретатора)/The application terminated as a result of a CTRL+C.
-1073741502Ошибка инициализации приложения/The application failed to initialize properly.Обысно возникает при попытке запуска приложения(через иконку на десктопе) на которое у юзверя нет прав. Другая причина - ошибка инициализации gdi32.dll или user32.dll.
-1073740791Переполнение стека/Stack buffer overflow / overrun. Критическая ошибка в самом приложении.
-1073741571Стек исчерпан/Stack buffer underrun. Критическая ошибка в самом приложении.
ПроизвольныйКод, заданный пользователем в команде Exit /B [code]
2
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
22.01.2013, 22:26 #11
Dragokas, это и есть 0xC000013A, см выше.
0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
22.01.2013, 22:32  [ТС] #12
Почему значения не совпали?
0
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
22.01.2013, 22:38 #13
Дык, совпали. Копипастим в calc, смотрим в hex, младший dword.
1
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
22.01.2013, 22:49  [ТС] #14
Ясно, значит у меня ответ вернуло 2-байтовый. FFFFFFFFC000013A.

P.S. Тестировал через
Visual Basic
1
Msgbox CreateObject("WScript.Shell").Run("cmd /c pause", 1, True)
0
Charles Kludge
22.01.2013, 22:54
  #15

Не по теме:

Видать, индусы поняли, чтобы возвращать DWORD, придётся писать очередной костыль и забили.:jokingly:

0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
23.01.2013, 01:47  [ТС] #16
Провел небольшой тест.

Развернуть код
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@echo off
Setlocal EnableDelayedExpansion
set flash=f:
set videofile=Cougar.Town.S01E01.rus.LostFilm.TV.avi
 
Echo Тест успешного копирования
copy nul nul
echo errorlevel %errorlevel%
Echo Тест копирования в защищенную правами папку
cmd /c copy c:\test.log c:\Windows\kmsem\1.log
echo errorlevel %errorlevel%
Echo Тест копирования несуществующего файла
cmd /c copy abracadabra L:\*.*
echo errorlevel %errorlevel%
verify off
if exist %flash%\%videofile% (
  del %flash%\%videofile%& ping 127.1>nul
)
Echo Тест копирования через XCOPY прав доступа ACL без административных привилегий
XCOPY /O i:\%videofile% %flash%\
echo errorlevel %errorlevel%
echo.
Echo Тест копирования видеофайла (268 MB) на флеш
Set STime=%time%
copy i:\%videofile% %flash%\
echo errorlevel %errorlevel%
Set ETime=%time%
Call :TimeElapsed "%STime%" "%ETime%" ret
Echo Прошло: %ret% с.
del %flash%\%videofile%
ping 4 127.1>nul
Set STime=%time%
Echo Тест копирования видеофайла (268 MB) на флеш с верификацией записи
copy /v i:\%videofile% %flash%\
echo errorlevel %errorlevel%
Set ETime=%time%
Call :TimeElapsed "%STime%" "%ETime%" ret
Echo Прошло: %ret% с.
pause
goto :eof
 
 
:TimeElapsed %1-StartTime %2-EndTime %3-var_result
Call :TimeToMSec "%~1" TimeS_ms
Call :TimeToMSec "%~2" TimeE_ms
Set /A diff=TimeE_ms-TimeS_ms
Set /A diffSS=diff/100
Set /A diffms=%diff% %% 100
Set %3=%diffSS%,%diffms%
Exit /B
 
:TimeToMSec %1-Time 2-var_mSec
For /F "Tokens=1-4 Delims=,:" %%A in ("%~1") do (
  Set /A HH=%%A
  Set MM=1%%B& Set /A MM=!MM!-100
  Set SS=1%%C& Set /A SS=!SS!-100
  Set mS=1%%D& Set /A mS=!mS!-100
)
Set /A %~2=(HH*60*60+MM*60+SS)*100+mS
Exit /B


Один раз получил странную ошибку. Copy скопировала файл, после чего написала, что "я такого имени не знаю..." =)) Error 9009

По итогам +Errorlevel:

xcopy

Код
Описание
0 Успешное завершение/Program suseccfully completed.
4 Файл не найден/The system cannot find the file specified.
4 Доступ запрещён/Access is denied. Нет прав доступа к ресурсу.
4 Невозможно скопировать файл поверх самого себя/The file cannot be copied onto itself
errorlevel = 0, даже, если пользователь ответил "Не заменять файл".

Также видим, что в случаях с защищенной правами папкой или когда файл не существует
мы получаем Errorlevel 1 (а не ожидаемые дефолтовые 5 и 2 соответственно).

copy

Код
Описание
0 Успешное завершение/Program suseccfully completed.
1 Файл не найден/The system cannot find the file specified.
1 Доступ запрещён/Access is denied. Нет прав доступа к ресурсу.
1 Невозможно скопировать файл поверх самого себя/The file cannot be copied onto itself
errorlevel = 0, даже если пользователь ответил "Не заменять файл"
Чтобы консоль задала этот вопрос:
1) для одиночного файла нужно указать ключ /-y
Bash
copy /-y file h:\
2) для маски файлов работает по-умолчанию. Обратная операция - "принудительная замена": ключ /y
Bash
Copy /y *.cmd h:\
Сравнение copy с verify off
1) без ключа
2) с ключем /v
показало, что в большинстве случаев с верификацией для копирования файла в ~250 МБ затрачивается на ~1,5 сек. больше времени. Не знаю, что именно оно проверяет, но уж файл точно целиком не считывается.
0
Миниатюры
Коды возврата ошибок (расшифровки ErrorLevel)*   Коды возврата ошибок (расшифровки ErrorLevel)*  
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
28.01.2013, 18:37  [ТС] #17
Из предыдущего поста видно, что команда copy возвращает только коды 0, 1,
что есть совсем не айс.

Я написал надстройку, которая согласовывает ошибки согласно таблице, приведенной Charles Kludge.
Естественно, это просто демо, экспериментальный набросок кода.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Echo Off
Setlocal EnableDelayedExpansion
set src=c:\setup.log
set dest=%windir%\system32
 
for /f "delims=" %%A in ('cmd /v:on /c "copy "%src%" "%dest%" 1^>nul 2^>^&3 ^&Echo ^!ErrorLevel^!"') do (
  Set StdErr=!Err!
  Set Err=%%A
)
if "%Err%" neq "0" (
  Echo.%StdErr%|>nul Find "Отказано в доступе"&& Set Err=5
  Echo.%StdErr%|>nul Find "Access is denied"&& Set Err=5
  Echo.%StdErr%|>nul Find "Не удается найти указанный файл"&& Set Err=2
  Echo.%StdErr%|>nul Find "The system cannot find the file specified"&& Set Err=2
  Echo.%StdErr%|>nul Find "Ошибка в синтаксисе команды"&& Set Err=1
  Echo.%StdErr%|>nul Find "The syntax of the command is incorrect"&& Set Err=1
)
if not Defined Err Set Err=1&::Default Errorlevel for the wrong Syntax
 
Set Errorlevel=%Err%
Echo ErrorLevel of the Last Copy operation is = %Errorlevel%
Echo.
pause
0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
21.02.2013, 20:53  [ТС] #18
Robocopy
HexDecimalMeaning
0×10 16 Serious error. Robocopy did not copy any files.
 Either a usage error or an error due to insufficient access privileges
 on the source or destination directories.
0×08 8 Some files or directories could not be copied
 (copy errors occurred and the retry limit was exceeded).
 Check these errors further.
0×04 4 Some Mismatched files or directories were detected.
 Examine the output log. Some housekeeping may be needed.
0×02 2 Some Extra files or directories were detected.
 Examine the output log for details.
0×01 1 One or more files were copied successfully (that is, new files have arrived).
0×00 0 No errors occurred, and no copying was done.
 The source and destination directory trees are completely synchronized.

Таким Batch-файлом получим короткое описание ошибок.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    if errorlevel 16 echo ***FATAL ERROR*** & goto end
    if errorlevel 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
    if errorlevel 14 echo FAIL + MISMATCHES + XTRA & goto end
    if errorlevel 13 echo OKCOPY + FAIL + MISMATCHES & goto end
    if errorlevel 12 echo FAIL + MISMATCHES& goto end
    if errorlevel 11 echo OKCOPY + FAIL + XTRA & goto end
    if errorlevel 10 echo FAIL + XTRA & goto end
    if errorlevel 9 echo OKCOPY + FAIL & goto end
    if errorlevel 8 echo FAIL & goto end
    if errorlevel 7 echo OKCOPY + MISMATCHES + XTRA & goto end
    if errorlevel 6 echo MISMATCHES + XTRA & goto end
    if errorlevel 5 echo OKCOPY + MISMATCHES & goto end
    if errorlevel 4 echo MISMATCHES & goto end
    if errorlevel 3 echo OKCOPY + XTRA & goto end
    if errorlevel 2 echo XTRA & goto end
    if errorlevel 1 echo OKCOPY & goto end
    if errorlevel 0 echo No Change & goto end
    :end
0
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
23.03.2013, 15:27 #19
ARJ32/Console
Hex Dec
Meaning
0 0 Успешно/Success
11Предупреждение(указанный файл для добавления/листа/экстракта не найден
22Фатальная ошибка
33Ошибка СRC(заголовок/файл или неверный пароль)
44Ошибка ARJ-SECURITY или попытка обновить ARJ-SECURED архив
55Диск полон или ошибка записи
66Невозможно открыть архив или файл
77simple user error - неверные параметры ком. строки(Юзер тупорылый)
88НЕПАМ - мало памяти
99Не ARJ-архив
0xA10Ошибка XMS/DPMI-чтение/запись
0xB11Юзер нажал <Ctrl/C>
0xC12too many chapters (over 250)/Слишком много глав/томов в многотомном архиве
1
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
13.04.2013, 17:42  [ТС] #20
Архиватор 7-Zip

Dec
Обозначение
0 Нет ошибок
1 Предупреждение (Не фатальная ошибка(и)).
 Например, один или более файлов были блокированы другим приложением, таким образом, они не были сжаты.
2 Фатальная ошибка
7 Ошибка командной строки
8 Недостаточно памяти для операции
255 Пользователь остановил процесс
0
13.04.2013, 17:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2013, 17:42

Обработка значения ERRORLEVEL
есть скриптик, кусок его прилагаю errorlevel выдает 17, хотя должен по моему...

Обработка значения ERRORLEVEL
Привет всем! Столкнулся с проблемой обработки значения errorlevel. Вызываю...

Получение ERRORLEVEL команды TASKKILL
Здравствуйте. В системе периодически запускается скрипт, работа которого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru