Windows комментарии в bat файле


Windows

  • 25.01.2020
  • 60 563
  • 7
  • 185
  • 185
  • 0

Как добавить комментарии в bat-файл

  • Содержание статьи
    • Описание
    • Примеры
    • Комментарии к статье ( 7 шт )
    • Добавить комментарий

Описание

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

Примеры

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

goto start
--------------------------------------
Этот пакетный файл предназначен
для автоматизации рутинных операций,
выполняемых ночью для синхронизации
содержимого корпоративного ftp-сервера
с ftp-серверами филиалов
--------------------------------------
Пакетный файл написан 01/01/2004
Последнее исправление внесено 10/02/2004
--------------------------------------
И т.д.
:start

Такое написание комментария при запуске пакетного файла передаст управление сразу к команде, следующей за меткой start. За это отвечает оператор перехода goto.
Более простые комментарии (из одной или нескольких строк) можно добавить, начиная строки с команды rem или с двух двоеточий, идущих друг за другом.

rem Этот блок устанавливает соединение с удаленным сервером
rem А это вторая строка с комментарием
:: Этот блок проверяет дату изменения файлов
:: А это вторая строка с комментарием

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

A batch file (batch script) in Windows is a text file that typically has a .bat extension and includes one or more command prompt commands.

It is a good practice to comment a source code in a batch file by leaving the remarks that explain functionality of some lines or blocks of code.

Also any line or a block of code in a batch file can be disabled by turning it into a comment (comment out) and enabled back (uncomment).

This note shows how to comment batch files in Windows.

Cool Tip: Get the return code from the last command or application! Read more →

A batch file can be commented using either two colons :: or a REM command.

The main difference is that the lines commented out using the REM command will be displayed during execution of the batch file (can be avoided by setting @echo off) while the lines commented out using ::, won’t be printed.

Create a comment (remark) or comment a line of code in a batch file:

:: This is a comment that won't be printed
- or -
REM This is a comment that will be printed

Inline comment:

ECHO "Hello" & :: This command prints 'Hello'
- or -
ECHO "Hello" REM This command prints 'Hello'

A block of code (multiple lines) in a batch file can be commented out using GOTO:

GOTO comment
...skip this...
:comment

Cool Tip: How to respond “Yes” or “No” to prompts in Windows PowerShell & CMD automatically! Read more →

Was it useful? Share this post with the world!

Rob van der Woude's Scripting Pages

Regardless of the programming or scripting language used, it is always a good idea to insert comments in scripts, explaining what the next lines or block of code is trying to accomplish, how and/or why.

Comments in batch files are usually placed in lines starting with REM (REMarks).

If you have many lines REMed out, this may slow down COMMAND.COM’s processing of the batch file.

As you probably know, COMMAND.COM reads a batch file, executes one command line, reads the batch file again, executes the next command line, etcetera.
This means each comment line causes one extra reread of the batch file; no problem when read from harddisk, but it may slow down batch file execution from slow floppy or network drives.

A workaround I have seen many times (back in the old days, when I was young, and dinosaurs roamed the Earth and harddisks were 20MB) is to convert the comment line to a label by starting the line with a colon ( : ).
COMMAND.COM skips labels it doesn’t have to jump to.

This method has the disadvantage that your batch file may «accidently» really use the label to jump to.

As Marc Stern points out in one of his MS-DOS batch files Tips & Tricks, this can be solved by using a double colon ( :: ) as the first characters of the comment line.
That way, the label is invalid but still treated as a label, and skipped (i.e. the next line is read immediately by COMMAND.COM, without the need to reopen the batch file). This may speed up reading large blocks of comment lines from slow (floppy) drives.

This same trick works in CMD.EXE (the command processor in Windows NT 4 and later) as well (not sure about OS/2 though)…

…but with some restrictions!

REM is a true command that may be used anywhere within a command line.
Though I doubt there is much use for a command like:

