Информационные технологииStfw.Ru 🔍

Синтаксис BAT-файлов и командная строка в MS-DOS

BAT-файлы (файлы с расширением .bat, от английского batch - пакетные) - это обычные текстовые файлы с набором инструкций командному процессору command.com для автоматического выполнения всех содержащихся в таком файле команд.
🕛 15.01.2011, 01:35
С помощью пакетных файлов возможно создание довольно мощных средств для облегчения выполнения трудоемких операций, например, копирования, создания больших архивов, проверки каких-либо внешних условий и условная обработка данных. Особенно широкий простор здесь открывается для тех, кто знает хотя бы один язык программирования - используя и свои программы, можно создавать прямо-таки гигантские программные комплексы.
При описании команд использовались принятые в DOS обозначения:
* <параметр> - обязательный параметр. * [параметр] - необязательный параметер. * | - оператор "или".

Все команды и операторы языка являются регистронезависимыми, то есть, команды echo off, ECHO OFF и EcHo oFf являются абсолютно идентичными.

Перенаправление потоков ввода/вывода.


Перенаправление потоков в операционной системе позволяет, например, вывести результат работы программы не на экран, а в файл или на принтер, а также использовать результаты работы одной программы в другой.
Для перенаправления потоков используются специальные символы командной строки:
* > - Переназначает вывод. * < - Переназначает ввод. * >> - Добавляет переназначенный вывод к существующим данным. * | - Конвейер - вывод первой команды непосредственно на ввод другой.


Приведем пример. Команда
DIR>abc.txt
выведет результаты не на экран, а в файл abc.txt, предварительно создав или перезаписав его. В дальнейшем можно использовать его для более удобной обработки полученной информации (например, если список слишком большой).
DIR>>abc.txt
данная команда также запишет результат не на экран, а в файл abc.txt, но она не удалит его содержимое, а добавляет результат в конец файла. Если файл не существует, он будет создан.
DIR | MORE
Это пример использования результатов выполнения команды (piping) DIR фильтром MORE, который делает паузу после каждого экрана листинга. Еще один полезный пример:
ECHO Y | DEL *.*
Сама команда DEL *.* должна удалить все файлы в каталоге. Однако, она предусмотрительно запрашивает подтверждение на подобное действие. Для того, чтобы автоматически (например, из пакетного файла) удалять все файлы, мы используем передачу результатов выполнения команды ECHO Y, которая должна вывести символ Y, в команду DEL *.*, которой требуется один символ: Y или N. Похожее действие выполнит команда
program.exe <file.in
передаст программе program.exe данные из файла file.in таким образом, как будто они были введены с клавиатуры. Однако, нужно быть осторожным с таким способом передачи, так как программа может в какой-нибудь момент времени запросить совсем другой ввод. Также перенаправить вывод можно и в порт, например, в COM1, COM2, LPT и т.д.
Для перенаправления самой консоли используется файл ввода-вывода con. Например, чтобы набрать какой-нибудь текстовый файл, наберите:
copy con file.txt
и далее построчно набирайте текст файла. В конце нажмите . Файл готов. А если набрать
copy file.txt con
на экран выведется содержимое нашего файла.
Для уничтожения вывода программы используется файл ввода-вывода NULL (аналогично устройству /dev/null в Unix).

Основные команды и операторы пакетных файлов.


REM [текст]
Команда REM служит для ввода комментариев. Любой текст, расположенный в строке после нее, будет считаться комментарием и не выполняется. Это бывает полезно при отладке программы или временном "выключении" некоторых строк файла.
REM Эта строка не будет выполняться командным процессором.


ECHO [ON | OFF | Текст]
Команда ECHO используется для управления эхо-режимом, то есть режимом отображения на экране служебной информации. ECHO OFF запрещает этот вывод, а ECHO ON - разрешает. ECHO <Текст> используется для вывода текста на устройство (на экран, COM или LPT-порты). То есть, команда
ECHO Привет!
выведет на экран "Привет!". А команда
ECHO ATDP 21435 > COM2
пошлет на устройство на порте COM2 (например, на модем) команду ATDP 21435, то есть, набор номера 21435.


@<команда>
Оператор @. позволяет не выводить следующую за ним команду на экран. Это аналог оператора ECHO OFF только для одной строки. Часто используется следующим образом в начале многих пакетных файлов:
@ECHO OFF
Это позволяет не выводить и саму запрещающую строку ECHO OFF при выполнении пакетных файлов.


