Cmd goto error

I have a batch file that's calling the same executable over and over with different parameters. How do I make it terminate immediately if one of the calls returns an error code of any level? Basi...

I have a batch file that’s calling the same executable over and over with different parameters. How do I make it terminate immediately if one of the calls returns an error code of any level?

Basically, I want the equivalent of MSBuild’s ContinueOnError=false.

Nakilon's user avatar

Nakilon

34.6k14 gold badges106 silver badges140 bronze badges

asked Apr 9, 2009 at 14:56

Josh Kodroff's user avatar

Josh KodroffJosh Kodroff

26.8k26 gold badges93 silver badges147 bronze badges

0

Check the errorlevel in an if statement, and then exit /b (exit the batch file only, not the entire cmd.exe process) for values other than 0.

same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%

If you want the value of the errorlevel to propagate outside of your batch file

if %errorlevel% neq 0 exit /b %errorlevel%

but if this is inside a for it gets a bit tricky. You’ll need something more like:

setlocal enabledelayedexpansion
for %%f in (C:Windows*) do (
    same-executable-over-and-over.exe /with different "parameters"
    if !errorlevel! neq 0 exit /b !errorlevel!
)

Edit: You have to check the error after each command. There’s no global «on error goto» type of construct in cmd.exe/command.com batch. I’ve also updated my code per CodeMonkey, although I’ve never encountered a negative errorlevel in any of my batch-hacking on XP or Vista.

Community's user avatar

answered Apr 9, 2009 at 15:03

system PAUSE's user avatar

system PAUSEsystem PAUSE

36.4k20 gold badges62 silver badges59 bronze badges

11

Add || goto :label to each line, and then define a :label.

For example, create this .cmd file:

@echo off

echo Starting very complicated batch file...
ping -invalid-arg || goto :error
echo OH noes, this shouldn't have succeeded.
goto :EOF

:error
echo Failed with error #%errorlevel%.
exit /b %errorlevel%

See also question about exiting batch file subroutine.

Community's user avatar

answered Jan 22, 2012 at 21:58

Fowl's user avatar

6

The shortest:

command || exit /b

If you need, you can set the exit code:

command || exit /b 666

And you can also log:

command || echo ERROR && exit /b

answered Feb 20, 2014 at 15:26

Benoit Blanchon's user avatar

Benoit BlanchonBenoit Blanchon

12.8k4 gold badges69 silver badges76 bronze badges

2

Here is a polyglot program for BASH and Windows CMD that runs a series of commands and quits out if any of them fail:

#!/bin/bash 2> nul

:; set -o errexit
:; function goto() { return $?; }

command 1 || goto :error

command 2 || goto :error

command 3 || goto :error

:; exit 0
exit /b 0

:error
exit /b %errorlevel%

I have used this type of thing in the past for a multiple platform continuous integration script.

answered Oct 18, 2017 at 14:55

Erik Aronesty's user avatar

Erik AronestyErik Aronesty

11.1k5 gold badges60 silver badges39 bronze badges

0

One minor update, you should change the checks for «if errorlevel 1» to the following…

IF %ERRORLEVEL% NEQ 0 

This is because on XP you can get negative numbers as errors. 0 = no problems, anything else is a problem.

And keep in mind the way that DOS handles the «IF ERRORLEVEL» tests. It will return true if the number you are checking for is that number or higher so if you are looking for specific error numbers you need to start with 255 and work down.

answered Apr 9, 2009 at 15:30

1

I prefer the OR form of command, as I find them the most readable (as
opposed to having an if after each command). However, the naive way of
doing this, command || exit /b %ERRORLEVEL% is wrong.

This is because batch expands variables when a line is first read, rather
than when they are being used. This means that if the command in the line
above fails, the batch file exits properly, but it exits with return code 0,
because that is what the value of %ERRORLEVEL% was at the start of the
line. Obviously, this is undesirable in our script, so we have to enable
delayed expansion, like so:

SETLOCAL EnableDelayedExpansion

command-1 || exit /b !ERRORLEVEL!
command-2 || exit /b !ERRORLEVEL!
command-3 || exit /b !ERRORLEVEL!
command-4 || exit /b !ERRORLEVEL!

This snippet will execute commands 1-4, and if any of them fails, it will
exit with the same exit code as the failing command did.

answered Aug 17, 2018 at 14:20

Xarn's user avatar

XarnXarn

3,4301 gold badge24 silver badges42 bronze badges

2

We cannot always depend on ERRORLEVEL, because many times external programs or batch scripts do not return exit codes.

In that case we can use generic checks for failures like this:

IF EXIST %outfile% (DEL /F %outfile%)
CALL some_script.bat -o %outfile%
IF NOT EXIST %outfile%  (ECHO ERROR & EXIT /b)

And if the program outputs something to console, we can check it also.

some_program.exe 2>&1 | FIND "error message here" && (ECHO ERROR & EXIT /b)
some_program.exe 2>&1 | FIND "Done processing." || (ECHO ERROR & EXIT /b)

answered Nov 26, 2014 at 6:06

Amr Ali's user avatar

Amr AliAmr Ali

2,6121 gold badge16 silver badges11 bronze badges

No matter how I tried, the errorlevel always stays 0 even when msbuild failed. So I built my workaround:

Build Project and save log to Build.log

SET Build_Opt=/flp:summary;logfile=Build.log;append=true

msbuild "myproj.csproj" /t:rebuild /p:Configuration=release /fl %Build_Opt%

search for «0 Error» string in build log, set the result to var

FOR /F "tokens=* USEBACKQ" %%F IN (`find /c /i "0 Error" Build.log`) DO (
    SET var=%%F
)
echo %var%

get the last character, which indicates how many lines contains the search string

set result=%var:~-1%

echo "%result%"

if string not found, then error > 0, build failed

if "%result%"=="0" ( echo "build failed" )

That solution was inspired by Mechaflash’s post at How to set commands output as a variable in a batch file

and https://ss64.com/nt/syntax-substring.html

answered Sep 5, 2017 at 15:13

E.Seven's user avatar

1

@echo off

set startbuild=%TIME%

C:WINDOWSMicrosoft.NETFrameworkv3.5msbuild.exe c:link.xml /flp1:logfile=c:linkerrors.log;errorsonly /flp2:logfile=c:linkwarnings.log;warningsonly || goto :error

copy c:app_offline.htm "\lawpccnweb01d$websitesOperationsLinkWebapp_offline.htm"

del \lawpccnweb01d$websitesOperationsLinkWebbin /Q

echo Start Copy: %TIME%

set copystart=%TIME%

xcopy C:link_PublishedWebsitesOperationsLink \lawpccnweb01d$websitesOperationsLinkWeb /s /y /d

del \lawpccnweb01d$websitesOperationsLinkWebapp_offline.htm

echo Started Build: %startbuild%
echo Started Copy: %copystart%
echo Finished Copy: %TIME%

c:linkwarnings.log

:error

c:linkerrors.log

PoweredByOrange's user avatar

answered Sep 5, 2013 at 23:27

Demican's user avatar

2

In Windows, using batch files to script common tasks has been around for decades. Even though other scripting languages like PowerShell now exist, batch files are still widely used. If you see the goto batch command in a batch file and have always wondered what it does, you’re in luck.

In this tutorial, you will learn how the goto batch command works in batch files with several examples, and where you may still find a use for this older command today!

Prerequisites

As the goto executable is a part of the cmd.exe suite of batch commands, any version of supported Windows will work.

Understanding a Simple goto Command

In a nutshell, the goto command is a way to control the flow of a batch file. Typically, when you execute a batch file, the script executes from top to bottom following each line. But sometimes, you need the script to start executing at a different place in the script. The goto command is perfect for this.

Let’s say you have a batch script with a couple of simple lines to send text to the screen like below.

