5.9.4. Дополнительные команды для командных файлов
В этом пункте мы рассмотрим следующие команды,
которые используются главным образом только в командных файлах:
CALL — осуществляет вызов заданного
командного файла с последующим возвратом в точку вызова;
ECHO — производит включение
и отключение эхо-отображения строк командного файла, а также выдает текущий
статус и отображает заданный текст (сообщение);
FOR — организует цикл в
командном файле;
GOTO — обеспечивает безусловный
переход к строке командного файла с заданной меткой;
IF — осуществляет
разветвление в командном файле;
PAUSE — организует паузу при выполнении
командного файла;
REM — самодокументирует
командный файл;
SHIFT — изменяет соответствие
параметров аргументам командного файла.
Перечисленные команды увеличивают выразительность и
гибкость командных файлов.
Команда ECHO
Назначение: включение и отключение эхо-отображения строк командного файла при их
интерпретации, а также выдача текущего статуса и отображение заданного
сообщения.
Тип: внутренняя.
Синтаксис:
ECHO [ON
| OFF | сообщение]
Комментарии. Обычно команды командного файла выводятся на экран дисплея (вместе с
приглашением DOS) при их интерпретации КП. Если Вы хотите
отключить эхо-отображение для последующих команд, задайте OFF. Это позволит скрыть некоторую информацию, не искажать имеющееся на
экране изображение и не захламлять экран. Для включения эхо-отображения нужно
указать ON. Если аргумент вообще отсутствует, то на
экран (как стандартное устройство вывода) выдается текущий статус («ЕСНО is ON» или «ЕСНО is OFF»).
Когда в качестве аргумента задано сообщение, то оно без
каких-либо изменений отображается на экране дисплея для информирования
пользователя. Сообщение представляется любой последовательностью символов,
содержащей, по крайней мере, один отличный от пробела символ. Сообщением считаются
все символы в строке, за исключением единственного пробела после имени команды ECHO. Однако символы >, < и | в сообщении недопустимы.
Замечания:
— простота команды ECHO обманчива;
— эта команда является чуть ли не единственным
средством DOS, обеспечивающим вывод информации из
командных файлов;
— для исключения дублирования сообщений перед
командами вида ECHO сообщение обычно размещают
команду ECHO OFF (@ЕСНО OFF) или вместо них используют команды @ЕСНО сообщение;
— при отладке командного файла отключать
эхо-отображение не следует,
— для отображения сообщения, состоящего из
нескольких строк, следует поместить в командный файл несколько команд ECHO;
— для вывода на экран пустой строки с целью
разграничения фрагментов текста нужно использовать команду в виде ECHO: или с сообщением из неотображаемого символа;
— перенаправление ввода-вывода в команде ECHO существенно расширяет ее возможности, обеспечивая посылку
последовательностей символов на устройства (в частности, для управления ими) и
в файлы (что является наиболее быстрым способом создания простейших текстовых
файлов);
— включать эхо-отображение в конце командного файла
нет необходимости, так как DOS делает это
автоматически;
— команду ECHO можно использовать
не только в командных файлах, но и вводить с клавиатуры, однако форма ECHO OFF в последнем случае
действовать не будет.
Примеры:
■ ©ECHO OFF
ECHO:
ECHO Этот командный
файл
ECHO форматирует и проверяет
ECHO новый диск
ECHO:
ECHO ON — выдать на
экран дисплея сообщение «Этот командный файл форматирует и проверяет новый диск» на пяти строках;
■ ECHO ◄ Ctrl-O► >PRN — установить IBM-совместимый принтер в режим печати сжатым
шрифтом;
■ ECHO ◄ Ctrl-L► >PRN — осуществить
прогон бумаги на принтере до начала следующей страницы;
■ ECHO NC >>C:\AUTOEXEC.BAT - добавить в конец
файла AUTOEXEC.BAT строку, содержащую NC.
Последние три команды могут быть использованы как в
командном файле, так ив ответ на
приглашение DOS.
Команда PAUSE
Назначение: организация паузы
при выполнении командного файла.
Тип: внутренняя.
Синтаксис:
PAUSE [сообщение]
Комментарии. Эта команда
используется для приостановки интерпретации командного файла перед выполнением критических
{опасных) операций или для выполнения пользователем определенных действий
(например, установки дискеты). По команде PAUSE обработка командного файла временно прекращается и на экран выдается
сообщение
Strike a key when ready...
(Затем нажмите любую
клавишу)
Если пользователь в ответ на него нажмет комбинацию,
клавиш Ctrl-Break, то появится
сообщение
Terminate batch job (Y/N)?
(Завершить
пакетное задание (Y—fla/N—нет)?)
При нажатии клавиши N выполнение командного файла
будет продолжено, a Y — прекращено. Любой
другой ответ приведет к повторению запроса.
Если пользователь в ответ на сообщение «Strike a key when ready...» нажмет любую клавишу пишущей машинки (обычно Space), то интерпретация командного файла будет продолжена без каких-либо
дополнительных сообщений.
Текст «Strike a key when ready...» используется в
качестве дополнения к информационному сообщению, которое выдано на экран
раньше, в частности, при эхо - отображении команды PAUSE с заданным аргументом, а именно, сообщением. Аргументом может быть
произвольная последовательность символов (текст), за исключением символов
<, > и |.
Замечания:
— аргумент сообщение командой PAUSE в отличие от команды ECHO на стандартное устройство вывода не выдается. Поэтому если
эхо-отображение отключено (командой ECHO OFF или символом @), то на экране появится только сообщение «Strike a key when ready...». В этом случае для предварительной выдачи информационного
сообщения следует использовать команду ECHO;
— команду PAUSE можно вводить с
клавиатуры, но полезность этого усмотреть трудно;
— а некоторых версиях-DOS вместо «Strike a key when ready...» используется сообщение «Press a key when ready...»
или «Press any key to continue...».
Примеры:
■ выполнение команды
PAUSE Установите дискету в привод В:
приведет к отображению сообщений
С: > PAUSE Установите дискету в привод В:
Strike a key when ready...
■ выполнение команд
@ЕСНО OFF
ECHO Установите дискету в привод В:
PAUSE
ECHO ON
обеспечит выдачу сообщений
Установите дискету в привод В:
Strike a key when ready...
■ интерпретация последовательности команд
@ЕСНО OFF
ECHO Установите дискету в привод В:
ECHO и нажмите любую клавишу для продолжения
PAUSE > NUL
ECHO ON
приведет к появлению сообщений
Установите дискету в привод В:
и нажмите любую клавишу для продолжения
Команда REM
Назначение: самодокументирование командного файла.
Тип: внутренняя.
Синтаксис:
REM [комментарий]
Комментарии. Команда REM не приводит к выполнению каких-либо действий,
но позволяет включать в тело командного файла текстовую информацию для его
документирования (посредством аргумента комментарий, в качестве которого
можно использовать любую последовательность символов без каких-либо
исключений). Если комментарий состоит только из пробелов или вообще отсутствует, то это равносильно
размещению в файле пустой строки для наглядности.
Замечания:
— команды REM обычно помещают во
фрагменты командного файла с отключенным эхо-отображением (или используют
символ @);
— команду REM удобно
использовать при отладке командного файла для временного запрета интерпретации
команды путем вставки REM перед ней. При необходимости REM можно легко удалить;
— строка с меткой также может быть использована для
комментирования командного файла (см. описание команды GOTO).
Пример самодокументированного командного файла:
@ЕСНО OFF
REM Этот файл
форматирует и тестирует новый диск в приводе %1
REM Он имеет имя CHECKNEW.BAT
REM
ECHO Установите
дискету в привод %1
ECHO и затем нажмите любую клавишу
PAUSE >NUL
FORMAT %1 /V
CHKDSK %1
Этот файл может быть вызван на выполнение командной
строкой CHECKNEW А:
Команда CALL
Назначение: вызов одного командного файла из другого с последующим возвратом в
точку вызова.
Тип: внутренняя.
Синтаксис:
CALL file [arglist]
Комментарии. По данной команде осуществляется запуск командного файла, заданного посредством
file с передачей ему указанных аргументов (arglist). Этот файл должен существовать и иметь расширение ВАТ. В спецификации file расширение можно не указывать. Когда выполнение командного файла file завершается, управление возвращается в точку его вызова, т.е. в
вызывающий файл на непосредственно следующую за CALL команду.
Замечания:
— команда CALL обеспечивает
возможность создания вложенных командных файлов, что облегчает разработку и
модификацию сложных командных файлов за счет их структуризации;
— в ранних (до 3.3) версиях DOS команда CALL отсутствовала и поэтому ее функции могла
выполнить только команда COMMAND с переключателем
/С. Последнюю допускается использовать для вызова с возвратом и в современных
версиях DOS, однако это потребует больших накладных
расходов и поэтому теряет всякий смысл;
— осуществлять перенаправление ввода-вывода в
команде CALL не допускается;
— уровень вложенности командных файлов не должен
превышать восьми;
— состояние эхо-отображения наследуется вызываемым
командным файлом, но обратно измененное состояние не возвращается;
— с использованием команды CALL можно создавать рекурсивные (обращающиеся к самим себе) командные
файлы, но нужно обеспечить корректное завершение рекурсивных вызовов.
Пример: CALL C:\BAT\CHECKNEW
В:
Команда GOTO
Назначение: безусловный переход
к строке командного файла с заданной меткой.
Тип: внутренняя.
Синтаксис:
GOTO [:] метка
Комментарии. Данная команда
позволяет нарушить обычную линейную последовательность исполнения строк
командного файла. После выполнения команды GOTO интерпретация
командного файла продолжается со строки, текстуально следующей за строкой с
заданной меткой. Метка представляет собой
последовательность алфавитно-цифровых символов без использования разделителей
(специальных символов). Длина метки не ограничивается, но DOS учитывает только первые 8 символов. Строка с меткой должна начинаться
с символа :, непосредственно за которым указывается сама метка. За меткой
(через пробел) может следовать любая последовательность символов,
воспринимаемая как комментарий. Если командный файл не содержит строку с
меткой, указанной в команде GOTO, то его выполнение
по GOTO завершается.
Замечания:
— команда GOTO совместно с
командой IF используется для организации в командных
файлах циклов и разветвлений;
—- строку с меткой можно использовать для
комментирования командного файла (достаточно начать строку символом :, а не
командой REM);
— на ошибочность задания метки в строке командного
файла (но не в команде GOTO) DOS не реагирует,
поэтому в «псевдокомментарии» допустимы любые символы;
— указание в GOTO несуществующей
метки используется для прекращения выполнения командного файла;
— любая строка командного файла, начинающаяся с
двоеточия, при его обработке игнорируется.
Пример:
©ECHO OFF
:AGAIN Простой циклический командный файл
ECHO Нажмите Ctrl-Break для остановки
GOTO AGAIN
Команда IF
Назначение: организация
разветвлений в командных файлах.
Тип: внутренняя.
Синтаксис:
IF [NOT] условие process
Комментарии. Команда IF позволяет выполнить
или пропустить указанный в ней process в зависимости от заданного условия. При отсутствии NOT специфицированный process выполняется, если условие принимает значение «истина», т.е. удовлетворяется. При задании NOT process выполняется, если условие принимает значение «ложь» (не удовлетворяется). В других случаях
специфицированный process не выполняется, а просто пропускается и осуществляется интерпретация
текстуально следующей строки. Команду IF можно прочитать
следующим образом: если [не] условие, то выполнить process.
Условие может быть задано
одним из следующих способов:
EXIST pattern — существует, по крайней мере, один файл,
сопоставимый со спецификацией шаблона pattern;
string 1 = = string2 — символьные строки string 1 и string 2, возможно, после
замещения в них параметров аргументами, идентичны. Строки могут содержать любые
символы, за исключением следующих: пробел, запятая, =,;,<,> и |. В ходе
сравнения проводится различие между одноименными строчными и прописными
буквами;
ERRORLEVEL п — последняя выполненная программа или
внешняя команда DOS (но не обязательно по указаниям из предыдущей строки командного файла)
выдала код возврата, не меньший (не обязательно равный!) чем целое число п;
В связи с тем, что код возврата анализируется не на
равенство, а на больше либо равно, для организации
разветвления по многим направлениям следует
использовать следующую схему:
process
IF ERRORLEVEL п GOTO меткаN
…
IF ERRORLEVEL 2 GOTO метка2
IF ERRORLEVEL 1 GOTO метка 1
REM IF EROORLEVEL 0
…
GOTO END
: метка 1
…
GOTO END
: метка 2
…
GOTO END
…
: меткаN
…
:END
Отсюда видно, что анализ кода возврата нужно
начинать с наибольшего возможного значения. Кроме того, даже если
альтернативная ветвь состоит из единственной команды, последнюю нельзя указывать
непосредственно за условием, так как в этом случае после ее выполнения
удовлетворится условие и в следующей команде IF, что приведет к неправильной работе командного файла. Корректным будет
только безусловный переход к фрагменту командного файла, реализующему
альтернативную ветвь, и выходу из нее снова по команде GOTO. Очевидно, при этом альтернативная ветвь может содержать и несколько
команд.
Если ситуация отличается от описанной, но Вам все же
требуется при удовлетворении какого-либо условия выполнить несколько команд, то
в качестве альтернативы рассмотренному способу можно оформить эти команды
отдельным командным файлом и вызвать его в команде IF по CALL
Замечания:
— команда IF совместно с GOTO позволяет создавать в командных файлах не только разветвления, но и
циклы;
— если после условия в команде IF указать спецификацию командного файла, то
возврат обратно (как после GALL) не произойдет,
— команды IF могут быть
вложенными;
— любую программу можно организовать таким образом,
чтобы она выдавала код возврата, зависящий от каких-либо условий, что позволяет
(с привлечением команды IF) создавать интерактивные
командные файлы;
— некоторые внешние команды (см. подраздел 5.6)
также выдают коды возврата, которые можно использовать для организации разветвлений
в командных файлах;
— если в качестве одной из строк конструкции stringl = = string2 требуется задать
пустую строку, то следует обе строки заключить в одни и те же разделители,
например: .stringl. = =.., string 1"= = "", /stringl/ = =// или даже /stringl == /.
Примеры:
■ IF NOT EXIST D:BASCOM.COM COPY C:\BASIC\BASCOM.COM D: - если
файл BASCOM.COM на диске в приводе D не существует, то скопировать его туда;
■ IF %1 = =LEX
CHDIR C:\EDITORS\LEX
IF %\ = =1ех CHDIR C:\EDITORS\LEX — установить на диске в приводе С текущим каталог \EDITORS\LEX, если первым аргументом командного файла задан каталог LEX или lex;
■ BACKUP С:\*.*
A: /S
IF ERRORLEVEL 3 GOTO TROUBLE — если команда BACKUP завершается с кодом возврата 3 или выше, то
осуществить переход к метке TROUBLE;
■ IF "%1
"==" GOTO Ml
CD %1
GOTO M2
:M1
CD C:\LANGS\TP:
M2 — если аргумент при
запуске командного файла задан, то установить текущий каталог по нему, в противном случае изменить текущий каталог на
C\LANGS\TP;
■ @ECHO OFF :BEGIN
FORMAT A: /S
IF NOT ERRORLEVEL 1 GOTO END
ECHO Системный диск не создан
GOTO BEGIN
:END
ECHO Системный диск создан — форматировать дискету в приводе А и
переносить на нее систему до тех пор, пока эти операции не завершатся успешно
(с кодом возврата 0);
■ IF /%1 = = / CALL TEST MYFILE.TXT — если аргумент при запуске командного файла не задан, то выполнить
командный файл TEST.BAT с аргументом MYFILE.TXT.
Команда FOR
Назначение: организация цикла в командном файле.
Тип: внутренняя.
Синтаксис:
FOR %%символ IN (список) DO process
Комментарии. Данная команда служит для многократного выполнения process с различными
значениями параметра цикла (локальной переменной).
Параметр цикла (в синтаксисе команды — символ) представляется единственным символом, отличным от цифры и %, чтобы он
не вступал в противоречие с параметром командного файла. Обычно параметр цикла
обозначается буквой.
Список — это
последовательность цепочек символов, разделенных пробелами или запятыми. В
качестве элемента списка (цепочки символов) можно задать и спецификацию шаблона
файла, но тогда этот элемент должен быть единственным (остальные элементы
игнорируются). Он обозначает список файлов, с ним сопоставимых.
В аргументе process, задающем выполнение команды или программы, как правило, фигурирует
параметр цикла.
Семантика команды FOR состоит в том, что указанный process многократно выполняется с каждым значением параметра цикла из заданного
списка, причем в том
порядке, в котором эти значения перечислены.
Если требуется поместить в тело цикла (после DO) несколько команд, то следует записать их в отдельный командный файл и
использовать для его вызова команду CALL.
Замечания:
— команда FOR не обладает полнотой
(не позволяет организовать все возможные циклы). Поэтому в ряде случаев
необходимо пользоваться комбинациями команд IF и GOTO. Вместе с тем FOR позволяет решить многие задачи наиболее простым способом;
— команды FOR не могут быть
вложенными;
— спецификация командного файла в качестве process недопустима;
— параметр цикла начинается с двух символов %, чтобы
КП DOS было легче отличить его от параметра командного файла и значения
глобальной переменной;
— команда TOR может быть
использована не только в командном файле, но и непосредственно введена с
клавиатуры. В последнем случае параметр цикла должен начинаться с одного
символа %.
Примеры:
■ FOR %%D IN (А, В, С) DO DIR %%D:*.* — выдать на экран
содержимое текущих каталогов дисков в приводах А, В и С;
■ FOR %%F IN (*.ТХТ) DO TYPE %%F — отобразить
содержимое всех ТХТ-файлов, находящихся в рабочем каталоге (единственной
командой TYPE этого достичь нельзя, так как она не
допускает шаблонов);
■ FOR %%F IN (*ASM) DO MASM %%F — провести ассемблирование всех ASM-файлов из рабочего каталога;
■ FOR %%F IN (*.PAS) DO CALL COMPILE %%F — выполнить командный
файл COMPILE.BAT для каждого PAS-файла из рабочего каталога в качестве
аргумента;
■ FOR %F IN (A:*.*) DO
Команда SHIFT
Назначение: изменение соответствия параметров аргументам командного файла (сдвиг
параметров относительно аргументов на одну позицию вправо).
Тип: внутренняя.
Синтаксис:
SHIFT
Комментарии. Команда SHIFT полезна в тех случаях, когда в командном
файле требуется обеспечить, по крайней мере, одну из следующих возможностей:
1) обработку неопределенного числа аргументов;
2) обработку более девяти аргументов;
3) однообразную циклическую обработку аргументов.
При каждом выполнении команды SHIFT i-й (i = 1,...,8) параметр командного файла принимает значение (i + 1)-го параметра. Значение параметра %0 теряется, а параметр %9
связывается с первым слева из еще свободных аргументов. Иными словами, по SHIFT осуществляется сдвиг параметров относительно аргументов в сторону
увеличения на единицу номеров аргументов.
Замечание: DOS не имеет команды, действие которой
противоположно команде SHIFT. В частности, после однократного сдвига
доступ к первому аргументу (даже посредством %0) становится невозможным, если не сохранить его в качестве значения
глобальной переменной.
Пример командного файла, удаляющего заданные списки файлов:
©ECHO OFF
REM Файл MULTTDEL.BAT: удаляет списки файлов
REM Пример
использования: MULTIDEL ТЕМР.ТХТ, \ВАК, TEST.PAS
:LOОР
SHIFT
IF NOT .%1.= = .. GOTO