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.4k2 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
26.2k8 gold badges57 silver badges78 bronze badges
answered Jul 13, 2012 at 18:57
GaryGary
4,1961 gold badge22 silver badges19 bronze badges
2
answered Dec 2, 2008 at 18:09
Adam RosenfieldAdam Rosenfield
385k96 gold badges510 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
6,6705 gold badges34 silver badges59 bronze badges
answered Jul 29, 2014 at 16:08
Curtis YallopCurtis Yallop
6,3783 gold badges44 silver badges33 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
3113 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
232k50 gold badges385 silver badges509 bronze badges
answered Jun 25, 2010 at 17:05
dmihailescudmihailescu
1,55516 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
Inside a batch file on Windows, I use 7-zip like this:
...right_path7z a output_file_name.zip file_to_be_compressed
How could I check the exit code of 7z
and take the appropriate action ?
asked Oct 1, 2010 at 4:47
Misha MoroshkoMisha Moroshko
7,1439 gold badges26 silver badges31 bronze badges
1
Test for a return code greater than or equal to 1:
if ERRORLEVEL 1 echo Error
or
if %ERRORLEVEL% NEQ 0 echo Error
or test for a return code equal to 0:
if %ERRORLEVEL% EQU 0 echo OK
You can use other commands such as GOTO
where I show echo
.
answered Oct 1, 2010 at 4:58
Dennis WilliamsonDennis Williamson
104k19 gold badges164 silver badges187 bronze badges
10
This really works when you have: App1.exe calls -> .bat which runs —> app2.exe
App2 returns errorlevel 1… but you need to catch that in the .bat and re-raise it to app1… otherwise .bat eats the errorlevel and app1 never knows.
Method:
In .bat:
app2.exe
if %ERRORLEVEL% GEQ 1 EXIT /B 1
This is a check after app2 for errorlevel. If > 0, then the .bat exits and sets errorlevel to 1 for the calling app1.
answered Apr 19, 2013 at 5:07
3
I had a batch script in Teamcity pipeline and it did not exit after it’s child script did exit with code 1.
To fix the problem I added this string IF %ERRORLEVEL% NEQ 0 EXIT 1
after the child script call.
main-script.bat
...some code
call child-script.bat
IF %ERRORLEVEL% NEQ 0 EXIT 1
...some code
After the child script call exit result is saved to %ERRORLEVEL%
. If it did exit with an error %ERRORLEVEL%
would not be equal to 0 and in this case we exit with code 1 (error).
answered Apr 17, 2020 at 20:54
Try this:
cd.>nul | call Your_7z_File.Bat && Goto :Next || Goto :Error
:: Or...
cd.>nul | ...right_path7z.exe a output_file_name.zip file_to_be_compressed && Goto :Next || Goto :Error
1) Set errorlevel == 0
cd.>nul
2) Redirect by |
to simultaneously call Your_7z_File.Bat
cd.>nul | call Your_7z_File.Bat
3) Lets the output/errorlevel to a conditional execution &&
and ||
filter the next action
cd.>nul | call Your_7z_File.Bat && Goto :Next || Goto :Error
You can also test it in command line adding echo/
:
cd.>nul | call Your_7z_File.Bat && echoGoto :Next || echoGoto :Error
-
Conditional Execution || && | & operators…
-
What is the easiest way to reset ERRORLEVEL to zero?
answered Apr 18, 2020 at 17:35
Io-oIIo-oI
6,8043 gold badges12 silver badges38 bronze badges
- Overview
- Part 1 – Getting Started
- Part 2 – Variables
- Part 3 – Return Codes
- Part 4 – stdin, stdout, stderr
- Part 5 – If/Then Conditionals
- Part 6 – Loops
- Part 7 – Functions
- Part 8 – Parsing Input
- Part 9 – Logging
- Part 10 – Advanced Tricks
Today we’ll cover return codes as the right way to communicate the outcome of your script’s execution to the world. Sadly, even
skilled Windows programmers overlook the importance of return codes.
Return Code Conventions
By convention, command line execution should return zero when execution succeeds and non-zero when execution fails. Warning messages
typically don’t effect the return code. What matters is did the script work or not?
Checking Return Codes In Your Script Commands
The environmental variable %ERRORLEVEL%
contains the return code of the last executed program or script. A very helpful feature is
the built-in DOS commands like ECHO
, IF
, and SET
will preserve the existing value of %ERRORLEVEL%
.
The conventional technique to check for a non-zero return code using the NEQ
(Not-Equal-To) operator of the IF
command:
IF %ERRORLEVEL% NEQ 0 (
REM do something here to address the error
)
Another common technique is:
IF ERRORLEVEL 1 (
REM do something here to address the error
)
The ERRORLEVEL 1
statement is true when the return code is any number equal to or greater than 1. However, I don’t use this technique because
programs can return negative numbers as well as positive numbers. Most programs rarely document every possible return code, so I’d rather explicity
check for non-zero with the NEQ 0
style than assuming return codes will be 1 or greater on error.
You may also want to check for specific error codes. For example, you can test that an executable program or script is in your PATH by simply
calling the program and checking for return code 9009.
SomeFile.exe
IF %ERRORLEVEL% EQU 9009 (
ECHO error - SomeFile.exe not found in your PATH
)
It’s hard to know this stuff upfront – I generally just use trial and error to figure out the best way to check the return code of the program or
script I’m calling. Remember, this is duct tape programming. It isn’t always pretty, but, it gets the job done.
Conditional Execution Using the Return Code
There’s a super cool shorthand you can use to execute a second command based on the success or failure of a command. The first program/script must
conform to the convention of returning 0 on success and non-0 on failure for this to work.
To execute a follow-on command after sucess, we use the &&
operator:
SomeCommand.exe && ECHO SomeCommand.exe succeeded!
To execute a follow-on command after failure, we use the ||
operator:
SomeCommand.exe || ECHO SomeCommand.exe failed with return code %ERRORLEVEL%
I use this technique heavily to halt a script when any error is encountered. By default, the command processor will continue executing
when an error is raised. You have to code for halting on error.
A very simple way to halt on error is to use the EXIT
command with the /B
switch (to exit the current batch script context, and not the command
prompt process). We also pass a specific non-zero return code from the failed command to inform the caller of our script about the failure.
SomeCommand.exe || EXIT /B 1
A simliar technique uses the implicit GOTO label called :EOF
(End-Of-File). Jumping to EOF in this way will exit your current script with
the return code of 1.
SomeCommand.exe || GOTO :EOF
Tips and Tricks for Return Codes
I recommend sticking to zero for success and return codes that are positive values for DOS batch files. The positive values are a good idea
because other callers may use the IF ERRORLEVEL 1
syntax to check your script.
I also recommend documenting your possible return codes with easy to read SET
statements at the top of your script file, like this:
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_FILE_NOT_FOUND=2
Note that I break my own convention here and use uppercase variable names – I do this to denote that the variable is constant and should not
be modified elsewhere. Too bad DOS doesn’t support constant values like Unix/Linux shells.
Some Final Polish
One small piece of polish I like is using return codes that are a power of 2.
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_FILE_NOT_FOUND=2
SET /A ERROR_FILE_READ_ONLY=4
SET /A ERROR_UNKNOWN=8
This gives me the flexibility to bitwise OR multiple error numbers together if I want to record numerous problems in one error code.
This is rare for scripts intended for interactive use, but, it can be super helpful when writing scripts you support but you don’t
have access to the target systems.
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SET /A errno=0
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_SOMECOMMAND_NOT_FOUND=2
SET /A ERROR_OTHERCOMMAND_FAILED=4
SomeCommand.exe
IF %ERRORLEVEL% NEQ 0 SET /A errno^|=%ERROR_SOMECOMMAND_NOT_FOUND%
OtherCommand.exe
IF %ERRORLEVEL% NEQ 0 (
SET /A errno^|=%ERROR_OTHERCOMMAND_FAILED%
)
EXIT /B %errno%
If both SomeCommand.exe and OtherCommand.exe fail, the return code will be the bitwise combination of 0x1 and 0x2, or decimal 3. This return code tells
me that both errors were raised. Even better, I can repeatedly call the bitwise OR with the same error code and still interpret which errors were
raised.
<< Part 2 – Variables
Part 4 – stdin, stdout, stderr >>
By default when a command line execution is completed it should either return zero when execution succeeds or non-zero when execution fails. When a batch script returns a non-zero value after the execution fails, the non-zero value will indicate what is the error number. We will then use the error number to determine what the error is about and resolve it accordingly.
Following are the common exit code and their description.
Error Code | Description |
---|---|
0 | Program successfully completed. |
1 | Incorrect function. Indicates that Action has attempted to execute non-recognized command in Windows command prompt cmd.exe. |
2 | The system cannot find the file specified. Indicates that the file cannot be found in specified location. |
3 | The system cannot find the path specified. Indicates that the specified path cannot be found. |
5 | Access is denied. Indicates that user has no access right to specified resource. |
9009 0x2331 |
Program is not recognized as an internal or external command, operable program or batch file. Indicates that command, application name or path has been misspelled when configuring the Action. |
221225495 0xC0000017 -1073741801 |
Not enough virtual memory is available. It indicates that Windows has run out of memory. |
3221225786 0xC000013A -1073741510 |
The application terminated as a result of a CTRL+C. Indicates that the application has been terminated either by the user’s keyboard input CTRL+C or CTRL+Break or closing command prompt window. |
3221225794 0xC0000142 -1073741502 |
The application failed to initialize properly. Indicates that the application has been launched on a Desktop to which the current user has no access rights. Another possible cause is that either gdi32.dll or user32.dll has failed to initialize. |
Error Level
The environmental variable %ERRORLEVEL% contains the return code of the last executed program or script.
By default, the way to check for the ERRORLEVEL is via the following code.
Syntax
IF %ERRORLEVEL% NEQ 0 ( DO_Something )
It is common to use the command EXIT /B %ERRORLEVEL% at the end of the batch file to return the error codes from the batch file.
EXIT /B at the end of the batch file will stop execution of a batch file.
Use EXIT /B < exitcodes > at the end of the batch file to return custom return codes.
Environment variable %ERRORLEVEL% contains the latest errorlevel in the batch file, which is the latest error codes from the last command executed. In the batch file, it is always a good practice to use environment variables instead of constant values, since the same variable get expanded to different values on different computers.
Let’s look at a quick example on how to check for error codes from a batch file.
Example
Let’s assume we have a batch file called Find.cmd which has the following code. In the code, we have clearly mentioned that we if don’t find the file called lists.txt then we should set the errorlevel to 7. Similarly, if we see that the variable userprofile is not defined then we should set the errorlevel code to 9.
if not exist c:lists.txt exit 7 if not defined userprofile exit 9 exit 0
Let’s assume we have another file called App.cmd that calls Find.cmd first. Now, if the Find.cmd returns an error wherein it sets the errorlevel to greater than 0 then it would exit the program. In the following batch file, after calling the Find.cnd find, it actually checks to see if the errorlevel is greater than 0.
Call Find.cmd if errorlevel gtr 0 exit echo “Successful completion”
Output
In the above program, we can have the following scenarios as the output −
-
If the file c:lists.txt does not exist, then nothing will be displayed in the console output.
-
If the variable userprofile does not exist, then nothing will be displayed in the console output.
-
If both of the above condition passes then the string “Successful completion” will be displayed in the command prompt.
Loops
In the decision making chapter, we have seen statements which have been executed one after the other in a sequential manner. Additionally, implementations can also be done in Batch Script to alter the flow of control in a program’s logic. They are then classified into flow of control statements.
S.No | Loops & Description |
---|---|
1 | While Statement Implementation
There is no direct while statement available in Batch Script but we can do an implementation of this loop very easily by using the if statement and labels. |
2 | For Statement — List Implementations
The «FOR» construct offers looping capabilities for batch files. Following is the common construct of the ‘for’ statement for working with a list of values. |
3 | Looping through Ranges
The ‘for’ statement also has the ability to move through a range of values. Following is the general form of the statement. |
4 | Classic for Loop Implementation
Following is the classic ‘for’ statement which is available in most programming languages. |
Looping through Command Line Arguments
The ‘for’ statement can also be used for checking command line arguments. The following example shows how the ‘for’ statement can be used to loop through the command line arguments.
Example
@ECHO OFF :Loop IF "%1"=="" GOTO completed FOR %%F IN (%1) DO echo %%F SHIFT GOTO Loop :completed
Output
Let’s assume that our above code is stored in a file called Test.bat. The above command will produce the following output if the batch file passes the command line arguments of 1,2 and 3 as Test.bat 1 2 3.
1 2 3
S.No | Loops & Description |
---|---|
1 | Break Statement Implementation
The break statement is used to alter the flow of control inside loops within any programming language. The break statement is normally used in looping constructs and is used to cause immediate termination of the innermost enclosing loop. |
У командный процессора cmd.exe есть такая вещь — уровень ошибки (error level). Это код выхода (exit code) программы, которую вы запускали последней. Проверить уровень ошибки можно при помощи команды IF ERRORLEVEL
.
IF ERRORLEVEL 1 ECHO error level is 1 or more
<sidebar>
Проверка IF ERROR LEVEL n
срабатывает, если уровень ошибки n или выше. Это, вероятно, потому, что многие программы выражают разную степень ошибки все большими и большими кодах выхода. К примеру, программа diff имеет 3 кода выхода: «0» означает, что файлы одинаковые, «1» — разные, «2» — случилось что-то страшное. Некоторые программы используют код выхода «0» для успеха и все остальное для ошибки.
</sidebar>
Вдобавок к этому внутреннему состоянию, вы, если хотите, можете создать переменную окружения с именем ERRORLEVEL
, так же, как вы можете создать переменную с именем FRED
. Но, как и FRED
, эта переменная не повлияет на уровень ошибки.
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
«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».
Однако, есть вариант, когда включено расширенный режим командного процессора, и вы используете %ERRORLEVEL%
.
В этом случае командный процессор ищет переменную с таким именем и, если не находит, заменяет %ERRORLEVEL%
на текущее значение внутреннего уровня ошибки. Это запасной вариант — как указать адрес соседа запасным адресом доставки товара, на случай, если вас нет дома. Однако это не повлияет на посылки, доставляемые соседу.
То же поведение и у %CD%
: если вы не установили переменную с таким именем, подставляется текущий каталог командного процессора. Но изменить каталог при помощи set CD=C:Windows
нельзя.
Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
ECHO error level is %ERRORLEVEL%>logfile
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
IF %ERRORLEVEL% EQU 1 echo Different!
Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
Провел небольшой тест.
Развернуть код
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 сек. больше времени. Не знаю, что именно оно проверяет, но уж файл точно целиком не считывается.
7 ответов
В псевдо-переменной среды с именем errorlevel
хранится код выхода:
echo Exit Code is %errorlevel%
Кроме того, команда if
имеет специальный синтаксис:
if errorlevel
Смотрите, if/?
для деталей.
пример
@echo off
my_nify_exe.exe
if errorlevel 1 (
echo Failure Reason Given is %errorlevel%
exit /b %errorlevel%
)
Предупреждение: если вы установите имя переменной среды errorlevel
, %errorlevel%
вернет это значение, а не код завершения. Используйте (set errorlevel=
) для очистки переменной среды, предоставляя доступ к истинному значению errorlevel
через переменную среды %errorlevel%
.
Samuel Renkert
02 дек. 2008, в 18:53
Поделиться
Тестирование ErrorLevel
работает для консольных приложений, но, как намекнул dmihailescu, это не сработает, если вы пытаетесь запустить оконное приложение (например, Win32) из командной строки. Окно приложения будет работать в фоновом режиме, и элемент управления немедленно вернется в командную строку (скорее всего, с ErrorLevel
равным нулю, чтобы указать, что процесс был успешно создан). Когда оконное приложение заканчивается, его статус выхода теряется.
Однако вместо использования пусковой установки C++, упомянутой в другом месте, более простая альтернатива заключается в том, чтобы запустить оконное приложение с помощью команды командной строки START/WAIT
. Это запустит оконное приложение, дождитесь его выхода и вернет управление в командную строку с статусом выхода процесса, установленного в ErrorLevel
.
start /wait something.exe
echo %errorlevel%
Gary
13 июль 2012, в 19:19
Поделиться
Adam Rosenfield
02 дек. 2008, в 19:33
Поделиться
Если вы хотите точно соответствовать коду ошибки (например, равно 0), используйте это:
@echo off
my_nify_exe.exe
if %ERRORLEVEL% EQU 0 (
echo Success
) else (
echo Failure Reason Given is %errorlevel%
exit /b %errorlevel%
)
if errorlevel 0
соответствует errorlevel
> = 0. См. if/?
,
Curtis Yallop
29 июль 2014, в 17:12
Поделиться
Он может работать неправильно при использовании программы, которая не подключена к консоли, поскольку это приложение все еще может работать, пока вы думаете, что у вас есть код выхода.
Решение для этого в С++ выглядит следующим образом:
#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 environment block
NULL, // Use parent 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;
}
dmihailescu
25 июнь 2010, в 17:26
Поделиться
Стоит отметить, что файлы.BAT и.CMD работают по-разному.
Чтение https://ss64.com/nt/errorlevel.html отмечает следующее:
Существует ключевое различие между путями файлов.CMD и.BAT, устанавливающими уровни ошибок:
Старый BAT-скрипт, выполняющий «новые» внутренние команды: APPEND, ASSOC, PATH, PROMPT, FTYPE и SET будет устанавливать ERRORLEVEL только в случае возникновения ошибки. Поэтому, если у вас есть две команды в пакетном скрипте и первый сбой, ERRORLEVEL останется установленным даже после успешной выполнения второй команды.
Это может затруднить отладку проблемы с BAT-скриптом, пакетный скрипт CMD более согласован и установит ERRORLEVEL после каждой команды, которую вы запускаете [source].
Это не вызывало у меня конца печали, поскольку я выполнял последовательные команды, но ERRORLEVEL оставался неизменным даже в случае сбоя.
RockDoctor
18 сен. 2018, в 07:40
Поделиться
В какой-то момент мне нужно было точно передать события журнала из Cygwin в журнал событий Windows. Я хотел, чтобы сообщения в WEVL были обычными, имели правильный код выхода, детали, приоритеты, сообщение и т.д. Поэтому я создал немного Bash script, чтобы позаботиться об этом. Здесь он находится на GitHub, logit.sh.
Некоторые выдержки:
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"
Вот часть содержимого временного файла:
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"
Вот функция создания событий в 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
}
Выполнение пакета script и вызов __create_event:
cmd /c "$(cygpath -wa "$LGT_TEMP_FILE")"
__create_event
jonretting
28 фев. 2015, в 19:52
Поделиться
Ещё вопросы
- 1Где я могу найти хороший пример FastScrollView?
- 1Поставщик макета устройства Android для Gmaps
- 0WildFly jboss-cli.sh добавить источник данных Mysql с useSSL = false
- 0Как объединить значения объекта в строку? join () для объектов?
- 1Есть ли способ добавить локальную базу данных в пакет Java-проекта NetBeans?
- 0Заполнить HTML данными JSON
- 0Удалить куки, если есть другой куки
- 0IE 6-7 толкает вниз плавающий div
- 0Как заставить усечение (не масштабирование) при печати TCPDF
- 0PHP получает данные из jquery
- 1Как получить миниатюру видео в Android
- 0PHP конвертировать массив в многомерный массив по родительскому идентификатору
- 1Sublime Text и проект Java на Mac
- 0Подкладка колонн вверх
- 0ios Slider по умолчанию использует последний слайд
- 1Отображение списка просмотра Android на основе выбора списка
- 1Matplotlib и Python: соедините элементы Gridspect и Subplot с канвой
- 1Базовый класс из Windows Service
- 0Перезапись Codeigniter .htaccess для базы данных
- 0AngularJS доступ к свойствам обещанного объекта в функции succes
- 1Входные строки должны быть кратны 16 Python Pycrypto
- 0Расфокусировка поля ввода в веб-представлении
- 0текст вне div в chrome (css)
- 1связь между закрытым ключом и подписанным сертификатом в хранилище ключей
- 1Как динамически переместить данные из одного массива в отдельный массив
- 0Беда с регулярным выражением
- 0MySQL не хранит микросекунды в datetime, но использует в где условия?
- 0MySQL phpMyAdmin событие подсчета среднего значения для текущей даты и времени
- 0Инкапсулированная связь и контроллер в директиве
- 0Показать следующую серию данных при изменении значения области в ng-repeat
- 0Последняя версия Wokrbench требует старой версии Mysql при попытке экспорта БД, но не может понизить версию Mysql (Wampserver) (со скриншотом с ошибкой)
- 1Dojo themePreviewer застрял «Загрузка…»
- 0шаблон класса специализация метода шаблона
- 0mysql запятая отдельный столбец таблицы в concat () или аналогичный подход
- 0Высокие диаграммы: столбцы перекрываются при скрытии по легенде
- 1Рабочая роль Azure Что пошло не так до метода OnRun ()?
- 0Изменить флажок в JQuery не работает в тексте! шаблон в backbone.js
- 1Android — написание приложений для еще не выпущенных устройств
- 0Как создать селектор jquery на основе другого селектора?
- 0Запустить несколько копий некоторых программ из программы на С ++
- 1Проблемы с glDrawTex_OES
- 1Сохранять анонимные типы при ссылках
- 1Проблема при настройке ListView в классе AsyncTask
- 0Невозможно загрузить изображения, используя SDL_LoadBMP
- 0Открытие Аккордеонной Панели по якорной ссылке на той же странице и на внешней странице
- 0объединить изображение и аудио ffmpeg xampp php
- 1C # XML неправильно проверяет схему в XmlReaderSettings
- 0SQL просто выберите * из двух таблиц
- 1Как я могу получить текущий сериализатор / десериализатор RestSharp
- 0codeigniter: данные не вставляются в таблицу с использованием insert_batch