@echo off
echo Run this line first
echo Run this line second
echo Run this line third

When you run it, as seen below, it sends the three messages to the screen.

Running a simple batch file
Running a simple batch file

Now, perhaps, you’d like to run the third line before the second line. You could cut and paste but for a real batch file, this might not be possible. Instead, you can redirect the batch file with the goto command. To do that, you’ll use the GOTO command combined with a label.

Below you can see three concepts:

  • The goto labels created by starting with a colon with code underneath called run_first.
  • Comments that start with :: to indicate the code is not executable.
  • An optional goto:eof command that tells the batch script to finish or jump to the end of the file (eof). Notice the colon vs. the space here. If you simply use GOTO eof, without the colon, the batch script looks for the label of :eof somewhere in the file and does not jump to the end and return!

When you run the below script, you’ll see that the batch script runs the code in the order that you have the GOTO commands. The goto command changes the flow of the batch script. The first echo command is never run as the batch script jumps to the specified goto command. From that point forward, the script executes line-by-line.

@echo off

:: Start comments. The goto commands reference the labels
GOTO run_first

:: Optional internal goto command that jumps to the end of the script immediately
GOTO:eof

echo This line will never be output

:run_first
echo Run this line first

:: Each label starts with a colon
echo Run this line second
echo Run this line third
Running a simple batch file
Running a simple batch file

Best Practices Using Labels

In the previous example, you defined labels with an underscore. There’s nothing wrong with this approach but there are many other ways to create these labels. There are several caveats to keep in mind, as not just any label will work.

What will work in a label:

  • Spaces
  • Periods
  • Hypens

What won’t work in a label:

  • Equal signs (=)
  • Semicolons (;)
  • Ending with anything other than a space, colon or CR/LF (carriage return / line-feed) or simply pressing Enter.

Adding various control characters will cause the batch script to run forever in a loop and require manual termination.

If you define a label and the goto command cannot find it, you will receive an error indicating “The system cannot find the batch label specified“.

If a label isn’t found searching forward from the GOTO statement to the end of the file, cmd.exe will restart the search at the beginning of the file.

:: Spaces are OK in labels
GOTO Label with spaces

:Label with spaces
	Echo This is from a label with spaces

:: Underscores, hyphens, and periods are all ok
GOTO Label_hyphenated-with.a.period

:Label_hyphenated-with.a.period
	Echo This label has an underscore, hyphen, and a period

:: Control characters such as semi-colons (;) or equal signs (=) cannot be used
:: GOTO Label=Equal
:: GOTO Label;Semicolon

:: If you specify a GOTO statement but do not have a corresponding label
:: you will see an error
GOTO Label_nonexisting

In fact, if you use either of the GOTO statements with the equal (=) or semicolons (;),

Demonstrating various label iterations
Demonstrating various label iterations

Using the if Command with the goto Command

Jumping to different points of a batch file is handy but in the previous example, it wasn’t practical. To add more practicality, what if you needed a batch script to run some commands only if a certain condition were true?

The goto command used in conjunction with the if command gives you control over exactly when that jump is made. For example, check out the below example. In this example, the batch file is using the call command to run a program. That program will always return an exit code that’s always represented in the internal ERRORLEVEL variable.

The batch file then checks to see if the ERRORLEVEL variable is not equal to 0. If so, it skips to the end of the script. Otherwise, it runs the echo command to tell you that an error has occurred and then skips to the end of the batch script.

@echo off
:: Executing a call command with a single space after will set the %ERRORLEVEL%
:: environmental variable to 1, but not exiting the overall script.
call 
if %ERRORLEVEL% NEQ 0 GOTO End
echo There was an error and the Error Level was set to a non-zero value
GOTO:eof

:: This will never run if there is an error
:End
echo End of the Script

When you run the above script, you’ll see that call returned a non-zero exit code and existed the echo command to tell you an error occurred.

Non-zero exit code
Non-zero exit code

Calling a Subroutine and Using the goto Command

Now that you have learned the basics of a goto statement, how about using the goto command with a subroutine? A subroutine is like a block of code or a function that you can call to execute. Similar to the goto command, there is a call command which also uses labels.

Unlike the goto command, the call command will run code after the label and then return execution to after the original call command when terminated.

In the below example, this batch file is running the subroutine called my_subroutine using the call command. Then, inside of that subroutine, the batch script runs the goto:eof command to jump to the end of the script.

@echo off
:: Use the SET command to get user input and assign that input to the %Text% variable
set /p Text="Enter Text: "

:: Call the subroutine with the label :my_subroutine and pass in the %text% variable
call :my_subroutine %Text%
:: Return here after the subroutine, echo some text, and then end the script
Echo End of the script
GOTO:eof

:: Run everything in the subroutine
:my_subroutine
:: Each variable passed in is sequentially assigned a variable number, i.e %Text% = %1
Echo User Text: %1
:: Jumps to end of the file, which automatically exits the subroutine
GOTO:eof
batch file is running the subroutine
batch file is running the subroutine

Special Cases, Bugs, and GOTO Statement Considerations!

As with any command, there are special cases, bugs, and important considerations to keep in mind while using the goto statement in your code.

Command Extensions and the :eof Special Label

You may have noticed that the previous examples used extensive use of the :eof label. cmd.exe has both internal and external commands. Although the goto command is built-in to cmd.exe, the special label :eof is known as a command extension.

Command extensions can actually be disabled, via the following methods:

  • Set the DWORD registry key HKCUSoftwareMicrosoftCommand ProcessorEnableExtensionsCommand to 0.
  • Use the option, cmd.exe /e:off to disable command extensions.
  • Within a batch script, run the command SETLOCAL DisableExtensions

Although the goto command will work in most contexts, the special label :eof will no longer take effect. You can get around this limitation by using a goto label at the very end of the batch script.

SETLOCAL DisableExtensions
Echo This will display
:: The following command will break the script as the :eof label does not exist
:: GOTO:eof
GOTO End
	Echo This will not display

:End
The left-hand script fails due to the :eof label, whereas the right-hand script properly goes to the end.
The left-hand script fails due to the :eof label, whereas the right-hand script properly goes to the end.

When you disable command extensions, other cmd.exe functionality also ceases to work such as the dynamic variables, %TIME%.

Using Command Groups and Goto Batch Commands in an if Statement

A command group is a series of commands grouped within a parenthesis. This allows an entire set of commands to be operated as one. If you include a goto statement within the command group and an if statement, the remaining conditionals are ignored, such as the below else statement, and the included code is executed.

:: Like before, a call statement without following spaces sets the %ERRORLEVEL% to 1
call
if %ERRORLEVEL% EQU 1 (
	GOTO :subsection
	:subsection
		ECHO This will show since 1 = 1 for the if statement
) else (
	:: This will show even though it should not
	echo This should not show, but will because GOTO within a command group breaks the if statements
)
Demonstrating how a command group with a GOTO statement breaks an if statement
Demonstrating how a command group with a GOTO statement breaks an if statement

As you might imagine, this could have unintended consequences! If, for example, you included a delete command in the else statement that was not intended to run, this goto statement will break that logic.

Next Steps

Despite there being newer automation languages, such as PowerShell, batch files still find use in many different areas, such as package deployment. Understanding how to structure a script with goto statements and control the script flow becomes invaluable to crafting useful automations!

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.

