Провел небольшой тест.
Развернуть код
Bash | ||
|
Один раз получил странную ошибку. 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
2) для маски файлов работает по-умолчанию. Обратная операция — «принудительная замена»: ключ /y
Сравнение copy с verify off
1) без ключа
2) с ключем /v
показало, что в большинстве случаев с верификацией для копирования файла в ~250 МБ затрачивается на ~1,5 сек. больше времени. Не знаю, что именно оно проверяет, но уж файл точно целиком не считывается.
Коды возвратов ошибок в утилитах cmd.
Для корректного выполнения bat-ников, иногда необходимо добавить информацию об исключении действий, а также выводу сообщений об успешном или «не очень» завершении программы и утилиты.
WinRAR
0 | Операция успешно завершена. |
1 | Предупреждение. Произошли некритические ошибки. |
2 | Произошла критическая ошибка. |
3 | Неверная контрольная сумма CRC32. Данные повреждены. |
4 | Предпринята попытка изменить заблокированный архив. |
5 | Произошла ошибка записи на диск. |
6 | Произошла ошибка открытия файла. |
7 | Ошибка при указании параметра в командной строке. |
8 | Недостаточно памяти для выполнения операции. |
9 | Ошибка при создании файла. |
10 | Нет файлов, удовлетворяющих указанной маске, и параметров. |
255 | Операция была прервана пользователем. |
WGET
Код возврата
|
Описание |
0 | No problems occurred. |
1 | Generic error code. |
2 | Parse error—for instance, when parsing command-line options, the ‘.wgetrc’ or ‘.netrc’… |
3 | File I/O error. |
4 | Network failure. |
5 | SSL verification failure. |
6 | Username/password authentication failure. |
7 | Protocol errors. |
8 | Server issued an error response. |
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, даже если пользователь ответил «Не заменять файл»
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, даже если пользователь ответил «Не заменять файл»
Популярные сообщения из этого блога
TRUNCATE / DELETE / DROP или как очистить таблицу
ИМЕЕМ: Таблица MSG (сообщения) с большим количеством записей. SQL> CREATE TABLE msg (id INTEGER NOT NULL PRIMARY KEY, description CHAR (50) NOT NULL, date_create DATE); ЗАДАЧА: Необходимо очистить таблицу от данных РЕШЕНИЕ: Для решения данной задачи есть несколько способов. Ниже описание и пример каждого из них. Способ №1 — используем DELETE Самый простой способ (первый вариант) — выполнение оператора удаления записи. При его выполнении вы будете видеть результат (сколько записей удалено). Удобная штука когда необходимо точно знать и понимать правильные ли данные удалены. НО имеет недостатки перед другими вариантами решения поставленной задачи. SQL> DELETE FROM msg; —Удалит все строки в таблице SQL> DELETE FROM msg WHERE date_create = ‘2019.02.01’; —Удалит все строки у которых дата создания «2019.02.01» Способ №2 — используем TRUNCATE Использование оператора DML для очистки всех строк в та
Linux (РедОС). Сброс пароля
Используется ОС РедОС 7.1, которая установлена в VBox. В процессе установки ОС, был задан только пароль для «root», дополнительных пользователей не создавалось. В рекомендациях на сайте производителя ОС указано: Помимо администратора РЕД ОС (root) в систему необходимо добавить, по меньшей мере, одного обычного пользователя. Работа от имени администратора РЕД ОС считается опасной (можно по неосторожности повредить систему), поэтому повседневную работу в РЕД ОС следует выполнять от имени обычного пользователя, полномочия которого ограничены. После перезапуска и попытке войти в систему под root, система выдает сообщение «Не сработало .попробуйте еще раз». Поэтому для решения проблемы было решено создать пользователя, для этого выполняем такие действия: После загрузки, в момент выбора системы, быстро нажимаем стрелки вверх и вниз (приостанавливаем обратный отсчет). Выбираем ядро и нажимаем «e». Находим строку, которая относится к ядру: здесь будет ряд «boot parameter
КБК. КВФО — Код вида финансового обеспечения (деятельности)
НПА: Приказ Минфина России от 01.12.2010 N 157н Письмо Минфина России от 18 января 2018 г. N 02-06-10/2715 В целях организации и ведения бухгалтерского учета, утверждения Рабочего плана счетов применяются следующие коды вида финансового обеспечения (деятельности): для государственных (муниципальных) учреждений, организаций, осуществляющих полномочия получателя бюджетных средств, финансовых органов соответствующих бюджетов и органов, осуществляющих их кассовое обслуживание: 1 — деятельность, осуществляемая за счет средств соответствующего бюджета бюджетной системы Российской Федерации (бюджетная деятельность); 2 — приносящая доход деятельность (собственные доходы учреждения); 3 — средства во временном распоряжении; 4 — субсидии на выполнение государственного (муниципального) задания; 5 — субсидии на иные цели; 6 — субсидии на цели осуществления капитальных вложений; 7 — средства по обязательному медицинскому страхованию; для отражения органами Федерального казн
SQL Error [53200]: ОШИБКА: нехватка разделяемой памяти Подсказка: Возможно, следует увеличить параметр max_locks_per_transaction
При выполнении запросов на БД (Postgres) возникла ошибка: 24.02.21 13:50:38.219,main,ERROR,ExecSql,null com.bssys.db.jdbc.DBSQLException: ОШИБКА: нехватка разделяемой памяти Подсказка: Возможно, следует увеличить параметр max_locks_per_transaction. Подробная информация по параметру здесь . Коротко ниже: max_locks_per_transaction (integer) Этот параметр управляет средним числом блокировок объектов, выделяемым для каждой транзакции; отдельные транзакции могут заблокировать и больше объектов, если все они умещаются в таблице блокировок. Значение по умолчанию = 64 рядом также находится параметр max_pred_locks_per_transaction (integer) В файле postgresql.conf (Postgres/data/) указано так: #———————————————————————- # LOCK MANAGEMENT #———————————————————————- #deadlock_timeout = 1s # max_locks_per_transaction = 64 # min 10 # (change requires restart) # max_pred_locks_per_transaction = 64
ЭС с ЦБ РФ. РЕКВИЗИТНЫЙ СОСТАВ ЭС
4 РЕКВИЗИТНЫЙ СОСТАВ ЭС ED101 Платежное поручение ED103 Платежное требование ED104 Инкассовое поручение ED105 Платежный ордер ED107 Поручение банка ED108 Платежное поручение на общую сумму с реестром ED109 Банковский ордер ED110 ЭПС сокращенного формата ED111 Мемориальный ордер в электронном виде ED113 Выставляемое на оплату платежное требование ED114 Выставляемое на оплату инкассовое поручение ED201 Извещение о результатах контроля ЭС (пакета ЭС) ED202 Запрос по ЭПС (пакету ЭПС) ED203 Запрос по группе ЭПС ED204 Запрос об отзыве/аннулировании ЭС (пакета ЭС). ED205 Извещение о состоянии ЭПС (пакета ЭПС) ED206 Подтверждение
I am running a program and want to see what its return code is (since it returns different codes based on different errors).
I know in Bash I can do this by running
echo $?
What do I do when using cmd.exe on Windows?
asked Dec 2, 2008 at 18:04
3
The «exit code» is stored in a shell variable named errorlevel
.
The errorlevel
is set at the end of a console application. Windows applications behave a little differently; see @gary’s answer below.
Use the if
command keyword errorlevel
for comparison:
if errorlevel <n> (<statements>)
Which will execute statements when the errorlevel is greater than or equal to n. Execute if /?
for details.
A shell variable named errorlevel
contains the value as a string and can be dereferenced by wrapping with %’s.
Example script:
my_nifty_exe.exe
rem Give resolution instructions for known exit codes.
rem Ignore exit code 1.
rem Otherwise give a generic error message.
if %errorlevel%==7 (
echo "Replace magnetic tape."
) else if %errorlevel%==3 (
echo "Extinguish the printer."
) else if errorlevel 2 (
echo Unknown Error: %errorlevel% refer to Run Book documentation.
) else (
echo "Success!"
)
Warning: An environment variable named errorlevel, if it exists, will override the shell variable named errorlevel. if errorlevel
tests are not affected.
answered Dec 2, 2008 at 18:07
DrFloyd5DrFloyd5
13.5k2 gold badges25 silver badges34 bronze badges
6
Testing ErrorLevel
works for console applications, but as hinted at by dmihailescu, this won’t work if you’re trying to run a windowed application (e.g. Win32-based) from a command prompt. A windowed application will run in the background, and control will return immediately to the command prompt (most likely with an ErrorLevel
of zero to indicate that the process was created successfully). When a windowed application eventually exits, its exit status is lost.
Instead of using the console-based C++ launcher mentioned elsewhere, though, a simpler alternative is to start a windowed application using the command prompt’s START /WAIT
command. This will start the windowed application, wait for it to exit, and then return control to the command prompt with the exit status of the process set in ErrorLevel
.
start /wait something.exe
echo %errorlevel%
wjandrea
27.2k9 gold badges59 silver badges80 bronze badges
answered Jul 13, 2012 at 18:57
GaryGary
4,3761 gold badge22 silver badges19 bronze badges
2
answered Dec 2, 2008 at 18:09
Adam RosenfieldAdam Rosenfield
388k96 gold badges512 silver badges586 bronze badges
2
If you want to match the error code exactly (eg equals 0), use this:
@echo off
my_nify_exe.exe
if %ERRORLEVEL% EQU 0 (
echo Success
) else (
echo Failure Reason Given is %errorlevel%
exit /b %errorlevel%
)
Note that
if errorlevel 0
matcheserrorlevel
>= 0.
Seeif /?
.
Or, if you don’t handle success:
if %ERRORLEVEL% NEQ 0 (
echo Failed with exit-code: %errorlevel%
exit /b %errorlevel%
)
Top-Master
7,4435 gold badges39 silver badges68 bronze badges
answered Jul 29, 2014 at 16:08
Curtis YallopCurtis Yallop
6,5563 gold badges44 silver badges36 bronze badges
2
It’s worth noting that .BAT and .CMD files operate differently.
Reading https://ss64.com/nt/errorlevel.html it notes the following:
There is a key difference between the way .CMD and .BAT batch files set errorlevels:
An old .BAT batch script running the ‘new’ internal commands: APPEND, ASSOC, PATH, PROMPT, FTYPE and SET will only set ERRORLEVEL if an error occurs. So if you have two commands in the batch script and the first fails, the ERRORLEVEL will remain set even after the second command succeeds.
This can make debugging a problem BAT script more difficult, a CMD batch script is more consistent and will set ERRORLEVEL after every command that you run [source].
This was causing me no end of grief as I was executing successive commands, but the ERRORLEVEL would remain unchanged even in the event of a failure.
answered Sep 18, 2018 at 6:13
RockDoctorRockDoctor
3213 silver badges11 bronze badges
It might not work correctly when using a program that is not attached to the console, because that app might still be running while you think you have the exit code.
A solution to do it in C++ looks like below:
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "tchar.h"
#include "stdio.h"
#include "shellapi.h"
int _tmain( int argc, TCHAR *argv[] )
{
CString cmdline(GetCommandLineW());
cmdline.TrimLeft('"');
CString self(argv[0]);
self.Trim('"');
CString args = cmdline.Mid(self.GetLength()+1);
args.TrimLeft(_T("" "));
printf("Arguments passed: '%ws'n",args);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc < 2 )
{
printf("Usage: %s arg1,arg2....n", argv[0]);
return -1;
}
CString strCmd(args);
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
(LPTSTR)(strCmd.GetString()), // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d)n", GetLastError() );
return GetLastError();
}
else
printf( "Waiting for "%ws" to exit.....n", strCmd );
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
int result = -1;
if(!GetExitCodeProcess(pi.hProcess,(LPDWORD)&result))
{
printf("GetExitCodeProcess() failed (%d)n", GetLastError() );
}
else
printf("The exit code for '%ws' is %dn",(LPTSTR)(strCmd.GetString()), result );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return result;
}
svick
235k50 gold badges384 silver badges513 bronze badges
answered Jun 25, 2010 at 17:05
dmihailescudmihailescu
1,57516 silver badges14 bronze badges
1
At one point I needed to accurately push log events from Cygwin to the Windows Event log. I wanted the messages in WEVL to be custom, have the correct exit code, details, priorities, message, etc. So I created a little Bash script to take care of this. Here it is on GitHub, logit.sh.
Some excerpts:
usage: logit.sh [-h] [-p] [-i=n] [-s] <description>
example: logit.sh -p error -i 501 -s myscript.sh "failed to run the mount command"
Here is the temporary file contents part:
LGT_TEMP_FILE="$(mktemp --suffix .cmd)"
cat<<EOF>$LGT_TEMP_FILE
@echo off
set LGT_EXITCODE="$LGT_ID"
exit /b %LGT_ID%
EOF
unix2dos "$LGT_TEMP_FILE"
Here is a function to to create events in WEVL:
__create_event () {
local cmd="eventcreate /ID $LGT_ID /L Application /SO $LGT_SOURCE /T $LGT_PRIORITY /D "
if [[ "$1" == *';'* ]]; then
local IFS=';'
for i in "$1"; do
$cmd "$i" &>/dev/null
done
else
$cmd "$LGT_DESC" &>/dev/null
fi
}
Executing the batch script and calling on __create_event:
cmd /c "$(cygpath -wa "$LGT_TEMP_FILE")"
__create_event
answered Feb 28, 2015 at 19:33
jonrettingjonretting
4122 silver badges6 bronze badges
Ошибки в операционной системе Windows частое явление, однако их появление сопровождается без текстового описания. К счастью в Windows имеется встроенная утилита для поиска описаний ошибок — «CertUtil».
Для получения информации об ошибки запускаем командную строку любым удобным способом, например, нажав клавиши «Win+R» и введя «cmd» в окне «Выполнить». После запуска CMD используем следующую команду:
CertUtil /error номер_ошибки
После ввода команды нажимаем клавишу «Enter».
Описание можно будет увидеть в строке — «Текст сообщения об ошибке».
По умолчанию, когда выполнение командной строки завершено, оно должно либо возвращать ноль, если выполнение завершается успешно, либо ненулевое, если выполнение не выполняется. Когда пакетный скрипт возвращает ненулевое значение после сбоя выполнения, ненулевое значение будет указывать, что такое номер ошибки. Затем мы будем использовать номер ошибки, чтобы определить ее причину и соответствующим образом ее устранить.
Ниже приведены общий код выхода и их описание.
Код ошибки | Описание |
---|---|
0 | Программа успешно завершена. |
1 | Неверная функция. Указывает, что Action попытался выполнить нераспознанную команду в командной строке Windows cmd.exe. |
2 | Система не может найти указанный файл. Указывает, что файл не может быть найден в указанном месте. |
3 | Система не может найти указанный путь. Указывает, что указанный путь не может быть найден. |
5 | В доступе отказано. Указывает, что у пользователя нет прав доступа к указанному ресурсу. |
9009 0x2331 |
Программа не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. Указывает, что команда, имя приложения или путь были введены с ошибкой при настройке действия. |
221225495 0xC0000017 -1073741801 |
Недостаточно виртуальной памяти. Это указывает на то, что в Windows не хватает памяти. |
3221225786 0xC000013A -1073741510 |
Приложение прекращено в результате CTRL + C. Указывает, что приложение было прекращено либо с помощью клавиш ввода CTRL + C или CTRL + Break, либо с помощью окна командной строки пользователя. |
3221225794 0xc0000142 -1073741502 |
Приложение не удалось правильно инициализировать. Указывает, что приложение было запущено на рабочем столе, к которому у текущего пользователя нет прав доступа. Другая возможная причина – не удалось инициализировать gdi32.dll или user32.dll. |
9009
0x2331
221225495
0xC0000017
-1073741801
Недостаточно виртуальной памяти.
Это указывает на то, что в Windows не хватает памяти.
3221225786
0xC000013A
-1073741510
3221225794
0xc0000142
-1073741502
Уровень ошибки
Переменная среды% ERRORLEVEL% содержит код возврата последней выполненной программы или сценария.
По умолчанию способ проверки на наличие ОШИБКИ находится через следующий код.
Синтаксис
IF %ERRORLEVEL% NEQ 0 ( DO_Something )
Обычно используется команда EXIT / B% ERRORLEVEL% в конце пакетного файла, чтобы вернуть коды ошибок из пакетного файла.
EXIT / B в конце командного файла остановит выполнение командного файла.
Используйте EXIT / B <exitcodes> в конце пакетного файла для возврата пользовательских кодов возврата.
Переменная среды% ERRORLEVEL% содержит последний уровень ошибки в пакетном файле, который является последними кодами ошибок из последней выполненной команды. В пакетном файле всегда рекомендуется использовать переменные среды вместо постоянных значений, поскольку одна и та же переменная расширяется до разных значений на разных компьютерах.
Давайте посмотрим на быстрый пример того, как проверить коды ошибок из командного файла.
пример
Давайте предположим, что у нас есть пакетный файл с именем Find.cmd, который имеет следующий код. В коде мы четко упомянули, что если мы не найдем файл lists.txt, то должны установить уровень ошибки равным 7. Точно так же, если мы видим, что переменная userprofile не определена, мы должны установить код уровня ошибки на 9.
if not exist c:lists.txt exit 7 if not defined userprofile exit 9 exit 0
Давайте предположим, что у нас есть еще один файл с именем App.cmd, который сначала вызывает Find.cmd. Теперь, если Find.cmd возвращает ошибку, в которой он устанавливает уровень ошибки больше 0, он завершает работу программы. В следующем пакетном файле после вызова Find.cnd он на самом деле проверяет, не превышает ли уровень ошибки больше 0.
Call Find.cmd if errorlevel gtr 0 exit echo “Successful completion”
Выход
В приведенной выше программе мы можем использовать следующие сценарии:
-
Если файл c: lists.txt не существует, в выводе консоли ничего не будет отображаться.
-
Если переменная userprofile не существует, в выводе консоли ничего не будет отображаться.
-
Если оба вышеуказанных условия выполнены, в командной строке будет отображена строка «Успешное завершение».
Если файл c: lists.txt не существует, в выводе консоли ничего не будет отображаться.
Если переменная userprofile не существует, в выводе консоли ничего не будет отображаться.
Если оба вышеуказанных условия выполнены, в командной строке будет отображена строка «Успешное завершение».
Loops
В главе, посвященной принятию решений, мы увидели утверждения, которые последовательно выполнялись одно за другим. Кроме того, реализации также могут быть выполнены в пакетном скрипте, чтобы изменить поток управления в логике программы. Затем они классифицируются в поток контрольных операторов.
S.No | Петли и описание |
---|---|
1 | При реализации заявления
В Batch Script нет прямого оператора while, но мы можем очень легко реализовать этот цикл, используя оператор if и метки. |
2 | Для заявления – список реализаций
Конструкция «FOR» предлагает возможности зацикливания для пакетных файлов. Ниже приведена общая конструкция оператора for для работы со списком значений. |
3 | Цикл по диапазонам
Оператор for также может перемещаться по диапазону значений. Ниже приводится общая форма заявления. |
4 | Классика для реализации цикла
Ниже приводится классический оператор for, который доступен в большинстве языков программирования. |
В Batch Script нет прямого оператора while, но мы можем очень легко реализовать этот цикл, используя оператор if и метки.
Конструкция «FOR» предлагает возможности зацикливания для пакетных файлов. Ниже приведена общая конструкция оператора for для работы со списком значений.
Оператор for также может перемещаться по диапазону значений. Ниже приводится общая форма заявления.
Ниже приводится классический оператор for, который доступен в большинстве языков программирования.
Цикл по аргументам командной строки
Оператор ‘for’ также можно использовать для проверки аргументов командной строки. В следующем примере показано, как можно использовать оператор for для циклического перебора аргументов командной строки.
пример
@ECHO OFF :Loop IF "%1"=="" GOTO completed FOR %%F IN (%1) DO echo %%F SHIFT GOTO Loop :completed
Выход
Давайте предположим, что приведенный выше код хранится в файле с именем Test.bat. Приведенная выше команда выдаст следующий вывод, если командный файл передает аргументы командной строки 1,2 и 3 как Test.bat 1 2 3.
1 2 3
Оператор break используется для изменения потока управления внутри циклов в любом языке программирования. Оператор break обычно используется в конструкциях цикла и используется для немедленного завершения самого внутреннего замкнутого цикла.