GOTO <метка>
Оператор GOTO осуществляет безусловный переход на метку внутри этого же файла. Метка обозначается следующим образом:
:label
то есть, со знаком двоеточия в начале. Для перехода к такой метке будет служить команда
GOTO label
в любом месте BAT-файла.


%<цифра 0-9>
Как и в любом языке, в языке пакетных файлов возможно использование переменных. Всего может быть 10 одновременно существующих независимых переменных. Для написания сложных программ это довольно мало, хотя для обычной работы часто хватает и 3-4. Значение переменной равно значению соответствующего параметра из командной строки. Переменная %0 будет содержать имя .bat-файла и, если вы указали, путь к нему. То есть, если вы запустили файл abc.bat со следующими параметрами:
abc.bat a bc def
то переменная %0 будет содержать значение abc.bat, %1 будет содержать значение a, %2 будет содержать bc, а %3 - def. Это свойство широко используется для создания универсальных пакетных файлов при работе с повторяющимися операциями.


SHIFT
Команда SHIFT позволяет использовать число параметров командной строки далее 10. Однако, при этом теряются соответственно более ранние параметры. Иными словами, команда SHIFT сдвигает все значения переменных на один влево. То есть, переменная %0 будет содержать значение, содержавшееся до этого в переменной %1, а переменная %1 - значение переменной %2 до сдвига. Однако, данная операция является необратимой, то есть, невозможно сдвинуть переменные обратно.


CALL <имя bat-файла>
Команда CALL позволяет вызвать один пакетный файл из другого, не прекращая выполнения предыдущего. Пример:
CALL ABC.BAT
То есть, при выполнении команды CALL выполнение текущего пакетного файла прекратится и управление будет передано пакетному файлу с именем ABC.BAT. При использовании команды CALL ABC.BAT, после завершения работы файла ABC.BAT управление будет возвращено на следующую после команды вызова строку.


IF <условие> <следствие>
Оператор IF проверяет истинность какого-либо <условия> и в зависимости от этого выполняет или не выполняет команду <следствие>. Возможны следующие условные конструкции:
IF EXIST ABC.BAT GOTO work
если существует файл ABC.BAT, то перейти на метку work.
IF NOT EXIST ABC.BAT GOTO exit
если не существует файл ABC.BAT, то перейти на метку exit.
IF %1==ASDF GOTO asdflabel
если переменная %1 равна ASDF, то - переход на метку asdflabel.
IF ERRORLEVEL 1 GOTO err1
если ошибка (возвращаемое значение) выполнения предыдущей команды равно 1, то перейти на метку err1.


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


FOR %<параметр> IN () DO <команда>
С помощью оператора FOR возможно выполнение одной и той же команды несколько раз для различных параметров. Рассмотрим следующий пример для большей ясности:
FOR %%P IN (file1 file2 file3) DO DEL %%P
Знак процента используется в операторе FOR удвоенным для обозначения пустой переменной в пакетном файле. Если оператор FOR используется из командной строки, знак процента должен быть одинарным.
В результате выполнения будут удалены файлы file1, file2 и file3. Можно записать и с использованием маски файлов:
FOR %%P IN (file?) DO DEL %%P
В результате будут удалены все файлы, подпадающие под данную маску. Если в последовательности VAR нет символов маски файла, эта последовательность может обозначать любые текстовые строки. Иначе - это должны быть имена файлов на диске. В строке цикла FOR нельзя использовать переадресацию и перенаправление потоков.


SET <Имяпеременной>=<Значениепеременной>
Оператор SET представляет собой расширение возможностей работы с параметрами в операционной системе. Он задает переменную, значение которой подставляется вместо ее имени при любом использовании этого имени между знаками процента. Так, если задано (переменная, которую требуют многие игры, использующие звуковую карту компьютера):
SET BLASTER=A220 I5 D1 P330
то при использовании в пакетном файле следующей конструкции:
ECHO %BLASTER%
на экран будет выведено "A220 I5 D1 P330". Переменные, определенные с помощью оператора SET называются переменными окружения среды (environment) и являются видимыми после выполнения до перезапуска DOS (если не изменять ее вручную в памяти). То есть, ее можно использовать из одного пакетного файла или программы после задания в другом. Наиболее известной является переменная PATH, представляющая собой набор путей для быстрого поиска файлов. Она задается в файле autoexec.bat.


