cmd код возврата последней команды
ERRORLEVEL это не %ERRORLEVEL%
Проверка IF ERROR LEVEL n срабатывает, если уровень ошибки n или выше. Это, вероятно, потому, что многие программы выражают разную степень ошибки все большими и большими кодах выхода. К примеру, программа diff имеет 3 кода выхода: «0» означает, что файлы одинаковые, «1» — разные, «2» — случилось что-то страшное. Некоторые программы используют код выхода «0» для успеха и все остальное для ошибки.
rem this next command sets the error level to zero
CMD /C EXIT 0
set ERRORLEVEL=1
if ERRORLEVEL 1 echo Does this print?
Сообщение не будет отображено, поскольку переменная ERRORLEVEL не имеет никакого влияния на уровень ошибки. Это просто переменная, имя которой совпадает с концепцией командного процессора.
set BANKBALANCE=$1 000 000,00
«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».
То же поведение и у %CD% : если вы не установили переменную с таким именем, подставляется текущий каталог командного процессора. Но изменить каталог при помощи set CD=C:\Windows нельзя.
Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
ECHO error level is %ERRORLEVEL%>logfile
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
IF %ERRORLEVEL% EQU 1 echo Different!
Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
Коды возврата ошибок (расшифровки ErrorLevel)*
Коды возврата ошибок (встроенных команд и других программ)
Порядок получения код возврата
Запускаем приложение, следующей командой проверяем переменную %ErrorLevel%. Есть еще такие варианты написания.
Например,
В языках высокого уровня код возврата можно получить API функцией:
А задать код при выходе из программы с помощью функций:
либо указав число, которое вернет основная функция,
например main в C++:
Перечень ErrorLevel в этой теме:
Параноя возврата ошибок. Стоит ли проверять каждое действие? Когда останавливаться?
Если. если..если.. Партянка будет длинной.. Например, через 10 лет села батарейка-системная.
Коды возврата
Код возврата 2. Причина: ошибки работы встроенных средств оболочки. Мой вопрос: какие есть у.
sov44, ну там не так много.
Это наверное больше вопрос ко мне, что надо бы развивать тему, раз предложил =)
Badger, все это время, готового не находил по встроенным командам (ай-да и не искал).
Если что найдете, выкладываем. Пока информации 0. Есть только по другим (внешним) программам, вроде WinRAR.
А для тестирования вручную нужно готовить среду, чтобы испытать команды в разных ситуациях (то ли это нехватка прав, работа с заблокированным объектом) и т.д.
По другой предложенной темы (ключи) инфы довольно много.
Ну что же начнем собирать.
Ок, Charles Kludge, исправился. Раз некоторые приложения для кода возврата выделяют буфер DWORD,
думаю, будет нелишним опубликовать и такие значения:
Ясно, значит у меня ответ вернуло 2-байтовый. FFFFFFFFC000013A.
P.S. Тестировал через
Видать, индусы поняли, чтобы возвращать DWORD, придётся писать очередной костыль и забили.:jokingly:
Провел небольшой тест.
Один раз получил странную ошибку. Copy скопировала файл, после чего написала, что «я такого имени не знаю. » =)) Error 9009
По итогам +Errorlevel:
errorlevel = 0, даже, если пользователь ответил «Не заменять файл».
Также видим, что в случаях с защищенной правами папкой или когда файл не существует
мы получаем Errorlevel 1 (а не ожидаемые дефолтовые 5 и 2 соответственно).
errorlevel = 0, даже если пользователь ответил «Не заменять файл»
Чтобы консоль задала этот вопрос:
1) для одиночного файла нужно указать ключ /-y
250 МБ затрачивается на
1,5 сек. больше времени. Не знаю, что именно оно проверяет, но уж файл точно целиком не считывается.
Из предыдущего поста видно, что команда copy возвращает только коды 0, 1,
что есть совсем не айс.
Я написал надстройку, которая согласовывает ошибки согласно таблице, приведенной Charles Kludge.
Естественно, это просто демо, экспериментальный набросок кода.
Robocopy
Hex | Decimal | Meaning |
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-файлом получим короткое описание ошибок.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Коды ошибок, Коды ошибок для пользователей (не для мастеров)
ОшибкаПричинаE10проблемы подачи воды. Проверьте не закрыт ли кран, не забита ли сеточка, достаточно.
Krups Коды ошибок
Привезли десяток машинок Krups на ремонт, скиньте, пожалуйста, коды ошибок, чтобы не ползать за.
Коды ошибок в BAss
Всем привет. Кто знает как исправить ошибки Error codes list 0 BASS_OK 1 BASS_ERROR_MEM 2.
Коды ошибок Windows
Вам приходилось встречать при работе на компьютере раздражающие всплывающие окна с указанием.
Коды ошибок смартфонов!
После номера ошибки указывается название и описание. Общие ошибки: (-1)Not Found: не удалось.
Проверка кода завершения предыдущей команды
Еще один способ использования команды IF — это проверка кода завершения (кода выхода) предыдущей команды. Синтаксис для IF в этом случае имеет следующий вид:
IF [NOT] ERRORLEVEL число команда1 [ELSE команда2]
Здесь условие считается истинным, если последняя запущенная команда или программа завершилась с кодом возврата, равным либо превышающим указанное число.
Составим, например, командный файл, который бы копировал файл my.txt на диск C: без вывода на экран сообщений о копировании, а в случае возникновения какой-либо ошибки выдавал предупреждение:
XCOPY my.txt C:\ > NUL
REM Проверка кода завершения копирования
IF ERRORLEVEL 1 GOTO ErrOccurred
ECHO Копирование выполнено без ошибок.
ECHO При выполнении команды XCOPY возникла ошибка!
В операторе IF ERRORLEVEL … можно также применять операторы сравнения чисел, приведенные в табл. 3.2. Например:
IF ERRORLEVEL LEQ 1 GOTO Case1
Иногда более удобным для работы с кодами завершения программ может оказаться использование переменной %ERRORLEVEL%. (строковое представление текущего значения кода ошибки ERRORLEVEL ).
Проверка версии реализации расширенной обработки команд
Наконец, для определения внутреннего номера версии текущей реализации расширенной обработки команд применяется оператор IF в следующем виде:
IF CMDEXTVERSION число команда1 [ELSE команда2]
Здесь условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но число сравнивается с вышеупомянутым внутренним номером версии. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.
Организация циклов
В командных файлах для организации циклов используются несколько разновидностей оператора FOR, которые обеспечивают следующие функции:
· выполнение заданной команды для всех элементов указанного множества;
· выполнение заданной команды для всех подходящих имен файлов;
· выполнение заданной команды для всех подходящих имен каталогов;
· выполнение заданной команды для определенного каталога, а также всех его подкаталогов;
· получение последовательности чисел с заданными началом, концом и шагом приращения;
· чтение и обработка строк из текстового файла;
· обработка строк вывода определенной команды.
Цикл FOR … IN … DO …
Самый простой вариант синтаксиса команды FOR для командных файлов имеет следующий вид:
FOR %%переменная IN (множество)
DO команда [параметры]
Перед названием переменной должны стоять именно два знака процента (%%), а не один, как это было при использовании команды FORнепосредственно из командной строки.
Сразу приведем пример. Если в командном файле заданы строки
FOR %%i IN (Раз,Два,Три) DO ECHO %%i
то в результате его выполнения на экране будет напечатано следующее:
Параметр множество в команде FOR задает одну или более текстовых строк, разделенных запятыми, которые вы хотите обработать с помощью заданной команды. Скобки здесь обязательны. Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается. Если в строке, входящей во множество, используется запятая, то значение этой строки нужно заключить в кавычки. Например, в результате выполнения файла с командами
FOR %%i IN («Раз,Два»,Три) DO ECHO %%i
на экран будет выведено
Параметр %%переменная представляет подставляемую переменную (счетчик цикла), причем здесь могут использоваться только имена переменных, состоящие из одной буквы. При выполнении команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве, пока команда, стоящая после ключевого слова DO, не обработает все такие строки.
Чтобы избежать путаницы с параметрами командного файла %0 — %9, для переменных следует использовать любые символы кроме 0 – 9.
Параметр множество в команде FOR может также представлять одну или несколько групп файлов. Например, чтобы вывести в файл список всех файлов с расширениями txt и prn, находящихся в каталоге C:\TEXT, без использования команды DIR, можно использовать командный файл следующего содержания:
FOR %%f IN (C:\TEXT\*.txt C:\TEXT\*.prn) DO ECHO %%f >> list.txt
При таком использовании команды FOR процесс обработки продолжается, пока не обработаются все файлы (или группы файлов), указанные во множестве.
Цикл FOR /D … IN … DO …
Следующий вариант команды FOR реализуется с помощью ключа /D:
FOR /D %%переменная IN (набор) DO команда [параметры]
В случае, если набор содержит подстановочные знаки, то команда выполняется для всех подходящих имен каталогов, а не имен файлов. Скажем, выполнив следующий командный файл:
FOR /D %%f IN (C:\*.*) DO ECHO %%f
мы получим список всех каталогов на диске C:, например:
Цикл FOR /R … IN … DO …
С помощью ключа /R можно задать рекурсию в команде: FOR:
FOR /R [[диск:]путь] %%переменная IN (набор)
DO команда [параметры]
В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога. Например, для распечатки всех файлов с расширением txt в текущем каталоге и всех его подкаталогах можно использовать следующий пакетный файл:
FOR /R %%f IN (*.txt) DO PRINT %%f
Если вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если мы находимся в каталоге C:\TEXT с двумя подкаталогами BOOKS и ARTICLES, то в результате выполнения файла:
FOR /R %%f IN (.) DO ECHO %%f
на экран выведутся три строки:
Цикл FOR /L … IN … DO …
Ключ /L позволяет реализовать с помощью команды FOR арифметический цикл, в этом случае синтаксис имеет следующий: вид:
FOR /L %%переменная IN (начало,шаг,конец) DO команда [параметры]
Здесь заданная после ключевого слова IN тройка (начало,шаг,конец) раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1). Например, в результате выполнения следующего командного файла:
FOR /L %%f IN (1,1,5) DO ECHO %%f
переменная цикла %%f пробежит значения от 1 до 5, и на экране напечатаются пять чисел:
Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:
FOR /L %%f IN (1,1,5) DO CALL :2 %%f
В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку :2 (см. описание CALL в разделе «Изменения в командах перехода»). В шестой строке переменная цикла умножается на десять, и результат записывается в переменную M. Таким образом, в результате выполнения этого файла выведется следующая информация:
Цикл FOR /F … IN … DO …
Самые мощные возможности (и одновременно самый запутанный синтаксис) имеет команда: FOR с ключом /F:
FOR /F [«ключи»] %%переменная IN (набор)
DO команда [параметры]
Здесь параметр набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбиении его на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла (заданной команды).
По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр «ключи» служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в табл. 3.3 ключевые слова:
Таблица 3.3. Ключи в команде FOR /F | |
Ключ | Описание |
EOL=C | Определение символа комментариев в начале строки (допускается задание только одного символа) |
SKIP=N | Число пропускаемых при обработке строк в начале файла |
DELIMS=XXX | Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции |
TOKENS=X,Y,M-N | Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла |
При использовании ключа TOKENS=X,Y,M-N создаются дополнительные переменные. Формат M-N представляет собой диапазон подстрок с номерами от M до N. Если последний символ в строке TOKENS= является звездочкой, то создается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.
Разберем применение этой команды на примере пакетного файла parser.bat, который производит разбор файла myfile.txt:
IF NOT EXIST myfile.txt GOTO :NoFile
FOR /F «EOL=; TOKENS=2,3* DELIMS=, » %%i IN
(myfile.txt) DO @ECHO %%i %%j %%k
ECHO Не найден файл myfile.txt!
Здесь во второй строке производится проверка наличия файла myfile.txt; в случае отсутствия этого файла выводится предупреждающее сообщение. Команда FOR в третьей строке обрабатывает файл myfile.txt следующим образом:
Пропускаются все строки, которые начинаются с символа точки с запятой ( EOL=; ).
Вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми ( DELIMS=,).
В теле цикла переменная %%i используется для второй подстроки, %%j — для третьей, а %%k получает все оставшиеся подстроки после третьей.
В нашем примере переменная %%i явно описана в инструкции FOR, а переменные %%j и %%k описываются неявно с помощью ключа TOKENS=. Например, если в файле myfile.txt были записаны следующие три строки:
ААА ББББ ВВВВ,ГГГГГ ДДДД
то в результате выполнения пакетного файла parser.bat на экран выведется следующее:
ББББ ВВВВ ГГГГГ ДДДД
Ключ TOKENS= позволяет извлечь из одной строки файла до 26 подстрок, поэтому запрещено использовать имена переменных, начинающиеся не с букв английского алфавита (a–z). Следует помнить, что имена переменных FOR являются глобальными, поэтому одновременно не может быть активно более 26 переменных.
Команда FOR /F также позволяет обработать отдельную строку. Для этого следует ввести нужную строку в кавычках вместо набора имен файлов в скобках. Строка будет обработана так, как будто она взята из файла. Например, файл следующего содержания:
FOR /F «EOL=; TOKENS=2,3* DELIMS=, » %%i IN
(«ААА ББББ ВВВВ,ГГГГГ ДДДД») DO @ECHO %%i %%j %%k
при своем выполнении напечатает
ББББ ВВВВ ГГГГГ ДДДД
Вместо явного задания строки для разбора можно пользоваться переменными среды, например:
SET M=ААА ББББ ВВВВ,ГГГГГ ДДДД
FOR /F «EOL=; TOKENS=2,3* DELIMS=,
» %%i IN («%M%») DO @ECHO %%i %%j %%k
Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует вместо набора имен файлов в скобках ввести строку вызова команды в апострофах (не в кавычках!). Строка передается для выполнения интерпретатору команд cmd.exe, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующий командный файл:
ECHO Имена переменных среды:
FOR /F «DELIMS==» %%i IN (‘SET’) DO ECHO %%i
выведет перечень имен всех переменных среды, определенных в настоящее время в системе.
В цикле FOR допускается применение тех же синтаксических конструкций (операторов), что и для заменяемых параметров (табл. 3.4).
Таблица 3.4. Операторы для переменных команды FOR | |
Операторы | Описание |
% Fi | Переменная %i расширяется до полного имени файла |
% Di | Из переменной %i выделяется только имя диска |
% Pi | Из переменной %i выделяется только путь к файлу |
% Ni | Из переменной %i выделяется только имя файла |
% Xi | Из переменной %i выделяется расширение имени файла |
% Si | Значение операторов N и X для переменной %i изменяется так, что они работают с кратким именем файла |
Если планируется использовать расширения подстановки значений в команде FOR, то следует внимательно подбирать имена переменных, чтобы они не пересекались с обозначениями формата.
Например, если мы находимся в каталоге C:\Program Files\Far и запустим командный файл следующего содержания:
FOR %%i IN (*.txt) DO ECHO %%
то на экран выведутся полные имена всех файлов
Коды возврата ошибок (расшифровки ErrorLevel)*
Коды возврата ошибок (встроенных команд и других программ)
Порядок получения код возврата
Запускаем приложение, следующей командой проверяем переменную %ErrorLevel%. Есть еще такие варианты написания.
Например,
В языках высокого уровня код возврата можно получить API функцией:
А задать код при выходе из программы с помощью функций:
либо указав число, которое вернет основная функция,
например main в C++:
Перечень ErrorLevel в этой теме:
Параноя возврата ошибок. Стоит ли проверять каждое действие? Когда останавливаться?
Если. если..если.. Партянка будет длинной.. Например, через 10 лет села батарейка-системная.
Коды возврата
Код возврата 2. Причина: ошибки работы встроенных средств оболочки. Мой вопрос: какие есть у.
Хорошая тема с простыми примерами, как пользоваться кодами возврата ошибок и сокращенными записями || и &&
Многие родные Microsoft программы, такие как msiexec-установщик, WMIC. используют коды возврата ошибок API-функций.
WGET
Утилита для скачивания с HTTP, HTTPS, FTP файлов и целых сайтов.
With the exceptions of 0 and 1, the lower-numbered exit codes take precedence over higher-numbered ones, when multiple types of errors are encountered.
(с примерами и пояснениями для разрешения проблем).
Code 80005000 Object Required
Code 80005001 An unknown ADSI domain object was requested
Code 80005002 An unknown ADSI user object was requested
Code 80005003 An unknown ADSI computer object was requested
Code 8000500D The directory property cannot be found
Code 8009xxxx
Code 80092023 Illegal character in a key name for a certificate
Code 800Axxxx Syntax Errors
In VBScript, there are 53 syntax errors all beginning with 800Axxxx. These errors should be among the easiest to cure because the message often includes the missing punctuation mark or bracket.
Особенности реализации командного процессора cmd.exe операционных систем WinNT
Или Урок bat-аники 2-ой
Автор: Андрей Дибров
Источник: RSDN Magazine #4-2007
Опубликовано: 15.03.2008
Исправлено: 10.12.2016
Версия текста: 1.6
Предисловие
Желание организовать собранный материал в статью появилось после некоторых исследований работы bat-скриптов и накопления опыта по их составлению в проекте под Microsoft Visual Sudio 2005, интенсивно использующего промежуточные bat-скрипты для взаимодействия непосредственно с некоторыми сторонними консольными утилитами, участвующими в сборке.
В каждом разделе статьи будет рассматриваться та или иная проблема, будет оговорены её последствия или приведено наилучшее, по мнению автора, решение. Проведённые изыскания можно рассматривать отдельно, но крайне желательно это делать в том порядке, в котором они встречаются в статье, т.к. многие проблемы связаны друг с другом и что-то в дальнейшем может быть непонятно из-за пропущенных деталей.
Статья предусматривает, что читатель уже знаком с написанием bat-скриптов NT (далее просто скриптов), знает о применении команд и умеет пользоваться справкой по встроенным командам и прилагаемым утилитам командного процессора. В статье не рассматриваются сторонние утилиты, а также их проблемы и особенности работы.
ПРИМЕЧАНИЕ Некоторые проблемы, найденные в скриптах, могут быть связаны с их использованием (запуском) из проекта для Microsoft Visual Studio 2005 (C++), а также, возможно, и других сред, использующих обращения к bat-скриптам. В конце статьи приведены тексты bat-скриптов и ссылки на некоторые консольные утилиты, использовавшиеся при тестировании примеров. ТестированиеВсё что здесь проверялось, а оно проверялось мной полностью только на одной системе, проверялось обычным образом, т.е. выводы о работе строились в основном на результатах выполнения тест-скриптов, их текст и приводятся в качестве аргументов к каждому пункту проблемы.
|