Как вывести ошибку cmd

Несколько способов отобразить сообщение из командной строки

  • Содержание статьи
    • Использование echo
    • Использование msg
    • Использование mshta
    • Использование PowerShell
    • Комментарии к статье ( 3 шт )
    • Добавить комментарий

Командная строка в Microsoft Windows по прежнему активно используется для осуществления различных действий с операционными системами Windows, в том числе и для упрощенного выполнения каких-либо задач, или автоматизации выполняемых действий. В данной статье мы рассмотрим, казалось бы, не сложную задачу — вывод сообщения средствами командой строки, и различные способы осуществления данной задачи.

Использование echo

В данном примере мы рассмотрим использование команды echo, которая просто выводит в окне командной строки текст. Используя её совместно с командной start можно добиться появления отдельного окна командной строки с заданным текстом.

Вот так будет выглядеть пример, выводящий сообщение «Привет мир!» в командной строке.

start cmd /c "echo Привет мир! && pause"

Дополнив пример выше несколькими дополнительными командами и пробелами, сделаем более «красивый» вариант с отображением текста в командной строке:

start "" cmd /c "echo(&echo(&echo              Привет мир!     &echo(&pause>nul"

Использование msg

Программа msg поставляется вместе с Windows еще со времен версий Windows 2000 и Windows XP, и предназначена для передачи сообщений от одного пользователя другому пользователю. Она предлагает простые возможности по выводу сообщения, и так же проста в использовании.

В качестве примера, выведем сообщение «Привет мир!»:

msg %username% "Привет мир!"

Использование mshta

Mshta — программа, предназначенная для запуска приложений формата hta, которые представляют из себя программы, написанные с использованием HTML, CSS, JavaScript и VBScript. В данном случае, нам пригодиться возможность выполнения команд, написанных на языке JavaScript и VBScript. Используя знания данных языков, можно выводить сообщения.

Сперва рассмотрим возможности использования скриптового языка VBScript совместно с mshta.

Выведем сообщение «Привет мир!»:

mshta vbscript:Execute("msgbox ""Привет мир!"":close")

Добавим в наше сообщение заголовок «Пример»:

mshta vbscript:Execute("msgbox ""Привет мир!"",0,""Пример"":close")

Сделаем так, чтобы в сообщении были различные значки. Начнем со значка с ошибкой:

mshta vbscript:Execute("msgbox ""Привет мир!"",16,""Заголовок"":close")

Сменим его на вопросительный знак:

mshta vbscript:Execute("msgbox ""Привет мир!"",32,""Заголовок"":close")

Или, на значок информации:

mshta vbscript:Execute("msgbox ""Привет мир!"",48,""Заголовок"":close")

Теперь рассмотрим возможности mshta с JavaScript.

Отобразим сообщение «Привет мир!»:

mshta javascript:alert("Привет мир!");close();

Выведем сообщение, состоящее из нескольких строк:

mshta javascript:alert("Привет мир!nИ снова привет мир!nnВсе еще привет мир!");close();

Использование PowerShell

Из командной строки так же можно вызвать оболочку PowerShell, передав ей все необходимые параметры, в результате чего будет отображено окно с нужным сообщением.

powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Привет мир!""", """Пример""")

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

Skrud's user avatar

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

DrFloyd5's user avatar

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's user avatar

wjandrea

27.2k9 gold badges59 silver badges80 bronze badges

answered Jul 13, 2012 at 18:57

Gary's user avatar

GaryGary

4,3361 gold badge22 silver badges19 bronze badges

2

answered Dec 2, 2008 at 18:09

Adam Rosenfield's user avatar

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 matches errorlevel >= 0.
See if /?.

Or, if you don’t handle success:

if  %ERRORLEVEL% NEQ 0 (
    echo Failed with exit-code: %errorlevel%
    exit /b %errorlevel%
)

Top-Master's user avatar

Top-Master

7,3935 gold badges39 silver badges66 bronze badges

answered Jul 29, 2014 at 16:08

Curtis Yallop's user avatar

Curtis YallopCurtis Yallop

6,5363 gold badges44 silver badges35 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

RockDoctor's user avatar

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's user avatar

svick

235k50 gold badges384 silver badges513 bronze badges

answered Jun 25, 2010 at 17:05

dmihailescu's user avatar

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

Peter Mortensen's user avatar

answered Feb 28, 2015 at 19:33

jonretting's user avatar

jonrettingjonretting

4122 silver badges6 bronze badges

Error Handling in Batch Script

Every scripting and programming language contains an error handler like Java contains try-catch for error handling. In a Batch script, there is no direct way to do this, but we can create an error handler in the Batch script using a built-in variable of the Batch script name %ERRORLEVEL%.

This article will show how we can create a Batch script to handle errors and failures. Also, we are going to some examples that make the topic easier.

Error Handling in Batch Script

When a command successfully executes, it always returns an EXIT CODE that indicates whether the command successfully executed or failed to execute. So, to create an error handling in a Batch file, we can use that EXIT CODE in our program.

You can follow below general format to create an error handler:

@Echo off
SomeCommand && (
  ECHO Message for Success
) || (
  ECHO Message for Failure or Error
)

We can also do that by checking the variable named %ERRORLEVEL%. If the variable contains a value not equal to 0, then there might be a problem or error when executing the command. To test the %ERRORLEVEL% variable, you can follow the below example codes:

@ECHO off
Some Command Here !!!
IF %ERRORLEVEL% NEQ 0 (Echo Error found when running the command &Exit /b 1)

You must note that the keyword NEQ means Not Equal. And the variable %ERRORLEVEL% will only contain a non-zero value if there is a problem or error in the code.

An Example That Contains Errors

Below, we shared an example. We will run a Batch file named Your_file.bat from a location.

We intentionally removed that file from the directory. So it’s an error command.

The code for our example will be:

@echo off
ECHO Running a Batch file
CD G:BATCH
CALL Your_file.bat
IF  errorlevel 1 GOTO ERROR
ECHO The file run successfully.
GOTO EOF

:ERROR
ECHO The file didn't run successfully.
CMD /k
EXIT /b 1

:EOF

Now, as the file doesn’t exist in the directory, it will show an error, and you will get the below output when you run the code shared above.

Output:

Running a Batch file
The system cannot find the path specified.
'Your_file.bat' is not recognized as an internal or external command,
operable program or batch file.
The file didn't run successfully.

An Error-Free Code Example That Runs Successfully

In the example above, we made a mistake on the code intentionally to understand how the code works. If we correct it like below:

@echo off
ECHO Running a Batch file
CALL "G:BATCHYourfile.bat"
IF  errorlevel 1 GOTO ERROR
ECHO The file runs successfully.
GOTO EOF

:ERROR
ECHO The file didn't run successfully.
CMD /k
EXIT /b 1

:EOF

Then we will get an output like this:

Running a Batch file
This is from the first file
The file runs successfully.

Remember, all commands we discussed here are only for the Windows Command Prompt or CMD environment.

Эта статья рассказывает, какие возможности имеются в командном файле для привлечения внимания пользователя в случае какого-либо события или ошибки. Команды ECHO во многих случаях недостаточно, ведь это просто вывод текста, а хотелось бы, чтобы:

  • уведомление было заметным пользователю, даже если он в это время работает в другой программе
  • был удобный выбор для пользователя, какое действие bat файл должен сделать дальше
  • информация была наглядной, например, чтобы была видна серьёзность события (ошибка или просто информация)

В современных решения пользовательского интерфейса Windows уведомление работает не так, что окно внезапно выскакивает поверх всех, прерывая работу пользователя, теперь происходит вежливое мигание значком программы или командного файла на панели задач. Поэтому пользователь может спокойно продолжить свою работу, например, закончить какой-то документ, а затем щелкнуть по значку и посмотреть, что же там случилось.

Поднять окно командного файла

Чтобы поднять наверх окно командного файла, можно использовать возможности WSH: скрипт activate.js использует метод WshShell.AppActivate для окна, заголовок которого передаётся параметром командной строки:

var title = WScript.Arguments.Unnamed(0);
var wshshell = WScript.CreateObject("WScript.Shell");
wshshell.AppActivate(title);

Затем в командном файле устанавливаем заголовок окна и в нужный момент вызываем activate.js:

@echo off
set window_title=Мой bat файл
title %window_title%
rem Здесь выполняются команды...
if errorlevel 1 cscript //nologo activate.js "%window_title%" & pause

То есть если командный файл выполнился успешно, он тихо закрывается, не отвлекая пользователя. Если возникла ситуация, о которой нужно проинформировать пользователя, то окно поднимается наверх, показывая информацию об ошибке.

Этот скрипт можно переписать на VBScript.

Для наглядности будет полезно выделить цветом информацию о событии, например, об ошибке – красным цветом, о предупреждении – жёлтым и т.д..

Кроме этого, потребуется запрограммировать в bat файле выбор действия пользователем: с помощью pause для просто подтверждения, timeout для подтверждения с таймаутом или set /p для ввода значения.

В современных версиях Windows окно при выполнении этой команды окно не поднимается наверх, вместо этого начинает мигать значок на панели задач.

Показать всплывающее сообщение

Всплывающее сообщение MessageBox содержит текст со значком, это выглядит нагляднее, чем просто текст в консольном окне. Ещё в окне MessageBox могут быть различные сочетания кнопок (Да-Нет, ОК-Отмена и другие сочетания), с помощью которых пользователь может сделать свой выбор о выполняемых действиях.

Этот вариант использует возможности WSH и не требует установки  дополнительных программ.
Используется метод WshShell.Popup в скрипте popup.js

var text = WScript.Arguments.Unnamed(0);
var title = WScript.Arguments.Unnamed(1);
var wshshell = WScript.CreateObject("WScript.Shell");
wshshell.Popup(text,0,title,16);

Соответственно, командный файл вызывает его в случае ошибки:

cscript //nologo popup.js "Сбой процедуры полного резервного копирования. Сервер недоступен." "Резервное копирование"

Всплывающее окно NHMB

Программа nhmb также показывает всплывающее окно с выбором значка и кнопок, с возможностью задавать символы перевода строки, а также с отображением таймера в заголовке окна.

nhmb.exe "Сбой процедуры полного резервного копирования.nСервер недоступен." "Резервное копирование" error 60

В заголовке окна отображается время в секундах (55), оставшееся до автоматического закрытия окна и продолжения работы командного файла.

Все параметры всплывающего окна задаются в командной строке, и для удобства на странице программы есть генератор строки запуска, который формирует всю строку по требуемым условиям – нет необходимости разбираться в справке и тестировать команды, достаточно выбрать желаемое отображение и скопировать готовую строку в свой bat файл.

Онлайн генератор строки запуска программы nhmb на странице программы

Сравнение

Скрипт AppActivate Скрипт Popup Программа nhmb
Значок нет да да
Заголовок нет да да
Сообщение в несколько строк да да да
Команды с простым выбором нет да да
Команда по умолчанию с таймером нет есть, но таймер не отображается есть, таймер отображается
Требуется программирование да да нет

Узнать больше

Файлы для скачивания

Наши соцсети

Вывод на экран сообщения или задание режима вывода на экран сообщений команд. Вызванная без параметров команда echo выводит текущий режим.

Синтаксис

echo [{on|off}] [сообщение]

Параметры

{on|off}
Включение или отключения режима отображения на экране информации о работе команд.
сообщение
Задание текста для вывода на экран.
/?
Отображение справки в командной строке.

Примечания

  • Команда echo сообщение может оказаться полезной, если отключен режим отображения работы команд. Для вывода сообщений из нескольких строк без вывода дополнительных команд между ними следует использовать несколько последовательных команд echo сообщение после команды echo off в пакетной программе.
  • Если используется команда echo off, приглашение командной строки не отображается на экране. Чтобы отобразить приглашение, введите командуecho on.
  • Чтобы отключить вывод строк, введите символ «коммерческого эт» (@) перед командой в пакетном файле.
  • Чтобы вывести на экране пустую строку, введите следующую команду:

    echo.

  • Чтобы вывести символы канала (|) или перенаправления (< или >) при использовании команды echo, введите символ (^) непосредственно перед символом канала или перенаправления (например ^>, ^< или ^| ). Чтобы вывести символ (^), введите два этих символа подряд (^^).

Примеры

Следующий пример представляет собой пакетный файл, выводящий сообщение из трех строк на экран с пустыми строками до и после него:

echo off
echo.
echo Эта пакетная программа
echo форматирует и проверяет
echo новые диски
echo.

Если требуется отключить режим отображения команд и при этом не выводить на экран строку самой команды echo, введите символ @ перед командой:

@echo off

Оператор if и команду echo можно использовать в одной командной строке: Например:

if exist *.rpt echo Отчет получен.

При выводе русских букв необходимо помнить о кодировке. Текст сообщения должен быть в DOS (866) кодировке. Многие текстовые редакторы его поддерживают.
Если необходимо, что бы текст сообщений был в WIN (1251) кодировке и был виден из любого редактора, то можно использовать следующий прием. 

chcp 1251 >NUL
set x=Русский текст
chcp 866 >NUL
echo %x%
pause

Такие сообщения для удобства можно выделить в отдельный блок. 

chcp 1251 >NUL
set MSG01=Отсутствует исходный файл
set MSG02=Ошибка копирования
set MSG03=Успешное завершение программы
set TIT=Копирование файла
chcp 866 >NUL
Title %TIT%
….
echo %MSG01%
….
echo %MSG02%
….
echo %MSG03%

Если такой блок неудобно располагать в начале файла, то можно образовать из него процедуру, разместить в конце bat файла, а на исполнение вызвать эту процедуру командой call в начале bat файла. Из примера все должно стать понятнее)) 

….
call :blockmsg

Title %TIT%
….
echo %MSG01%
….
echo %MSG02%
….
echo %MSG03%
….
exit

:blockmsg
chcp 1251 >NUL
set MSG01=Отсутствует исходный файл
set MSG02=Ошибка копирования
set MSG03=Успешное завершение программы
set TIT=Копирование файла
chcp 866 >NUL
exit /b

Если сообщение одиночное, то можно извратиться поступить следующим образом: 

chcp 1251 >nul
for /f «delims=» %%A in («Отойдите на безопасное расстояние») do >nul chcp 866& echo.%%A

Понравилась статья? Поделить с друзьями:
  • Как вывести ошибку ajax
  • Как вывести ошибку 404 django
  • Как вывести ошибки php на экран
  • Как вывести калькулятор на ошибку
  • Как вызвать ошибку 404 на сайте