Общие сведения о командном процессоре Windows.
Использование переменных в командных файлах.
Передача параметров командному файлу.
Переходы и метки.
Примеры командных файлов:
    — Своя команда для создания новых файлов.
    — Присвоение съемному диску одной и той же буквы.
    — Создание архива, имя которого содержит дату и время.
    — Выполнение только в заданный интервал времени.
    — Пример создания архива каталога пользователя.
    — Изменение даты и времени для файлов и папок.
    — Выполнение команд по расписанию.
    — Запуск и остановка служб Windows в командной строке.
    — Выдача на экран значения ERRORLEVEL.
    — Диалог с пользователем.
    — Задержки в командных файлах.
    — Определение доступности IP-адреса.
    — Определение текущей версии Windows.
    — Поиск в локальной сети компьютеров с запущенным приложением.
    — Поиск компьютеров с запущенным приложением по списку на основе сетевого окружения.
    — Выключение компьютеров по списку, созданному на основе сетевого окружения.
    — Поиск в локальной сети включенных компьютеров.
    — Работа с дисками, файлами и каталогами.
    — Работа с графическими приложениями из командной строки.
    — Перекодировка текстовых файлов .
Часто встречающиеся ошибки при написании командных файлов.
Использование .bat и .cmd в сценариях регистрации пользователей.

Общие сведения о командном процессоре Windows.

    Командные файлы (скрипты, сценарии, батники) — это обычные текстовые файлы с расширением .bat или .cmd, строки которых представляют собой специальные команды командного процессора (интерпретатора команд ) и/или имена исполняемых файлов. Командный процессор – это специальная программа, являющаяся обязательным элементом почти любой операционной системы, главным назначением которого, является предоставление пользователю средства для выполнения определенных программ без их компиляции и создания исполняемых файлов. Для операционных систем DOS и Windows9X в качестве интерпретатора команд использовался командный процессор command.com, для всех остальных ОС семейства Windows ( NT/2k/XP/Vista/7/8 и старше) — cmd.exe. Несмотря на непрерывное совершенствование средств создания и выполнения сценариев с использованием объектно-ориентированных языков, обычная командная строка и простые командные файлы, по-прежнему остаются основным инструментом для выполнения рутинных действий, диагностики сетевых проблем, автоматизации процессов резервного копирования и т.п. При всех недостатках реализации командного процессора в Windows, достойной альтернативы ему нет, и очевидно в ближайшем будущем, не будет.

    Строки командных файлов могут содержать специфические команды самого
процессора команд (FOR, ECHO, REM и т.п.) или имена исполняемых модулей
(net.exe, regedit.exe, sc.exe) Командный процессор может быть запущен в интерактивном режиме через Пуск — Выполнить — CMD.EXE. В данном режиме, вы увидите окно консоли с приглашением к вводу команд. Возможный список большинства консольных команд можно получить введя:

HELP

Справочную информацию по конкретной команде можно получить, указав ее название в качестве параметра команды HELP:

HELP Имя команды

Если вы работаете в русифицированной версии Windows, то учтите, что в среде командного процессора символы национального алфавита используются в DOS-кодировке. Для переключения между кодовыми страницами Windows и DOS используется команда

CHCP номер страницы

CHCP 866 — использовать кодовую страницу 866 (DOS)

CHCP 1251 — использовать кодовую страницу 1251 (WINDOWS)

Для просмотра и редактирования командных файлов, содержащих символы русского алфавита нужно использовать редактор с поддержкой DOS-кодировки. Если вы используете стандартное приложение «Блокнот» (notepad.exe), то для правильного
отображения символов русского алфавита нужно выбрать шрифт Terminal, с
помощью меню Правка — Шрифт…

Внешний вид окна CMD.EXE (консоли Windows) можно изменить с помощью команды

COLOR

В качестве аргументов для команды используются 2 шестнадцатеричные цифры, задающие цвет фона и цвет символа.

COLOR F0 — черные символы на белом фоне.

COLOR 0E — светло-желтые символы на черном фоне.

HELP COLOR — подсказка для команды COLOR.

Работа с командным процессором предполагает использование двух устройств — устройства ввода (клавиатуры) и устройства вывода (дисплей). Однако, имеется возможность изменить стандартно используемые устройства ввода-вывода с помощью специальных символов — символов перенаправления

> — перенаправление вывода

< — перенаправление ввода

Для вывода справки не на экран а, например, в файл с именем help.txt, можно использовать следующую команду:

HELP > help.txt

При выполнении данной команды, в текущем каталоге будет создан файл с именем help.txt, содержимым которого будет результат вывода команды HELP. Если файл help.txt существовал на момент выполнения команды, его содержимое будет перезаписано. Для того, чтобы дописать данные в конец существующего файла, используют удвоение символа перенаправления вывода — «>>»

Пример:

HELP GOTO > myhelp.txt — в файл myhelp.txt будет выдана справка по использованию команду GOTO

HELP COLOR >> myhelp.txt — в конец файла myhelp.txt будет дописана справка по использованию команды COLOR

Простейший пример перенаправления ввода:

cmd.exe < commands.txt
— командный процессор не будет ожидать ввода команд с клавиатуры, а считает их из файла commands.txt

   При запуске командного процессора можно указать конкретную команду в качестве аргумента командной строки:

cmd.exe /C HELP FOR — выполнить команду HELP FOR и завершиться (ключ /C)

cmd.exe /K HELP FOR — выполнить команду HELP FOR и перейти в режим ожидания дальнейшего ввода команд (ключ /K)

Подробную справку по использованию cmd.exe можно получить, введя в качестве аргумента ключ /?

cmd.exe /?

Кроме символов перенаправления ввода-вывода в командной строке могут
использоваться символы объединения команд — && и ||

cmd.exe /C «HELP IF > nul» && Echo HELP Executed || Echo HELP Not Executed
— выполнить команду HELP IF и при успешном результате выполнить
команду Echo HELP Executed, а при неуспешном — Echo HELP Not Executed.
Команды, объединяемые для
выполнения с помощью конструкции && , не нужно заключать в
двойные кавычки. Выполнение строки

cmd.exe /C «HELP IF > nul» && Echo HELP Executed || Echo HELP Not Executed

завершится сообщением HELP Executed, а выполнение

cmd.exe /C «HELP uIF > nul» && Echo HELP Executed || Echo HELP Not Executed

где неверно задан аргумент команды HELP ( uIF ), завершится сообщением
HELP Not Executed

Файлы с расширением .bat или .cmd в среде Windows стандартно открываются
командным процессором аналогично примеру, где список команд считывается не с
устройства ввода, а из текстового файла.

Использование переменных в командных файлах.

   Существует такое понятие, как переменные окружения
(environments)
— это переменные, значения которых характеризуют среду,
в которой выполняются команда или пакетный файл. Иногда их называют
переменными среды. Принимаемые значения этих переменных формируются при
загрузке, регистрации пользователя в системе, старте или завершении
некоторых приложений, и, кроме того, могут быть заданы с помощью специальной
команды SET

SET переменная=строка

переменная — имя переменной среды.

строка — строка символов, присваиваемая указанной
переменной.

Например, командная строка

SET myname=Vasya

создает переменную myname, принимающую значение Vasya.

Значение, присвоенное какой-либо переменной, доступно для обработки в
командных
файлах, при использовании ее имени, заключенного в знаки
процента — % . Например
команда выдачи текста на дисплей ECHO в виде:

ECHO date — выведет на экран слово «date»,
а команда

ECHO %date% выведет на экран значение
переменной date — текущую дату в формате операционной системы.

С помощью команды SET обычно задается и модифицируется путь поиска
исполняемых программ
— переменная окружения PATH.

SET PATH=C:Windows;C:windowssystem32

После выполнения данной команды, поиск исполняемых файлов будет выполняться в
каталоге C:Windows, и, если результат неуспешен, в
C:windowssystem32

Допустим Вам необходимо выполнить программу myedit.exe, размещенную в
каталоге C:NewProgs

Если в командной строке не задан полный путь, а только имя
исполняемого файла — myedit.exe