IF EXIST C:\AUTOEXEC.BAT REM AUTOEXEC.BAT exists

it is valid and won’t generate an error message in any DOS or Windows version.

Labels, on the other hand, whether valid or not, should always start at the first non-whitespace character in a command line.

REM Comment line 1
	REM Comment line 2
:Label1
	:Label2
:: Comment line 3
	:: Comment line 4
IF EXIST C:\AUTOEXEC.BAT REM AUTOEXEC.BAT exists

are all allowed.
However,

IF EXIST C:\AUTOEXEC.BAT :: AUTOEXEC.BAT exists

will result in a Syntax error message.

A true pitfall are code blocks, several commands grouped between parentheses and interpreted as a single command line by CMD.EXE!

IF EXIST C:\AUTOEXEC.BAT (
	:: Comment line 1
	ECHO Do something
	:: Comment line 2
)

will result in an error message stating:

) was unexpected at this time.

and:

IF EXIST C:\AUTOEXEC.BAT (
	:: Comment line 1
	ECHO Do something
	:: Comment line 2
	:: Comment line 3
)

will result in another error message:

Do something
The system cannot find the drive specified.

The same is true for FOR loops.
Try and see for yourself:

FOR %%A IN (1 2 3) DO (
	:: Comment line 1
	ECHO Do something
	:: Comment line 2
)

and:

FOR %%A IN (1 2 3) DO (
	:: Comment line 1
	ECHO Do something
	:: Comment line 2
	:: Comment line 3
)

will also result in error messages.

The errors are caused by labels being used within code blocks.

What may come as a surprise is that the following code does work flawlessly:

FOR %%A IN (1 2 3) DO (
	:: Comment line 1
	ECHO Do something
	:: Comment line 2
	ECHO Do something
)

It turns out that a single :: comment line, immediately followed by a non-blank command line, will work even inside code blocks!

Source: a discussion on comment styles on StackOverflow.com

Replace the double colons by REM statements and these samples will all run without a glitch.
Better still, don’t use comments within code blocks at all, but place them just before the code blocks instead:

:: Comment line 1
:: Comment line 2
:: Comment line 3
FOR %%A IN (1 2 3) DO (
	ECHO Do something
)

or:

REM Comment line 1
REM Comment line 2
REM Comment line 3
FOR %%A IN (1 2 3) DO (
	ECHO Do something
)

A Mystery:

(
	REM comment1
	ECHO comment1
)

(REM comment2 & ECHO comment2)

REM comment3 & ECHO comment3

ECHO comment4

The code above use 3 code blocks, each with a REM command followed by an ECHO command.
The 3 code blocks are followed by a fourth «stand-alone» ECHO command.
The 3 code blocks are supposed to behave more or less identically, at least in older versions like Windows NT 4 and 2000…

Well, in Windows 7 they don’t!

D:\>test_REM_comments_in_code_blocks.bat

D:\>(
REM comment1
 ECHO comment1
)
comment1
D:\>
D:\>

comment1 is the only comment ECHOed.
The code block for comment2 only displays an empty line.
The code block for comment3 is never reached…

It would seem the code block for comment2 aborts the batch file without warning.
Remove that code block, and the rest will be executed as expected.

So, can you explain this behaviour…?

The answer can be found at the end of this page.

More information on the subject:

  • Michael Klement’s summary of a discussion on comment styles on StackOverflow.com
    You will find even more comment styles here (like %= inline comments =%), each with its own list of pros and cons
  • A discussion about double colons vs. REM
  • Batch comments

(Thanks for Lee Wilbur and Michael Klement)

A possible pitfall, pointed out by Joost Kop, is a REM to comment out a line that uses redirection, as in:

REM DIR > logfile.log

In CMD.EXE (Windows NT 4 and later) the line is completely ignored (as was probably intended), but COMMAND.COM (MS-DOS, Windows 9x) interprets this line as «redirect the output of REM to logfile.log», thus emptying the file logfile.log or creating a 0 bytes file logfile.log.