PROMPT [текст][спецификатор]
Команда PROMPT хоть и не является командой пакетного файла, так как является командой операционной системы в целом, однако, заслуживает упоминания, ибо почти всегда присутствует в файле autoexec.bat.
Данная команда управляет видом приглашения командной строки. Обычно оно выглядит примерно следующим образом:
C:\DOS>
Этому соответствует спецификатор команды PROMPT, равный $P$G То есть, Диск:\Путь>. Это задается использованием знака доллара "$" и символа, означающего определенную последовательность.
Предусмотрены следующие варианты:
* $ - символ "знак доллара". * _ - перевод строки. * B - символ "|". * D - текущая дата. * E - символ #27 (Esc). * G - символ "больше". * H - "backspace"-символ. * L - символ "меньше". * N - текущий диск. * P - текущий каталог на текущем диске. * Q - символ "равно". * T - текущее время. * V - номер версии DOS.

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

Фильтры в командных файлах.


Вы можете перенаправлять потоки, используя фильтры.
Фильтры пропускают только часть получаемой информации, соответствующей запросу. В DOS самые используемые фильтры - это FIND, MORE и SORT.

FIND [/V] [/C] [/N] "строка" [[диск:][путь]имя_файла[ ...]]
Поиск текстовой строки в одном или нескольких файлах.
Параметры:
* /V - Вывод всех строк, НЕ содержащих заданную строку. * /C - Вывод только общего числа строк, содержащих заданную строку. * /N - Снабжение отображаемых строк номерами. * /I - Поиск без учета регистра символов. * "строка" - Искомая текстовая строка. * [диск:][путь]имя_файла - Файл либо файлы, в которых производится поиск.

Если путь не задан, FIND производит поиск в тексте, введенном с клавиатуры, либо переданном по конвейеру другой командой. Пример:
DIR A: | FIND /V "компьютер"
Выведет имена всех файлов, не содержащих слово "компьютер".
Вы можете использовать параметр /V вместе с /C ИЛИ /N, но /N не будет работать с /C.


MORE [диск:][путь]имя_файла MORE < [диск:][путь]имя_файла имя_команды | MORE [диск:][путь][имя_файла]
Последовательный вывод данных по частям размером в один экран. Параметры:
* [диск:][путь]имя_файла - Задает файлы, отображаемые по фрагментам. * имя_команды - Команда, вывод которой отображается на экране.


Пример:
DIR | MORE
Выведет список файлов постранично.
Для выхода из режима просмотра используйте сочетание клавиш , а для просмотра - любую клавишу.


SORT [/R] [/+n] [[диск1:][путь1]имя_файла1] [> [диск2:][путь2]имя_файла2] [команда |] SORT [/R] [/+n] [> [диск2:][путь2]имя_файла2]
Сортировка ввода с выводом результатов в файл, на экран или другое устройство.
Параметры:
* /R - Изменение порядка сортировки на обратный, от Z к A и затем от 9 до 0. * /+n - Сортировка файла по символам в столбце n. * [диск1:][путь1]имя_файла1 - Сортируемые файлы/ * [диск2:][путь2]имя_файла2 - Файл, в который направляется сортированный ввод. * команда - Команда, вывод которой следует отсортировать.


Пример:
SORT /R < BOOK1 > REV
Сортирует файл BOOK1 в обратном порядке и записывает результат в файл REV.
Буквы нижнего регистра соответствуют буквам верхнего (a=A, z=Z).

Использование возвращаемых значений.

Любая программа при завершении своей работы возвращает операционной системе код своего завершения. Принято при успешном завершении возвращать ноль, иначе - код ошибки. Иногда, или, вернее, часто, программа "сознательно" возвращает ненулевое значение для того, чтобы в пакетном файле можно было "узнать" некоторые подробности ее работы. Например, программа возвращает код нажатой клавиши, а .bat-файл по нему выполняет различные действия.
Каким же образом пакетный файл может узнать код завершения выполненной программы? Для этого предусмотрено ключевая переменная ERRORLEVEL.
Пример пакетного файла с errorlevel'ами:
@ECHO OFF
REM Запускаем программу prg1.exe
PRG1.EXE
REM Анализ кода завершения
IF ERRORLEVEL 2 GOTO FILENOTFOUND
IF ERRORLEVEL 1 GOTO WRITEERROR
IF ERRORLEVEL 0 GOTO EXITOK
GOTO ONEXIT
:FILENOTFOUND
ECHO Ошибка! Файл не найден!
GOTO ONEXIT
:WRITEERROR
ECHO Ошибка записи!
GOTO ONEXIT
:EXITOK
ECHO Программа завершена благополучно.
GOTO ONEXIT
:ONEXIT
Обратите внимание - анализ кода завершения начинается не с нуля, а с максимально возможного значения. Дело в том, что подобная проверка означает: "если errorlevel больше или равен значению, то...". То есть, если мы будем проверять, начиная с нуля, любое значение будет истинным на первой же строке, что неверно.
Это самая распространенная ошибка в подобного рода программах.