то сначала будет выполняться поиск файла myedit.exe в текущем каталоге, и если
он не будет найден — в каталогах, список которых задается значением переменной
PATH. Символ ; является разделителем элементов в списке путей поиска.
Если в приведенном примере, текущим каталогом не является
C:NewProgs, и в остальных каталогах, заданных значением переменной
PATH. нет исполняемого файла myedit.exe, то запуск приложения myedit.exe
завершится ошибкой. Однако, если есть необходимость его запуска без указания полного
пути и при любом значении текущего каталога, можно модифицировать значение
переменной PATH

Команда

SET PATH=C:NewProgs;%path%

изменит текущее значение PATH,
добавив каталог C:NewProgs в начало списка.

   Выполнение команды SET без параметров позволяет получить текущие
значения переменных окружения:

NUMBER_OF_PROCESSORS=1 — количество процессоров

OS=Windows_NT- тип ОС

Path=C:WINDOWSsystem32;C:WINDOWS;C:Program FilesFar — путь поиска исполняемых файлов.

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH — расширения для исполняемых файлов.

PROCESSOR_ARCHITECTURE=x86 — архитектура процессора.

PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD — идентификатор процессора.

PROCESSOR_LEVEL=6 — уровень (номер модели) процессора.

PROCESSOR_REVISION=0801 — версия процессора.

ProgramFiles=C:Program Files — путь к папке «Program Files»

PROMPT=$P$G — формат приглашения командной строки $P — путь для текущего каталога $G — знак «>».

SystemDrive=C: — буква системного диска.

SystemRoot=C:WINDOWS — каталог ОС Windows.

Значение некоторых переменных по команде SET не выдаются. В основном, это переменные, принимаемые значения которых динамически изменяются:

%CD% — Принимает значение строки текущего каталога.

%DATE% — Принимает значение текущей даты.

%TIME% — Принимает значение текущего времени.

%RANDOM% — Принимает значение случайного десятичного числа в диапазоне 1 -32767.

%ERRORLEVEL% — Принимает текущее значение кода завершения задачи ERRORLEVEL

%CMDEXTVERSION% — Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд.

%CMDCMDLINE% — Принимает значение строки, которая вызвала
командный процессор.

Для просмотра действующего значения какой-либо переменной обычно используется
команда:

ECHO %переменная%

ECHO %CD% — отобразить имя текущего каталога

ECHO %TIME% — отобразить текущее время

ECHO %ERRORLEVEL%
отобразить результат выполнения предыдущей команды.

Значения, принимаемые переменными окружения, могут быть расширены с помощью
специального признака — символа » ~ «, что получить частичное
значение (расширение переменной), или изменить его заменой какой-либо части.
Примеры использования расширений переменных рассмотрены ниже.


В состав дополнительных средств Windows 2000/XP, и в комплект дистрибутива Windows 7 входит специальная утилита для формирования пользовательских и системных переменных окружения SetX, позволяющая записывать имена и значения переменных в реестр . Ссылка «Список команд CMD Windows» в конце статьи.

Передача параметров командному файлу.

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

BAT-файл параметр1 параметр2 …
параметрN

В самом командном файле первый параметр будет доступен как переменная %1,
второй — %2 и т.п. Путь и имя самого командного файла доступно как переменная %0.
Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных при его запуске параметров командной строки. Для вывода
текста на экран используется команда ECHO текст ,
однако если «текст» заменить на %0, — то будет выдано имя командного файла, %1 — первый аргумент, заданный в строке запуска, %2 — второй и т.д.

Создаем, например, командный файл params.bat следующего содержания:


echo off
echo Это командный файл %0

echo Первый параметр=%1

echo Второй параметр=%2

echo Третий параметр = %3

и запускаем его на выполнение следующей командой:


params.bat FIRST second «two words»

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

В первой строке командного файла используется
команда «echo off» для того, чтобы обрабатываемые командным процессором
строки не выдавались на экран.

   Для проверки наличия каких-либо входных параметров, передаваемых
командному файлу, можно проверить, является ли значение переменной %1
пустым:


if «%1» EQU «» goto error

….

:error

Echo Должен быть задан хотя бы один входной параметр

exit

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

REM пробел текст

Строки, начинающиеся с REM пробел, командным процессором игнорируются.

rem ECHO OFF выключает режим вывода содержания строк командного
файла на экран

REM будет выводиться только результат их выполнения.

ECHO OFF

echo Первый параметр=%1

echo Второй параметр=%2

echo Третий параметр = %3

Если к имени команды первым символом добавляется @,
то независимо от режима ECHO (ON или OFF), вывод обрабатываемой строки не
выполняется. Попробуйте в данном примере «ECHO OFF» заменить на «@ECHO OFF» —
результат говорит сам за себя. Строка, которая выключает режим вывода,
не будет выдаваться на экран. Вывод эха на экран устанавливается по
команде ECHO ON и, обычно, используется в целях диагностики.


rem ECHO ON включает режим вывода содержания строк командного
файла на экран

REM будет сама командная строка и результат ее выполнения,

REM но строки, начинающиеся символом @ выводиться не будут
ECHO ON

@echo Первый параметр=%1

@echo Второй параметр=%2

@echo Третий параметр = %3

Переходы и метки.

    В командных файлах можно использовать команды условного перехода,
меняющие логику их работы в зависимости от выполнения определенных условий.
Для иллюстрации приемов использования условных переходов создадим командный
файл, целью которого будет присвоение заранее определенной буквы для
съемных носителей, в качестве которых будут использоваться флэш-диски.
Условия таковы — есть 2 флэш-диска, один из которых должен быть виден в
проводнике как диск X: а второй — как диск Y: независимо от того, в какой
порт USB они подключены и какие буквы присвоены им операционной системой.
Будем считать, что реальные диски могут быть подключены как F: или G:
Опознавание дисков будем выполнять по наличию файла с определенным именем
(лучше такой файл сделать скрытым в корневом каталоге и назвать его как-нибудь
необычно):

Flashd1.let — на первом диске

Flashd2.let — на втором

Таким образом, задача командного файла заключается в том, чтобы проверить
наличие на сменных дисках F: и G: файлов Flashd1.let
или Flashd2.let и, в зависимости от того, какой из них присутствует,
присвоить диску букву X: или Y:

Для поиска файла на диске воспользуемся командой IF EXIST:

IF EXIST имя_файла команда

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

SUBST X: C: — — создать виртуальный диск
X:, содержимым которого будет корневой каталог диска C:

    Для решения задачи, создаем командный файл, например setletter.bat, следующего содержания:


@ECHO OFF

IF EXIST G:flashd1.let SUBST X: G:

IF EXIST F:flashd1.let SUBST X: F:

IF EXIST G:flashd2.let SUBST Y: G:

IF EXIST F:flashd2.let SUBST Y: F:

    После выполнения этого командного файла у вас появятся диски X: и Y:

Однако, если такой файл выполнить повторно,
команда SUBST выдаст сообщение об ошибке — ведь диски X: и Y:
уже существуют.

Поэтому, желательно обойти выполнение SUBST, если виртуальные диски
X: и Y: уже созданы, или удалять их, используя SUBST с параметром -d
перед подключением. Попробуйте изменить командный файл setletter.bat с
использованием команды перехода GOTO,
осуществляющей передачу управления строке пакетного файла на указанную
метку.

GOTO метка

В качестве метки используется строка символов, начинающаяся
с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало
сообщений об ошибке:

@ECHO OFF

REM если не существует X: — то перейдем на метку SETX

IF NOT EXIST X: GOTO SETX

REM если существует X: — перейдем на проверку наличия Y:

GOTO TESTY

:SETX

IF EXIST G:flashd1.let SUBST X: G:

IF EXIST F:flashd1.let SUBST X: F:

:TESTY

REM если Y: существует — завершим командный файл.

IF EXIST Y: GOTO EXIT

IF EXIST G:flashd2.let SUBST Y: G:

IF EXIST F:flashd2.let SUBST Y: F:

REM выход из командного файла

:EXIT

Конечно, данный пример не может считаться образцом программирования, но
главная цель, в данном случае, это не написание оптимального командного
сценария, а пояснения принципов использования меток и переходов. Далее по
тексту, я старался, насколько это возможно, использовать именно такой
подход — главное не оптимальность кода командного файла, а его максимальная
простота для понимания.

При выполнении измененного таким образом командного файла, сообщение об
ошибке при выполнении SUBST исчезнет.

Одним из важнейших приемов при написании сложных командных файлов
является анализ успешности выполнения конкретной команды или программы.
Признаки ошибок при выполнении команд можно отслеживать, анализируя
специальную переменную ERRORLEVEL ,
значение которой формируется при выполнении большинства программ.
Обычно ERRORLEVEL равно нулю, если программа завершилась без ошибок и
единице — при возникновении ошибки. Могут быть и другие значения, если они
предусмотрены в выполняемой программе.

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


@ECHO OFF

ECHO Вызов 1.bat

CALL 1.bat

ECHO Возврат.

В этом же каталоге, создайте второй файл под именем 1.bat, содержащий
команду


PAUSE
, приостанавливающую выполнение командного файла до
нажатия любой клавиши.

@ECHO OFF

pause

При выполнении командного файла test.bat будет выдано на экран
сообщение

Вызов 1.bat

и управление получит командный файл 1.bat с одной единственной командой
pause. После начатия клавиши на клавиатуре управление будет возвращено
вызвавшему командному файлу
на строку «ECHO Возврат.» и на экран будет выдано

Возврат.

Если же в файле test.bat убрать CALL, оставив «1.bat», то возврат
выполняться не будет.

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


@ECHO OFF

ECHO Вызов 1.bat

CALL 1.bat

ECHO Получено из файла %MYFILE% значение MYNUMBER=%MYNUMBER%.


а в файле 1.bat на следующее


@ECHO OFF

SET MYFILE=»Very good 1.bat»

SET MYNUMBER=99

Кстати, используя передачу управления командному файлу, можно организовать
его зацикливание. Попробуйте добавить в конец файла test.bat строку:


CALL test.bat

Выйти из зацикливания командного файла можно по нажатию комбинации
CTRL-Break.

Возможно использование команды CALL для вызова процедуры внутри
командного файла.
В этом случае в качестве аргумента используется не имя внешнего файла, а
метка:


call :proc1

….

:proc1

….

exit

….

Примеры командных файлов.

   Использование утилит командной строки и командных файлов нередко позволяют
решить многие проблемы связанные с повседневной эксплуатацией компьютерной
техники. Большинство системных администраторов и грамотных пользователей
продолжают ими пользоваться, несмотря на то, что в Windows проявилось новое,
более мощное и современное средство управления системой — WMI
(Windows Management Instrumentation). Очевидно, не в последнюю очередь, это
обусловлено простотой реализации и, тем не менее, — достаточной
эффективностью использования командных файлов. Ниже приведены простые
примеры с комментариями, которые демонстрируют некоторые возможности и
способы применения .cmd и .bat

Своя команда для создания новых файлов.

   В составе операционной системы Windows нет специальной команды для создания нового файла, но без нее можно легко обойтись несколькими способами:

Копирование с клавиатуры в файл

COPY CON myfile.txt

При выполнении этой команды данные с клавиатуры (стандартное устройство CON — консоль) будут заноситься в файл myfile.txt. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод.

Перенаправление вывода

ECHO 1 > myfile.txt

При выполнении этой команды будет создан файл myfile.txt, содержащий символ «1»

Комбинация перенаправления ввода и перенаправления вывода:

COPY CON > myfile.txt < xyz

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

Еще проще использовать команду копирования из фиктивного устройства nul в файл. Использование устройства nul позволяет обойти стандартные операции ввода-вывода, которые для него реально не выполняются.

COPY NUL myfile.txt

   При работе в командной строке часто приходится создавать новые пустые
файлы, поэтому, стоит подготовить свой командный файл (например, с
именем nf.bat),

а имя нового создаваемого файла передавать ему в качестве параметра при
запуске.

Содержимое файла:

@echo off

REM Создание пустого файла, имя которого задано в строке запуска

if «%1» EQU «» goto error

copy nul %1

goto exit

:error

ECHO ОШИБКА: Необходимо задать имя нового файла !

:exit

    Для простоты использования, поместите этот командный файл в системный каталог
(например, в C:windowssystem32) или любой другой, существующий в путях
поиска, задаваемых значением переменной PATH). Теперь, в командной строке, находясь в любом каталоге можно одной командой создавать пустые файлы.

Командная строка:

nf.bat myfile.txt — создать файл с именем myfile.txt в текущем каталоге.

nf.bat C:myfile.txt — создать файл в корневом каталоге диска C:

nf.bat «%USERPROFILE%myfile.txt» — создать файл в каталоге профиля текущего пользователя.

Расширение командного файла (.bat) можно не набирать и команда еще больше упрощается:

nf myfile.txt

В тексте командного файла присутствует проверка, задано ли имя
создаваемого файла в командной строке (if «%1%» EQU «» goto error), и если не
задано — выводится сообщение об ошибке и командный файл завершает
свою работу.

В качестве тренировки, попробуйте добавить в этот командный файл проверку
на существование файла с именем, указанным в командной строке.

Присвоение съемному диску одной и той же буквы.

    Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен
всегда под одной и той же буквой, независимо от того, на каком компьютере он
используется
и как он подключен. Для ее решения воспользуемся уже упоминаемой выше
командой SUBST, но реализуем присвоение новой буквы диску с
использованием подстановочного значения переменной %0, создаваемой
системой при каждом запуске командного файла.

Выберем для съемного диска желаемую букву, например — X.

Некоторые из переменных окружения, в том числе и переменная %0
принимающая значение пути и имени выполняющегося командного файла, позволяют
при определенной модификации с использованием специального признака —
символа » ~ « получить ее частичное значение (расширение переменной).
Например, не полный путь
файла, а только его имя, или каталог расположения, или букву диска, с
которого он был запущен или еще около десятка различных элементов, связанных
с подстановочными значениями переменной %0.

Имя диска, с которого
был запущен командный файл доступно как переменная %~d0.

Теперь создаем командный файл следующего содержания:

@echo off

subst X: %~d0

что означает — создать виртуальный диск X:, которому сопоставлен
логический диск, являющийся частью пути данного командного файла.
Если такой файл записать на флэшку, и выбрать присваиваемую букву диска
поближе к концу алфавита (чтобы не оказалась занятой другим реальным дисковым
устройством) то после его запуска, в системе будет создаваться новый диск
всегда под одной и той же буквой.

Дополнительное представление о подстановочных значениях
переменной %0 можно получить из командного файла следующего
содержания:

@echo off

ECHO ОБРАБАТЫВАЕТСЯ ФАЙЛ — %0

ECHO Дата/время создания/изменения командного файла — %~t0

ECHO Путь командного файла — «%~f0»

ECHO Диск командного файла — %~d0

ECHO Каталог командного файла — «%~p0»

ECHO Имя командного файла — %~n0

ECHO Расширение командного файла — %~x0

ECHO Короткое имя и расширение — %~s0

ECHO Атрибуты командного файла — %~a0

ECHO Размер командного файла — %~z0

Создание архива, имя которого содержит дату и время.

    Решим следующую задачу — нужно создать архив файлов, находящихся в каталоге