Note: I would like to mention one situation where I always prefer REM over double colons: batch files for silent installations.
Why?
I always leave out the @ECHO OFF since silent installations will usually run in the background.
When testing, however, I will run the batch files interactively, and then the REMed comments will be displayed (remember, no @ECHO OFF) because they are commands, not labels.

Summarizing:

  • REM is the standards-compliant, documented statement to insert comments in batch files
  • double colons are a non-documented and non-compliant way to insert comments; there is no guarantee they will still work in future Windows versions
  • in theory, using double colons may speed up execution of batch files when run from a slow disk drive (e.g. floppy disk), but I doubt the difference can be detected on modern computers
  • for large blocks of comment, a GOTO command just before the comments, jumping to a label just after the comments, is a safer and more standards-compliant way to speed up batch execution from slow drives
  • since double colons are actually labels, they should be placed at the start of a command line; though leading whitespace is allowed, nothing else is
  • using double colons inside code blocks violates the previous «rule» and will usually result in errors (except some special cases)
  • try to avoid comments inside code blocks, or use REM if you have to (but be aware of pitfalls if you do use REM)
  • with COMMAND.COM be careful when using either REM or double colons to temporarily «disable» a command line, especially when it contains piping, redirection or variables
  • despite all, there is nothing wrong with using double colons for comments as long as you understand the limitations
  • test, test, test and test your batch files, including comment lines, on all Windows versions they will be used for

Pipe REM to block Standard Input

A really useful trick is to use REM combined with piping, as in:

REM | CHOICE /C:AB /T:A,5 > NUL

The CHOICE command in itself would time out after 5 seconds (/T), except if someone presses a key not specified by /C, in which case the count down would be aborted.
By using REM and piping its (always empty) standard output to CHOICE’s standard input, this standard input will not receive keypresses from the console (keyboard) anymore.
So pressing a button neither speeds up CHOICE nor stops it.
(I borrowed this technique from «Outsider», one of the alt.msdos.batch newsgroup’s «regulars», and added the /C parameter to make it language independent)

Note: This trick will work in COMMAND.COM only, not in CMD.EXE.
In CMD.EXE everything after the REM «command» is considered comment, including the pipe symbol.
For CMD.EXE, the following command could be used (Windows XP and later):

TYPE NUL | CHOICE /C:AB /T:A,5 > NUL

Read my wait page to find out how to set delays in Windows NT 4 and later.

Several languages allow complete code blocks to be commented out by using /* and */ «tags».
Rexx, for example, will treat the whole text marked red as comment:

Say "This line is true code"

/*
But this line is comment.
And so is this line.
And this one...
*/

The batch language doesn’t have comment blocks, though there are ways to accomplish the effect:

@ECHO OFF
REM Do something
  •
  •
REM End of code

REM Start of comment block 1
GOTO EndComment1
This line is comment.
And so is this line.
And this one...
:EndComment1

Or, if the comment block appears at the end of the batch file:

@ECHO OFF
REM Do something
  •
  •
REM End of code; use GOTO:EOF instead of EXIT for Windows NT and later
EXIT

Start of comment block at end of batch file
This line is comment.
And so is this line.
And this one...
@ECHO OFF
REM Do something
  •
  •
REM End of code

