Обеспечивает вызов одного командного файла из другого с последующим возвратом в точку вызова
Синтаксис
CALL file [arglist]
По ней производится запуск командного файла, заданного аргументом file с передачей ему указанных аргументов (arglist). Этот файл должен существовать и иметь расширение ВАТ. В спецификации file расширение можно не указывать.
Пример: CALL C:\BAT\C В:
Предназначена для безусловного перехода к строке командного файла с заданной меткой.
Синтаксис:
GOTO [:]метка
Позволяет нарушить линейную последовательность исполнения строк командного файла. После выполнения команды GOTO интерпретация командного файла продолжается со строки, следующей за строкой с заданной меткой.
Метка – это последовательность алфавитно-цифровых символов без использования разделителей (специальных символов). Длина метки не ограничивается, но DOS учитывает только первые 8 символов. Строка с меткой должна начинаться с символа :, непосредственно за которым указывается сама метка. За меткой (через пробел) может следовать любая последовательность символов, воспринимаемая комментарием.
Замечания:
— строку с меткой можно использовать для комментирования командного файла (достаточно начать строку символом :, а не командой REM);
— на ошибочность задания метки в строке командного файла (но не в команде GOTO) DOS не реагирует, поэтому в «псевдокомментарии» допустимы любые символы;
— указание в GOTO несуществующей метки используется для прекращения выполнения командного файла;
— любая строка командного файла, начинающаяся с двоеточия, при его обработке игнорируется.
Пример:
@ECHO OFF
:AGAIN Простой циклический командный файл
ECHO Нажмите Ctrl-Break для остановки
GOTO AGAIN
Простые команды закончились.
Предназначена для организации ветвлений в командных файлах.
Синтаксис:
IF [NOT] условие process
Команду IF можно прочитать следующим образом: если [не] условие, то выполнить process.
Команда IF позволяет выполнить или пропустить указанный в ней process в зависимости от заданного условия. При отсутствии NOT process выполняется, если условие удовлетворяется. При задании NOT process выполняется, если условие не удовлетворяется. В других случаях process не выполняется, а просто пропускается и осуществляется интерпретация следующей строки КФ по тексту.
Условие может быть задано одним из следующих способов:
- EXIST file — существует, по крайней мере, один файл, сопоставимый со спецификацией шаблона file,
- строка1 == строка2 — анализ совпадения символьных строк строка1 и строка2, после замещения в них параметров аргументами. Строки могут содержать любые символы, за исключением пробел, запятая, =, ;, <, > и |. В ходе сравнения проводится различие между одноименными строчными и прописными буквами. Если в этих строках имеются символы &4-&9, то вместо них подставляются параметры командного файла;
- ERRORLEVEL n — последняя выполненная программа или внешняя команда DOS (но не обязательно по указаниям из предыдущей строки командного файла) выдала код возврата, не меньший (не обязательно равный!) чем целое число n;
В связи с тем, что код возврата анализируется не на равенство, а на больше либо равно, для организации разветвления по многим направлениям следует использовать следующую схему:
process
IF ERRORLEVEL n GOTO меткаN
...
IF ERRORLEVEL 2 GOTO метка2
IF ERRORLEVEL 1 GOTO мстка1
REM IF ERORLEVEL 0
...
GOTO END
:меткаl
...
GOTO END
:метка2
...
GOTO END
:меткаN
...
:END
Правило 1. Анализ кода возврата нужно начинать с наибольшего возможного значения.
Правило 2. Даже если альтернативная ветвь состоит из единственной команды, последнюю нельзя указывать непосредственно за условием, так как в этом случае после ее выполнения удовлетворится условие и в следующей команде IF. Это приведет к неправильной работе командного файла. Корректным будет только безусловный переход к фрагменту командного файла, реализующему альтернативную ветвь, и выходу из нее снова по команде GOTO. При этом альтернативная ветвь может содержать и несколько команд.
Если ситуация отличается от описанной, но все же требуется при удовлетворении какого-либо условия выполнить несколько команд, то в качестве альтернативы рассмотренному способу можно оформить эти команды отдельным командным файлом и вызвать его в команде IF по CALL.
Замечания:
1. Если после условия в команде IF указать спецификацию командного файла, то возврат обратно (как после CALL) не произойдет;
2. Команды IF могут быть вложенными;
3. Любую программу можно организовать таким образом, чтобы она выдавала код возврата, зависящий от каких-либо условий, что позволяет (с привлечением команды IF) создавать интерактивные командные файлы;
4. Некоторые внешние команды также выдают коды возврата, которые можно использовать для организации разветвлений в командных файлах;
5. Если в качестве одной из строк конструкции string1== string2 требуется задать пустую строку, то следует обе строки заключить в одни и те же разделители, например: .string1. ==.., “string1”==””, /string1/ ==// или даже /string1==/.
Примеры:
1)IF NOT EXIST D:\B.COM COPY C:\BASIC\B.COM D: - если файла
B.COM на диске D нет, то скопировать его туда c диска С;
2)IF %1==LEX CHDIR C:\EDIT\LEX
IF %l==lex CHDIR C:\EDIT\LEX
— установить на диске С текущим каталог \EDIT\LEX, если первым аргументом командного файла задан каталог LEX или lex;
3) BACKUP С:\*.* A: /S
IF ERRORLEVEL 3 GOTO T — если команда BACKUP завершается с кодом возврата 3 или выше, то перейти к метке T;
4) IF “%1”==”” GOTO M1
CD %1
GOTO M2
:M1
CD C:\LANG\TP
:М2 — если аргумент при запуске командного файла задан, то установить текущий каталог по нему; в противном случае изменить текущий каталог на C\LANG\TP;
5) @ECHO OFF
:BEGIN
FORMAT A: /S
IF NOT ERRORLEVEL 1 GOTO END
ECHO Системный диск не создан
GOTO BEGIN
:END
ECHO Системный диск создан — форматировать диск А и переносить на него систему до тех пор, пока эти операции не завершатся успешно (с кодом возврата 0)
6) IF /%1 == / CALL TEST M.TXT — если аргумент при запуске командного файла не задан, то выполнить командный файл TEST.BAT с аргументом M.TXT.