Дополнительные команды для командных файлов

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)?

(Завершить пакетное задание (Yfla/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 DEL C:%F — удалить из текущего каталога диска в приводе С все файлы, содержащиеся в текущем каталоге диска в приводе А, например, после ошибочного копирования файлов в непустой каталог. Эта команда (так как проставлен единственный символ %) может быть введена только в командной строке.

Команда 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ОР

DEL %1

SHIFT

IF NOT .%1.= = .. GOTO LOOP