Основные команды разных версий DOS.

append(.exe) - Указание порядка поиска файлов данных в каталогах и вывод на экран установленных путей поиска.
assign(.com) - Переназначение диска.
attrib(.exe) - Изменение или вывод состояния флагов атрибутов файла.
backup(.com/.exe[5.0]) - Создание резервных копий.
break - Управление прерыванием программы.
chcp - Смена кодовой страницы.
cd (chdir) - Смена текущего каталога.
chkdsk(.com/.exe[5.0]) - Проверка диска и вывод информации о его состоянии.
cls - Очистка экрана.
command(.com) - Активизация второго командного процессора.
comp(.com/.exe[5.0]) - Сравнение содержимого двух файлов или комплектов файлов.
copy - Копирование файлов в другой каталог.
ctty - Смена консоли.
date - Изменение или отображение текущей даты.
del - Удаление файлов.
dir - Вывод на экран листинга каталога.
diskcomp(.com) - Сравнение содержимого двух дискет.
diskcopy(.com) - Копирование содержимого с одной дискеты на другую.
diskcomp - Сравнение содержимого двух дискет.
doskey(.com) - Расширение возможностей командной строки.
erase - Удаление файлов.
exe2bin(.com/.exe[5.0]) - Преобразование файлов .exe в файлы .bin или .com.
exit - Выход из вторичного командного процессора.
expand [5.0] - Развёртывание файлов DOS в процессе установки системы.
fastopen(.exe) - Ускоренное открытие файлов.
fc [4.0,5.0] - Сравнение содержимого двух файлов или комплектов файлов.
fdisk(.com[3.0]/.exe) - Разбиение жесткого диска на разделы.
find(.exe) - Поиск заданной символьной фразы.
format(.com) - Форматирование диска.
graftabl(.com) - Загрузка в память таблицы дополнительного набора символов для вывода на экран через цветной графический адаптер.
graphics(.com) - Обеспечение вывода на принтер содержимого экрана в графическом режиме.
join(.exe) - Объединение каталогов.
keyb(.com) - Изменение символов и назначения клавиш клавиатуры.
label(.com/.exe[5.0] - Создание, замена и удаление метки тома.
loadhigh / lh [5.0] - Загрузка расширений DOS в блоки старшей памяти.
mem(.exe [4.0,5.0]) - Вывод информации о распределении памяти между программами.
mirror(.com[5.0]) - Сохранение информации об удалённыхфайлах и разделах диска.
mkdir / md - Создание каталога.
mode(.com) - Изменение режимов работы периферийных устройств.
more(.com) - Вывод информации поэкранно.
nlsfunc(.exe) - Поддержка национальных форматов.
path - Вывод или установка путей поиска исполнимых файлов.
print(.com/.exe[5.0]) - Печать текста в фоновом режиме.
promt - Изменение приглашения командной строки.
recover(.com/.exe[5.0]) - Восстановление восстановимой информации с повреждённого диска.
ren (rename) - Переименование файлов или каталогов.
replace(.exe) - Замена одних файлов другими.
restore(.com/.exe[5.0]) - Восстановление файлов с резервных копий.
rd (rmdir) - Удаление каталогов.
select(.com) [3.x] - Выбор национальных форматов.
select(.com) [4.0] - Установка DOS.
set - Вывод, изменение и удаление переменных окружения.
setver(.exe[5.0]) - Объявление версии операционной системы.
share(.exe) - Проверка разделяемых файлов.
sort(.exe) - Сортирует входной поток данных.
subst(.exe) - Подстановка виртуального диска.
sys(.com) - Копирование файлов DOS.
time - Изменение текущего системного времени.
tree(.com) - Наглядно отображает структуру директории или диска.
type - Вывод содержимого текстового файла.
undelete(.exe [5.0]) - Восстановление удалённых файлов.
unformat(.com [5.0]) - Расформатирование случайно отформатированного диска.
ver - Вывод версии DOS.
verify - Проверка правильности записи файлов на диск.
vol - Выводит метку тома и серийный номер диска.
xcopy(.exe) - Копирование файлов и дерева каталогов.


Справочные команды

help - Список команд с кратким описанием.
help имя_команды - Описание и синтаксис команды.
команда /? - Описание и синтаксис команды.

DOS   Теги: Dos

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