C:Program FilesFAR. Имя архивного файла должно состоять из текущего времени
(часы.минуты.секунды — ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты
(день.месяц.год — ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR.
Формат запуска для создания архива:

RAR a -r < путь и имя архива > < Путь и имя архивируемых данных >

a — команда создания архива.

-r — ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).

Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего
воспользуемся следующими исходными данными:

  • В командных файлах можно получить доступ к текущей дате и текущему времени — переменные %DATE% и %TIME%
  • В командных файлах можно создавать временные переменные с помощью команды SET.
  • Значение временных переменных может быть сформировано на основе %DATE% и %TIME% путем пропуска и (или) замещения их частей с помощью специальной конструкции с использованием символа ~ и числового значения, определяющего группу символов из данных текущего значения переменной.

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

    Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок Windows 2000
    выглядит следующим образом:

    Пн 21.01.2005 — День недели(2 символа)-Пробел(1 символ)-дата(10 символов) — всего 13 символов.

    В Windows XP/Vista/7 день недели отсутствует, что несколько упрощает структуру даты.
    Для создания нового каталога в командной строке используется команда

    MD имя каталога .

    Имя каталога нужно получить из текущей даты.
    Создаем в памяти временную переменную VDATE и присваиваем ей значение
    переменной окружения DATE, без первых 3-х символов (Пн и пробел) — 20.01.2005:

    set VDATE=%date:~3%

    В версиях Windows, где в значении принимаемом переменной DATE, отсутствует
    день недели (3 символа — «Пн «), значение VDATE получится не тем, что
    требуется. Чтобы не анализировать признаки наличия данного кода, можно
    воспользоваться и другим вариантом — не пропустить первые 3 символа (~3) от
    начала строки переменной DATE, а взять 10 символов от конца строки, указав число 10 со знаком «минус» — будет тот же результат — 20.01.2010

    set VDATE=%date:~-10%

    Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE:

    MD C:%VDATE%

    После выполнения этой команды на диске C: будет создан каталог с именем 20.01.2005

    Можно обойтись без лишних операторов, связанных с формированием значения переменной VDATE, которую я использовал для упрощения понимания структуры создаваемого имени каталога:

    MD %DATE:~-10% — создать каталог, имя которого будет представлено в виде текущей даты ДД.ММ.ГГГГ

    Время, получаемое из переменной %TIME% выглядит так :

    14:30:59.93 — Часы, минуты, секунды, сотые доли секунды.

    Сотые доли — это в имени файла архива, пожалуй, лишнее. Создаем временную
    переменную VTIME и присваиваем ей текущее время без последних 3-х символов, т.е
    пропускаем 0 символов от начала и отсекаем 3 символа от конца. Количество пропущенных и отсекаемых символов разделяются запятой:

    set VTIME=%time:~0,-3%

    Теперь VTIME = 14:30:59, но знак двоеточия ( : ) в имени файла использовать нельзя, это специальный символ, использующийся в именах устройств (диск C:). Поэтому, его придется заменить его на любой другой символ, допустимый в имени файла, например, точку. Для замены символов используется знак » = «

    set VTIME=%VTIME::=.% — заменить в переменной VTIME символ двоеточия на символ точки.

    Переменная VTIME примет значение 14.30.59

    Запустим архиватор:

    rar.exe a -r C:%VDATE%%VTIME%.rar «C:Program filesfar*.*»

    Теперь можно создать командный файл с содержимым:

    set VDATE=%date:~-10%

    md c:%VDATE%

    set VTIME=%time:~0,-3%

    set VTIME=%VTIME::=.%

    rar.exe a -r C:%VDATE%%VTIME%.rar «C:Program filesfar*.*»

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

    http://ab57.ru/cmd.html

  • I have made a batch script template that I can program to select a given target, but I would like the script to also throw a custom error dialog if the target is not already present on the end-users machine.

    Here’s my current script:

    set targetfilepath=%TARGETPATH%
    %SYSTEMROOT%explorer.exe /select, "%TARGETFILEPATH%"
    

    Could I incorporate this into my script? If so, where should I place it?:

    IF NOT EXIST goto net send localhost "%MESSAGETXT%"
    

    fixer1234's user avatar

    fixer1234

    26.8k61 gold badges72 silver badges115 bronze badges

    asked Jul 4, 2017 at 4:29

    Mr. Mendelli's user avatar

    Mr. MendelliMr. Mendelli

    1,2272 gold badges22 silver badges40 bronze badges

    3

    I would also like to use a cleaner dialog for the error message. Can I incorporate such a method into the batch script?

    Yes, you can run msgbox with a batch script using wscript as in the example I provided below. Since you also indicated you wanted «to use a cleaner dialog for the error message» I used the top line to set a variable and start the batch script again but with the /MIN option to keep the batch window from being so noticeable. Simple remove the top line if you want to not use it.

    Batch Script

    Be sure to set the values for the variables SET TARGETPATH=, SET msgboxTitle=, and SET msgboxBody= for your needs accordingly.

    IF NOT DEFINED MINIMIZED SET MINIMIZED=1 && START "" /MIN "%~dpnx0" %* && EXIT
    
    SET TARGETPATH=C:UsersUserDesktopTest
    IF NOT EXIST "%TARGETPATH%" GOTO :ERROR
    %SYSTEMROOT%EXPLORER /SELECT, "%TARGETPATH%"
    GOTO :END
    
    :ERROR
    SET msgboxTitle=This is my Message Title
    SET msgboxBody=This is my Message Body
    SET tmpmsgbox=%temp%~tmpmsgbox.vbs
    IF EXIST "%tmpmsgbox%" DEL /F /Q "%tmpmsgbox%"
    ECHO msgbox "%msgboxBody%",0,"%msgboxTitle%">"%tmpmsgbox%"
    WSCRIPT "%tmpmsgbox%"
    
    :END
    

    Further Resources

    • Start
    • MsgBox
    • Wscript

    answered Jul 5, 2017 at 2:50

    Vomit IT - Chunky Mess Style's user avatar

    1

    set MESSAGETXT="Your Text Goes Here"
    set TARGETPATH="Your Path Goes Here"
    IF NOT EXIST "%TARGETPATH%" GOTO ERROR
    %SYSTEMROOT%explorer.exe /select, "%TARGETFILEPATH%"
    GOTO END
    :ERROR
    msg "Username" "%MESSAGETXT%"
    :END
    

    You almost had it. SS64 is your friend when it comes to batch programming. And general command line usage as well: Here is their site. I have no affiliation with them.

    EDIT:
    Wow, yeah I made some bad assumptions there and just added the code without testing/looking at it. Windows 7 doesn’t have net send anymore but uses msg instead. I’ve updated my answer and it works on my system. You can add a PAUSE command at the end if you want the command line to stay visible until you press a key to get rid of it.

    answered Jul 4, 2017 at 8:39

    Blerg's user avatar

    1

    Unfortunately, the script provided by @Blerg didn’t work *(for me). I ventured into Stack Overflow and found this thread and used it in tandem with @Blerg’s script. The script is now able to throw an error message using this script that I threw together:

    IF NOT EXIST "%TARGETPATH%" GOTO ERROR
    %SYSTEMROOT%explorer.exe /select, "%TARGETPATH%"
    GOTO END
    :ERROR
    START CMD /C "ECHO The target could not be located because it does not exist! && PAUSE"
    :END
    

    (All I had to do was replace the fifth line.)

    Even though this works, I would also like to use a cleaner dialog for the error message like this VBS script can make:

    x=msgbox("%WINDOWTEXT%" ,0, "%WINDOWTITLE%")
    

    Can I incorporate such a method into the batch script, or should I translate the batch script into a visual basic script?

    answered Jul 4, 2017 at 23:09

    Mr. Mendelli's user avatar

    Mr. MendelliMr. Mendelli

    1,2272 gold badges22 silver badges40 bronze badges

    0

    • Remove From My Forums
    • Question

    • Hi All

      I have created a .bat /.cmd file for Operating System deployment using .Wim image. My script file is fully functional and working just fine.
      I want to add some logic into the script file. For example if the 1st statement successfully executed process next command, if not display the «Error Message». If possible I can call a dirrent bath file linked to a .vbs file containg «Error Message».

      Please advise how to achive it. Thanks in advance.


      N.A.Malik

    Answers

    • Yes — you can do that.  There is not enough ionformation to process your question.

      A batch file can use if and ERRORLEVEL to decide whether or not to execute a statement.

      @echo off
      rem force an error
      dir xxx > nul: 2>nul:
      if %ERRORLEVEL% == 0 GOTO continue
      if %ERRORLEVEL% == 1 GOTO error
      
      :continue
          echo do something here
          goto exit
      
      :error
          echo do error stuff here.
      
      :exit
      

      jv

      Hi,

      Thank ýou for the help. I will check it get back in case of problems.

      if %ERRORLEVEL% == 0 GOTO continue
      if %ERRORLEVEL% == 1 GOTO error

      :continue
          echo do something here
          goto exit ——————————————> Here I want to run the next command instead of Exit, is it possible?

      :error
          echo do error stuff here.

      :exit


      N.A.Malik

      We are not going to incrementally write the file for you.  If you do not know how to write a simple batch file then you need to learn.  Please take some time to learn at least the basics of a batch file.

      If we respond to each incremental question this could take days to do.  You are required to manage your own scripts and to do the work to understand what is happenning.  If you do not know how to edit a simple batch file it is time for you to learn.

      Sorry but we are not in the scripts-for-free business.  This site and others like it are for serious technicians who need to use scripting in their work.  A basic understanding of scripting is required.

      Here is a basic tutorial for  batch files.  It will get you started.  There are many more on the web if you just search for them.

      http://www.chebucto.ns.ca/~ak621/DOS/BatBasic.html

      By the way — just the first page of teh tutorial will answer all of your questions about using a simple batch file.  Please read it carefully.


      jv

      • Proposed as answer by

        Wednesday, December 21, 2011 2:11 AM

      • Marked as answer by
        Richard MuellerMVP
        Thursday, December 22, 2011 1:54 AM

    Содержание

    1. Cmd check if error
    2. Syntax
    3. Parameters
    4. Remarks
    5. Examples
    6. Cmd check if error
    7. Синтаксис
    8. Параметры
    9. Комментарии
    10. Примеры
    11. IF – оператор условного выполнения команд в командных файлах Windows

    Cmd check if error

    Performs conditional processing in batch programs.

    Syntax

    If command extensions are enabled, use the following syntax:

    Parameters

    Parameter Description
    not Specifies that the command should be carried out only if the condition is false.
    errorlevel Specifies a true condition only if the previous program run by Cmd.exe returned an exit code equal to or greater than number.
    Specifies the command that should be carried out if the preceding condition is met.
    == Specifies a true condition only if string1 and string2 are the same. These values can be literal strings or batch variables (for example, %1 ). You do not need to enclose literal strings in quotation marks.
    exist Specifies a true condition if the specified file name exists.
    Specifies a three-letter comparison operator, including:

    • EQU — Equal to
    • NEQ — Not equal to
    • LSS — Less than
    • LEQ — Less than or equal to
    • GTR — Greater than
    • GEQ — Greater than or equal to
    /i Forces string comparisons to ignore case. You can use /i on the string1==string2 form of if. These comparisons are generic, in that if both string1 and string2 are comprised of numeric digits only, the strings are converted to numbers and a numeric comparison is performed.
    cmdextversion Specifies a true condition only if the internal version number associated with the command extensions feature of Cmd.exe is equal to or greater than the number specified. The first version is 1. It increases by increments of one when significant enhancements are added to the command extensions. The cmdextversion conditional is never true when command extensions are disabled (by default, command extensions are enabled).
    defined Specifies a true condition if variable is defined.
    Specifies a command-line command and any parameters to be passed to the command in an else clause.
    /? Displays help at the command prompt.

    If the condition specified in an if clause is true, the command that follows the condition is carried out. If the condition is false, the command in the if clause is ignored and the command executes any command that is specified in the else clause.

    When a program stops, it returns an exit code. To use exit codes as conditions, use the errorlevel parameter.

    If you use defined, the following three variables are added to the environment: %errorlevel%, %cmdcmdline%, and %cmdextversion%.

    %errorlevel%: Expands into a string representation of the current value of the ERRORLEVEL environment variable. This variable assumes that there isn’t already an existing environment variable with the name ERRORLEVEL. If there is, you’ll get that ERRORLEVEL value instead.

    %cmdcmdline%: Expands into the original command line that was passed to Cmd.exe prior to any processing by Cmd.exe. This assumes that there isn’t already an existing environment variable with the name CMDCMDLINE. If there is, you’ll get that CMDCMDLINE value instead.

    %cmdextversion%: Expands into the string representation of the current value of cmdextversion. This assumes that there isn’t already an existing environment variable with the name CMDEXTVERSION. If there is, you’ll get that CMDEXTVERSION value instead.

    You must use the else clause on the same line as the command after the if.

    Examples

    To display the message Cannot find data file if the file Product.dat cannot be found, type:

    To format a disk in drive A and display an error message if an error occurs during the formatting process, type the following lines in a batch file:

    To delete the file Product.dat from the current directory or display a message if Product.dat is not found, type the following lines in a batch file:

    These lines can be combined into a single line as follows:

    To echo the value of the ERRORLEVEL environment variable after running a batch file, type the following lines in the batch file:

    To go to the okay label if the value of the ERRORLEVEL environment variable is less than or equal to 1, type:

    Источник

    Cmd check if error

    Выполняет условную обработку в пакетных программах.

    Синтаксис

    Если расширения команд включены, используйте следующий синтаксис:

    Параметры

    Параметр Описание
    not Указывает, что команда должна выполняться, только если условие имеет значение false.
    ERRORLEVEL Задает истинное условие, только если предыдущая программа, выполненная Cmd.exe, вернула код выхода, который больше или равен Number.
    Указывает команду, которая должна быть выполнена при выполнении предыдущего условия.
    == Задает истинное условие, только если строка1 и строка2 совпадают. Эти значения могут быть строками литерала или пакетными переменными (например, %1 ). Литеральные строки не нужно заключать в кавычки.
    существующие Указывает истинное условие, если указанное имя файла существует.
    Задает оператор сравнения из трех букв, включая:

    • Равно — равно
    • Нек — не равно
    • ЛСС — меньше
    • LEQ -меньше или равно
    • ГТР — больше
    • Жек — больше или равно
    /i Принудительное сравнение строк не учитывает регистр. Параметр /i можно использовать в формате If. Эти сравнения являются универсальными, в том случае, если и строка1 , и строка2 состоят из цифр, строки преобразуются в числа и выполняется числовое сравнение.
    кмдекстверсион Задает истинное условие, только если внутренний номер версии, связанный с компонентом расширения команд Cmd.exe, равен или больше указанного числа. Первая версия — 1. Он увеличивается на единицу при добавлении значительных улучшений в расширения команд. Кмдекстверсион Conditional не имеет значения true, если расширения команд отключены (по умолчанию расширения команд включены).
    defined Указывает истинное условие, если переменная определена.
    Задает команду командной строки и все параметры, которые будут переданы команде в предложении else .
    /? Отображение справки в командной строке.

    Комментарии

    Если условие, указанное в предложении If , имеет значение true, выполняется команда, следующая за условием. Если условие имеет значение false, команда в предложении If игнорируется и команда выполняет любую команду, указанную в предложении else .

    Когда программа останавливается, она возвращает код выхода. Чтобы использовать коды выхода в качестве условий, используйте параметр ERRORLEVEL .

    При использовании определенногозначения в среду добавляются следующие три переменные: % ERRORLEVEL%, % кмдкмдлине%и % кмдекстверсион%.

    % ERRORLEVEL%: разворачивается в строковое представление текущего значения переменной среды ERRORLEVEL. Эта переменная предполагает, что отсутствует существующая переменная среды с именем ERRORLEVEL. Если это так, вместо него будет получено значение ERRORLEVEL.

    % кмдкмдлине%: разворачивается в исходную командную строку, которая была передана Cmd.exe до любой обработки Cmd.exe. Предполагается, что отсутствует существующая переменная среды с именем КМДКМДЛИНЕ. Если это так, вы получите вместо этого значение КМДКМДЛИНЕ.

    % кмдекстверсион%: разворачивается в строковое представление текущего значения кмдекстверсион. Предполагается, что отсутствует существующая переменная среды с именем КМДЕКСТВЕРСИОН. Если это так, вы получите вместо этого значение КМДЕКСТВЕРСИОН.

    Предложение else необходимо использовать в той же строке, что и команда после оператора If.

    Примеры

    Чтобы отобразить сообщение не удается найти файл данных если не удается найти файл Product. dat, введите:

    Чтобы отформатировать диск в диске а и вывести сообщение об ошибке при возникновении ошибки в процессе форматирования, введите в пакетный файл следующие строки:

    Чтобы удалить файл Product. dat из текущего каталога или отобразить сообщение, если Product. dat не найден, введите в пакетном файле следующие строки:

    Эти строки можно объединить в одну строку следующим образом:

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

    Чтобы вернуться к метке «хорошо», если значение переменной среды ERRORLEVEL меньше или равно 1, введите:

    Источник

    IF – оператор условного выполнения команд в командных файлах Windows

    Формат командной строки:

    IF [NOT] ERRORLEVEL число команда

    IF [NOT] строка1==строка2 команда

    IF [NOT] EXIST имя_файла команда

    NOT — Указывает, что Windows должна выполнить эту команду, только если условие является ложным.

    ERRORLEVEL число — Условие является истинным, если код возврата последней выполненной программы не меньше указанного числа.

    строка1==строка2 — Условие является истинным, если указанные строки совпадают.

    EXIST имя_файла — Условие является истинным, если файл с указанным именем существует.

    команда — Задает команду, выполняемую при истинности условия. За этой командой может следовать ключевое слово ELSE. В случае, если указанное условие ложно, будет выполнена команда, находящаяся после слова ELSE.

    Предложение ELSE должно располагаться в той же строке, что и команда, следующая за ключевым словом IF. Например:

    IF EXIST имя_файла. (
    del имя_файла.
    ) ELSE (
    echo имя_файла. missing.
    )

    Следующий пример содержит ОШИБКУ, поскольку команда del должна заканчиваться переходом на новую строку:

    IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. Missing

    Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна располагаться в той же строке, что и команда, следующая за IF:

    IF EXIST имя_файла. del имя_файла.
    ELSE echo имя_файла. missing
    Вот правильный пример, где все команды расположены в одной строке:

    IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. Missing

    Изменение команды IF при включении расширенной обработки команд:

    IF [/I] строка1 оператор_сравнения строка2 команда
    IF CMDEXTVERSION число команда
    IF DEFINED переменная команда

    где оператор_сравнения принимает следующие значения:

    EQU — равно
    NEQ — не равно
    LSS — меньше
    LEQ — меньше или равно
    GTR — больше
    GEQ — больше или равно,

    а ключ /I , если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется сравнение чисел.

    Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение сравнивается с внутренним номером версии текущей реализации расширенной обработки команд. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.

    Условие DEFINED применяется подобно условию EXIST , но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена.

    Строка %ERRORLEVEL% будет развернута в строковое представление текущего значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется переменная среды с именем ERRORLEVEL; в подобном случае подставляется значение этой переменной. Например, с помощью данной строки можно выполнить следующее:

    goto answer%ERRORLEVEL%
    :answer0
    echo Получен код возврата 0
    :answer1
    echo Получен код возврата 1

    Допускается и применение описанных выше операторов числового сравнения:

    IF %ERRORLEVEL% LEQ 1 goto okay

    Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную CMD.EXE до любой обработки, за исключением ситуации, когда уже определена переменная среды с именем CMDCMDLINE; в подобном случае подставляется значение этой переменной.

    Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется переменная среды с именем CMDEXTVERSION; в подобном случае подставляется значение этой переменной.

    Создание пустого файла, имя которого задается параметром командной строки.

    Если параметр командной строки не задан, то пользователю выдается сообщение об ошибке.


    @echo off
    REM Проверить наличие имени файла, задаваемого в качестве параметра %1
    REM Если параметр %1 пустой – переход на метку error
    if «%1» EQU «» goto error
    REM Если параметр задан, создаем пустой файл, копированием из устройства nul
    copy nul «%1»
    exit
    :error
    ECHO File name required ! Must be — %

    n0 filename.ext
    :exit

    Командный файл, выполняющий опрос командой ping сетевых адресов в заданном диапазоне ( 192.168.1.1 – 192.168.1.254 ). Команда ping формирует значение переменной ERRORLEVEL равное нулю, если верно заданы параметры командной строки. То есть, определить доступность пингуемого IP-адреса методом анализа кода возврата ping не получится, поскольку он будет нулевым, независимо от того, отвечает ли пингуемое устройство, или нет. Поэтому, для решения данной задачи необходимо определить характерный признак, который присутствует в выводимых результатах только в том случае, когда пингуемое устройство доступно. Таким признаком может быть наличие строки символов «TTL» в выводе команды ping. Для определения признака можно использовать команду find в цепочке с командой ping .

    Примеры вывода для отвечающего и не отвечающего узлов:

    Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64 — если устройство с данным IP-адресом доступно;
    Превышен интервал ожидания для запроса. — если устройство не отвечает;

    Команда find /I «TTL» возвращает код ERRORLEVEL равный 0 , если строка «TTL» присутствует в результате выполнения ping . Ключ /I имеет смысл использовать, чтобы результат не зависил от того, строчные или заглавные символы составляют строку «ttl».
    Результат работы командного файла записывается в текстовый файл iplist.txt

    @ECHO OFF
    REM Постоянная часть IP-адреса
    set IPTMP=192.168.1.
    REM Количество пингуемых узлов
    set N=254
    rem С какого адреса начать — начальное значение » хвоста » IP- адреса X.X.X.IPMIN
    set /A IPMIN=1
    ECHO %DATE% Опрос пингом %N% адресов начиная с %IPTMP%%IPMIN% >> iplist.txt
    rem M0 — метка для организации цикла
    :M0
    rem Переменная IPFULL — полное значение текущего IP-адреса
    set IPFULL=%IPTMP%%IPMIN%
    rem Если » хвост «больше N – перейти к завершению работы
    IF %IPMIN% GTR %N% GOTO ENDJOB
    ping -n 1 %IPFULL% | find /I «TTL»
    if %ERRORLEVEL%==0 Echo %IPFULL% >> iplist.txt
    rem Сформируем следующий IP-адрес
    set /A IPMIN=%IPMIN% + 1
    rem Перейдем на выполнение следующего шага
    GOTO M0
    rem Завершение работы
    :endjob
    exit

    Существуют некоторые особенности реализации командного интерпретатора CMD.EXE , которые необходимо учитывать при обработке значений переменных внутри циклов IF и FOR . Использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON , что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака ( ! ) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF . Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:

    После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки:

    FOR … (
    IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0

    )

    &nbsp &nbsp В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию — вместо оператора EQU — равно , указано EQL — равно

    Источник

    Понравилась статья? Поделить с друзьями:
  • Cmd exe что это ошибка
  • Cmd exe ошибка приложения 0xc0000142 windows 10
  • Cmd exe ошибка при запуске приложения 0xc0000142
  • Cloudflare ошибка 520
  • Cloudflare ошибка 503