(Start of comment block at end of batch file
This line is comment.
And so is this line.
And this one...
Just make sure you never use a closing parenthesis.
Note: This trick does have one major disadvantage: the use of parentheses in the comment block is not allowed.

Mystery Solved

Recently, Vasco Rato showed me the solution to the mysteriously disappearing code.

If you read Leo Gutierrez Ramirez’ trick of the missing closing parenthesis, you’ll see that that is exactly what happens.
The following line of code:

(REM comment2 & ECHO comment2)

is equivalent to

(REM whatever

since everything following the REM statement, including the closing parenthesis, is comment, i.e. not interpreted!

Since there were no other parentheses in the «mystery code block» after this comment, everything from the opening parenthesis before the REM statement up to the end of the code is then a «Leo Gutierrez Ramirez style» comment block.

As Vasco states: everything behaves as one would expect it to.

Thanks Vasco and Leo


page last modified: 2019-03-12

Commenting a line

For commenting line use REM or :: though :: might fail inside brackets

within delayed expansion lines starting with !<delimiter> will be ignored so this can be used for comments:

@echo off

setlocal enableDelayedExpansion

echo delayed expansion activated
!;delayed expansion commented line
echo end of the demonstration

Comment at the end of line

For comments at the end of line you can again use rem and :: combined with &:

echo --- &:: comment (should not be the last line in the script)
echo --- &rem comment

Commenting at the end of file

As noting will be parsed after the exit command you can use it to put comments at the end of the file:

@echo off

echo commands

exit /b 

-------------------
commnts at the end 
of the file
------------------

Inline comments

Expansion of not existing variables is replaced with nothing ,and as setting a variable with = rather hard you can use this for inline comments:

@echo off

echo long command %= this is a comment =% with an inline comment

Multiline comments

For multiline comments GOTO (for outside brackets) and REM with conditional execution (for inside brackets) can be used. More details here:

@echo off

echo starting script

goto :end_comments
 comented line 
 one more commented line
:end_comments

echo continue with the script

(
    echo demonstration off
    rem/||(
      lines with
      comments
    )
    echo multiline comment inside
    echo brackets
)

And the same technique beautified with macros:

@echo off

::GOTO comment macro
set "[:=goto :]%%"
::brackets comment macros
set "[=rem/||(" & set "]=)"

::testing
echo not commented 1

%[:%
  multi 
  line
  comment outside of brackets
%:]%

echo not commented 2

%[:%
  second multi 
  line
  comment outside of brackets
%:]%

::GOTO macro cannot be used inside for
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %[%
        multi line
        comment
    %]%
    echo second not commented line of the %%a execution
)

  • Главная

  • Инструкции

  • Windows

  • Bat-файлы: создание, настройка и основные команды

BAT-файлы, или, как их еще называют опытные пользователи, «батники» — это текстовые файлы с расширениями .bat или .cmd, которые хранят набор команд и выполняют их в терминале операционной системы. Такие файлы необходимы для автоматизации стандартной работы пользователей в Windows.

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

В данном разделе статьи поговорим о взаимодействии с bat-файлами. Для начала пройдемся по требованиям, которых будет достаточно для написания своего первого «батника»:

  1. Устройство с операционной системой Windows.
  2. Наличие блокнота, либо другого текстового редактора. Рекомендуем использовать редакторы с встроенной подсветкой синтаксиса — например, Notepad++.

Создание bat-файла

Перейдем к созданию bat-файла. Для этого откроем любой текстовый редактор и заполним его некоторым содержимым. В качестве примера, создадим bat-файл, который будет выводить в окне интерпретатора командной строки сообщение «Hello, user!»:

@echo off
echo Hello, user!
pause

Теперь необходимо сохранить файл, используя расширение .bat. Для этого переходим в меню и выбираем «Сохранить как…», как показано на картинке ниже.

Image13

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

Image6

Пример выше подходит для пользователей, которые используют блокнот в качестве текстового редактора. Если пользователь использует Notepad++, то в типе файла выбираем «Batch file», как показано на рисунке ниже.

Image1

Если вдруг пользователь сохранил файл с неправильным расширением — ничего страшного. Это можно исправить, переименовав файл и указав правильное расширение. Чтобы это сделать, необходимо включить отображения расширений во вкладке проводника «Вид».

Image5

Запуск bat-файла

Чтобы запустить bat-файл, достаточно кликнуть по нему два раза левой кнопкой мыши. Стоит учитывать, что некоторые «батники» могут содержать команды, требующие прав администратора. Такие файлы сами не запрашивают расширенных прав, поэтому их нужно запускать исключительно от имени администратора, используя правую кнопку мыши.

Image3

Перечисленные выше методы запуска допустимы только в тех случаях, когда пользователь не ожидает ответа после запуска «батника». Если же запуск подразумевает какое-то системное сообщение или численный результат как ответ на выполнение команд, тогда необходимо выполнять запуск, используя интерпретатор командной строки.

Чтобы запустить интерпретатор командной строки, достаточно выполнить сочетание клавиш WIN+R, вписать в поле ввода cmd и нажать клавишу Enter. В результате откроется окно командной строки, в которое необходимо перенести нужный файл для его запуска и нажать клавишу Enter. 

Image2

После выполненных действий, «батник» начнет выполнение команд и отобразит необходимый результат, если это запланировано.

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

Image10

Как видно по картинке выше, сообщение успешно отобразилось.

Настройка периодического запуска

Полезная функция при работе с bat-файлами – это возможность запускать их с некоторой периодичностью. Для реализации понадобится встроенный в Windows сервис — «Планировщик заданий».

Откроем «Планировщик заданий». Для этого используем комбинацию клавиш WIN+R и вводим taskschd.msc в поле ввода, после чего нажимаем клавишу Enter. 

Image11

В открывшемся окне планировщика выбираем в правом меню «Действия» пункт «Создать простую задачу…». После этого откроется окно «Мастер создания простой задачи», в которой пользователю будет предложено заполнить 4 вкладки:

  • Создание простой задачи. Здесь будем указывать имя и описание задачи.
  • Триггер. Данная вкладка отвечает за выбор периода (как часто будет запускаться bat-файл и в какое время).
  • Действие. Здесь необходимо выбрать запуск программы и нажать «Далее». После этого пользователь указывает путь до необходимого «батника».
  • Завершение. В данной вкладке происходит проверка всех введенных данных.

Image15

По завершении заполнения всех вкладок bat-файл добавляется в расписание Windows и будет автоматически запускаться в указанный период.

Синтаксис написания bat-файла

Ниже будут представлен список основных правил, которые нужно знать при написании bat-файла:

  • Любая команда должна быть определена с новой строки.
  • Указанные в файле команды выполняются строго по порядку, от первого к последнему. Исключением являются те случаи, когда внутри файла организован переход от одной части к другой (например goto).
  • Чтобы исключить возможные ошибки, директории указываются в кавычках.
  • |Y| указывается перед командами, которые требуют подтверждения (Например del или format).
  • Возможно указывать два типа команд: встроенные и внешние. Первые — это команды самого интерпретатора командной строки (о них мы поговорим позже). Ко второму типу относятся все возможные исполняемые файлы (расширения .EXE, .CMD или .BAT).
  • Для отключения отображения командной строки в открывшемся окне интерпретатора, после запуска «батника», используется @echo off в начале файла.

Комментирование 

Оставлять комментарии во время написания bat-файла возможно тремя способами:

  1. rem. После ее объявления указывается необходимый комментарий.
rem текст_комментария
  1. Двойное двоеточие. Работает аналогично команде rem.
:: текст_комментария
  1. goto. К ней нужен особый подход, так как она используется не только для комментирования, но и для перехода к другой части bat-файла. После объявление команды указывается метка (в примере ниже — start). 
goto start
текст_комментария
:start

Для каждого комментария должна быть объявлена своя уникальная метка.

Основные команды

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

Команда

Аргумент

Описание

cd

Каталог

Переход к указанному каталогу (пустой аргумент — возвращение текущей директории).

pause

Приостановка пакетного файла.

start

Путь к файлу/команда

Выполнение указанной программы либо команды в отдельном окне.

md

Каталог

Создание каталога.

copy

Исходные файлы (путь к ним) и каталог/имя, куда копировать

Копирование одного или нескольких файлов в указанный каталог.

del

Имя файла или каталога

Удаление одного или нескольких файлов.

call

Путь до файла для запуска

Запуск пакетного файла из другого.

title

Имя заголовка

Изменение заголовка окна.

move

Исходный и конечный путь к файлу/файлам

Перемещение одного файла или группы файлов из одного каталога в другой.

color

Цвет фона и текста (задается цифрой либо буквой)

Изменение цветов текста и фона.

exit

Завершение работы пакетного файла.

Это не полный список. Чтобы ознакомиться со всеми командами, достаточно написать в строке интерпретатора командной строки help, как показано на картинке ниже.

Image9

Переменные

Кроме команд, стоит упомянуть о переменных, которые также можно использовать при написании bat-файла.

Для добавления переменной существует команда set. Чтобы объявить переменную, необходимо написать в строке set, а затем ее имя и значение. Если необходимо обратиться к переменной и считать ее значение, то к имени переменной слева и справа добавляется символ %. Приведем ниже пример:

@echo off
set example=Hello, user!
echo %example%
pause

Учитывайте, что пробелы перед знаком равенства и после не ставятся, иначе программа не будет работать. Результат запуска «батника» из примера выше продемонстрирован на картинке ниже.

Image14

Также, при объявлении переменной можно воспользоваться флагом /a, который отвечает за присваивание переменной числа. Например:

@echo off
set /a example=2*3
echo %example%
pause

При отсутствии такого флага, переменной присваивается вся строка после знака равенства. Результат представленной выше программы продемонстрирован на картинке: 

Image4

Кроме обычных переменных существуют переменные аргумента. Данным переменным присваиваются значения, которые передаются в момент вывоза bat-файла. Выглядят они следующим образом: %1, %2, %3 и т.д. 

Приведем пример для лучшего понимания:

@echo off
@echo First argument variables - : %1
@echo Second argument variables - : %2
@echo Third argument variables - : %3
pause

Во время запуска представленного выше «батника», передадим строку «Hello, user!». Результат будет продемонстрирован на картинке ниже.

Image12

Пример bat-файла: удаление ненужных файлов

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

Например, у пользователя во время работы появляется много файлов с расширением .txt в некотором каталоге и его подкаталогах, которые необходимо подчистить. Реализуем для этого случая простой «батник»:

@echo off
del /f /s /q C:\путь_к_каталогу\Example\*.txt

Разберем работу каждого флага:

  • /f — данный флаг позволяет удалять все возможные файлы (даже те, что открыты только для чтения).
  • /s — флаг позволяет удалять файлы не только из каталога, но и его подкаталогах.
  • /q — данный флаг убирает подтверждение удаления файлов.

Теперь создадим каталог Example и подкаталог ExampleWithTXT, а после добавим и в первый, и во второй файлы с расширением .txt, чтобы проверить работоспособность созданного выше «батника»:

mkdir Example
cd Example
mkdir ExampleWithTXT
notepad Example1.txt
notepad Example2.txt
notepad Example3.txt
cd ExampleWithTXT
copy C:\путь_к_каталогу\Example\*.txt

После выполнения всех команд будет создан тестовый каталог Example с тремя текстовыми файлами и подкаталогом ExampleWithTXT. В последний были скопированы три текстовых файла из родительского каталога.

Image8

Теперь запустим bat-файл и посмотрим на результат. Он будет представлен на картинке ниже.

Image7

Все файлы с расширением .txt были успешно удалены из каталога Example и подкаталога ExampleWithTXT.

Заключение

В инструкции был подробно описан процесс создания bat-файлов и дальнейшего взаимодействия с ними. Также были продемонстрированы основные команды и их описание. Следуя инструкции, пользователь сможет создать свой первый «батник» и успешно автоматизировать работу в операционной системе Windows.

  • Windows как читается на русском языке
  • Windows как узнать кто использует файл
  • Windows какая программа слушает порт
  • Windows как удалить файл через консоль
  • Windows какая программа занимает порт