8.8.16. Команды для командных файлов
Подавляющее
большинство команд этой группы может быть использовано не только в командных
файлах и определениях синонимов, но и введено с клавиатуры. Однако данные команды
наиболее полезны именно в командных файлах и определениях синонимов, что и
предопределило их принадлежность к рассматриваемой группе.
Особенности
организации командных файлов в NDOS перечислены при
описании Команды ALIAS (см. п. 8.8.11). Аппарат командных файлов,
поддерживаемый NDOS, таков, что язык командных файлов является
по сути полноценным языком программирования и включает даже средства
ввода-вывода.
Команда ECHO
Назначение: включение и отключение эхо-отображения командной строки на экране дисплея
перед ее выполнением, а также выдача текущего статуса и отображение заданного
сообщения.
Синтаксис:
ECHO [ON|OFF |сообщение]
Комментарии. Особенности NDOS-команды ECHO связаны в большей
степени с расширением командного языка этого КП, а не с усовершенствованием
данной команды как таковой.
В командных файлах по умолчанию
принимается ECHO ON. Однако если Вы измените командой SETDOS значение системной
переменной VERBOSE с 1 на 0, то умолчание для командных файлов
будет заменено на ECHO OFF. Установленный (по умолчанию или явно)
статус эхо-отображения наследуется всеми вызываемыми (подчиненными) командными
файлами.
При вводе команд с
клавиатуры всегда по умолчанию принимается ECHO OFF, причем этот статус
эхо-отображения никоим образом не зависит от статуса, установленного в
командных файлах (и наоборот). Ввод команды с клавиатуры при отключенном
эхо-отображении приводит к синхронной выдаче на экран напечатанных символов.
После нажатия клавиши Enter командная строка передается на выполнение. При включении
эхо-отображения (ECHO ON) дополнительно к этому NDOS будет выдавать на
экран командную строку с разименованными синонимами и подставленными значениями
глобальных переменных, что весьма полезно при отладке сложных команд.
NDOS обеспечивает эмуляцию символа Esc парой других символов, а именно, t (Ctrl-X) и е. Поэтому команду ECHO теперь удобно использовать для выдачи Escape-последовательностей на устройство CON.
Замечания:
— при необходимости
поместить в текст сообщения символы |, > и/ или < заключайте их в кавычки или
предотвращайте их нормальную интерпретацию предшествующим символом ↑ (Ctrl-X);
― символ ↑ (Ctrl-X) можно заменить
другим, если выполнить команду SETDOS с переключателем /E.
Пример:
■ ECHO ↑e[7;12H – выдать Escape-последовательность.
Команда
TEXT
Назначение: отображение фрагмента текста.
Синтаксис:
TEXT
строки текста
ENDTEXT
Комментарии. В отличие от
команды ECHO данная команда позволяет отобразить несколько
строк текста одновременно, что удобно, например, при выводе меню.
Замечания:
― ключевые слова TEXT и ENDTEXT должны
располагаться на отдельных строках, в которых не допускается наличие других
символов;
― если к системе подключен драйвер ANSI.SYS, то в отображаемый
текст можно поместить Escape-последовательность для смены атрибутов
экрана.
Пример:
■ @ЕСНО OFF^CLS^SCREEN 2 О
TEXT
Введите одну из следующих цифр:
1 ― СУБД Paradox
2 — редактор ЛЕКСИКОН
3 — утилиты Нортона
Сделайте Ваш выбор:
ENDTEXT
Команда
PAUSE
Назначение: организация паузы
при выполнении командного файла или интерпретации синонима.
Синтаксис:
PAUSE [сообщение]
Комментарии. В отличие от
одноименной DOS-команды данная команда отображает текст
Strike a key when
ready...
только тогда, когда
сообщение в качестве ее аргумента не задано. В противном случае выводится
только указанное сообщение аналогично команде ECHO. Поэтому даже при
отключенном эхо-отображении сообщение на экране появится.
Если команда PAUSE выдана из определения синонима и пользователь
ответил нажатием комбинации клавиш Ctrl-Break, то интерпретация
синонима в отличие от командного файла немедленно прекратится без повторного
запроса.
Команда
CANCEL
Назначение: прекращение
обработки командных файлов.
Синтаксис:
CANCEL
Комментарии. При выполнении
данной команды обработка командных файлов немедленно прекращается, независимо
от уровня их вложенности, вследствие чего сразу можно будет вводить команды с
клавиатуры.
Пример:
■ IF
"%TERM" = = "END" CANCEL
Команда QUIT
Назначение: завершение
выполнения текущего командного файла.
Синтаксис:
QUIT
Комментарии. Функция этой
команды эквивалентна безусловной передаче управления на метку, записанную в
последней строке командного файла.
Пример:
■ IF
"%TERM" = = "RETURN" QUIT
Команда IF
Назначение: организация
разветвлений в командных файлах и синонимах.
Синтаксис:
IF [NOT] условие process
Комментарии. Усовершенствования
данной команды заключаются в предоставлении более богатого набора условий. В условии можно использовать следующие логические операции (обозначим их через ор):
EQ (или = =) —
равно;
NE —
не равно;
LT —
меньше;
LE —
меньше либо равно;
GT —
больше;
GE —
больше либо равно.
Условие может принимать одну из следующих форм:
EXIST pattern — существует по крайней мере один файл,
сопоставимый с шаблоном pattern;
ISDIR dir — существует по крайней мере один каталог,
сопоставимый с шаблоном dir,
ISALIAS string — имя string является синонимом;
stringl op string2 — значение логического выражения истинно. Перед
вычислением этого логического выражения в операндах stringl и string2 параметры замещаются аргументами, ссылки на значения глобальных
переменных — их значениями, а вызовы встроенных функций — результатами их
вычисления. Различия между одноименными прописными и строчными буквами
игнорируются;
ERRORLEVEL [op] п — последняя
выполненная программа, в частности, внешняя команда, выдала код возврата т, такой, что значение логического выражения т op п истинно. Если операция ор не задана, то
подразумевается GE (как в DOS).
Если значения строк stringl и string2 содержат только цифры, то NDOS, в отличие от COMMAND.COM'a, использует числовое сравнение, а иначе — символьное (лексикографическое).
Так, условие 09 = = 9 удовлетворяется.
Чтобы избежать возникновения потенциальных проблем (например, в случае
пустых строк или использования символов, имеющих для NDOS специальное
значение), лучше всегда заключать сравниваемые символьные (не числовые) строки в кавычки
("). Это не блокирует доступ к значениям глобальных переменных и
аргументам, а также вызов встроенных функций.
Пример:
■ IF %@DOSFREE[K] GE 350 ECHO Свободно не менее
350 Кбайт — проверить, имеется ли в ОЗУ свободная область размером не менее 350
Кбайт.
Команда
IFF
Назначение: организация
разветвлений в командных файлах и синонимах по двум и более направлениям.
Синтаксис:
IFF [NOT] условие THEN
Process
…
[ELSEIFF [NOT] условие THEN
process
...]
[ELSE process
...]
ENDIFF
Комментарии. Команда IFF является обобщением команды IF и обеспечивает
структуризацию командного файла, исключая необходимость использования команды GOTO.
Формат команды IFF представлен на нескольких строках не
случайно — каждая конкретная команда IFF должна иметь в
точности такую же структуру. Конечно, конструкции команды можно размещать и на
одной строке, используя для их сцепления символ Л.
Конструкций ELSEIFF — THEN может быть
несколько или ни одной.
Семантика команды IFF такова:
1) вычисляется очередное (начиная с первого) логическое выражение [NOT] условие;
2) если оно
истинно, то интерпретируется фрагмент командного файла (синонима), расположенный
между строкой с истинным логическим выражением и следующей конструкцией ELSEIFF — THEN, ELSE или END IFF, после чего
выполнение команды IFF прекращается;
3) если значением
вычисленного логического выражения является «ложь», то в качестве очередного
логического выражения выбирается [NOT] условие в следующей конструкции ELSEIFF, и осуществляется
переход к п. 1. Когда такой конструкции не обнаружено и имеется конструкция ELSE, то выполняется
фрагмент командного файла (синонима), указанный за ней, после чего
интерпретация команды IFF прекращается. Если отсутствует и конструкция
ELSE, то в этом случае просто прекращается выполнение команды IFF.
Условия в команде IFF могут задаваться в том же виде, что и в
команде IF. Средства, аналогичные команде IFF, имеются во всех
развитых языках программирования. Конструкцию IFF — THEN — ELSEIFF — THEN... — ELSE — ENDIFF можно прочитать
как «если—то — иначе если — то ... —
иначе — все», что облегчит уяснение семантики команды IFF.
Замечания:
— команды IFF могут быть,
вложенными, но глубина вложенности не должна превышать 15;
— использование команды GOTO внутри команды IFF допустимо, но
запрещается переходить к другой конструкции данной команды;
— переход на метку внутри команды IFF также запрещен.
Пример:
■ IFF "%TERM" = =
"END" THEN*CANCEL
ELSEIFF "%TERM"= = "RETURN"
THEN'QUIT
ELSE'ECHO Продолжение работы
ENDIFF
Команда FOR
Назначение: организация цикла в командном файле или синониме.
Синтаксис:
FOR %[%] параметр IN (список) [DO] process
Комментарии. Команда FOR отличается от одноименной DOS-команды следующим:
1) список может
содержать несколько элементов, независимо от их вида (в DOS при использовании шаблона
требуется, чтобы он был единственным элементом списка). Следующий элемент
списка выбирается только после перебора всех допустимых конкретизации
очередного элемента;
2)перед параметром цикла могут указываться символ ~% или пара таких символов (%%), независимо от того, где команда FOR использована (в командном файле, определении синонима или в ответ на приглашение NDOS);
3) длина параметра
цикла ограничивается 80 символами (а не единственным символом);
4) ключевое слово DO не является
обязательным;
5)команды FOR могут быть вложенными (в DOS такое вложение не
допускается).
Пример:
■ FOR %А IN (*.ВАК) IF EXIST %@NAME[%A].TXT DEL %A - удалить
ВАК-версии существующих ТХТ-файлов.
Команда SHIFT
Назначение: изменение соответствия параметров и аргументов командного файла, т.е.
сдвиг параметров относительно аргументов вправо или влево.
Синтаксис:
SHIFT [n]
Комментарии. Числом п задается
направление и величина сдвига.
Если n>0, то параметры сдвигаются относительно аргументов на п позиций вправо.
Если n<0, то параметры сдвигаются относительно аргументов на |n| позиций влево.
По умолчанию п считается равным 1 (как в DOS).
Замечания:
― после сдвига
изменяются также значения параметров %п& и глобальной переменной #;
― команду SHIFT в определении
синонима использовать нельзя.
Команда G0SUB
Назначение: вызов подпрограммы в командном файле.
Синтаксис:
GOSUB метка
Комментарии. Данная команда обеспечивает безусловную передачу управления на
заданный меткой фрагмент этого же командного файла, после интерпретации
которого управление может быть возвращено на команду, непосредственно следующую
за GOSUB. Для возврата управления служит команда RETURN.
Подпрограмма может
находиться в конце командного файла, вслед за командой QUIT:
…
GOSUB метка
…
QUIT
: метка
…
RETURN
Замечание: оформление одинаковых фрагментов командного файла в виде подпрограммы
сокращает размер и облегчает подготовку командного файла, но требует
дополнительных затрат времени при его выполнении.
Команда RETURN
Назначение: возврат из подпрограммы в командном файле.
Синтаксис:
RETURN
Команда BE
Команда BE выполняет
большинство функций утилиты Batch Enhancer, существенно
увеличивая при этом скорость интерпретации командных файлов и синонимов, а
также предоставляет дополнительные возможности.
Тем не менее
команда BE не поддерживает сценарии и поэтому не воспринимает подкоманды (при описании утилиты они назывались
командами) EXIT, GOTO и JUMP.
Дополнительные
возможности предоставляются командой BE только в
подкомандах PRINTCHAR и REBOOT.
Формат команды BE совпадает с
форматом запуска утилиты BE, а справки по
требуемой подкоманде можно получить путем ввода командной строки
BE подкоманда /?
После получения
командной строки с вызовом BE КП NDOS пытается сначала
выполнить внутреннюю команду и только, если это не получается, запрашивает
выполнение утилиты BE, которая должна быть, доступна по значению
глобальной переменной PATH.
Подкоманда PRINTCHAR вызывается в
формате
BE PRINTCHAR k,n [color]
Ее особенности состоят в использовании запятой, а также в том, что
максимальное значение н составляет 132
(утилита BE поддерживает только 80). Подкоманда REBOOT запрашивается в виде
BE REBOOT [/V] [/С]
Новый переключатель
/С здесь требует произвести не «теплую», а «холодную» перезагрузку DOS.
NDOS поддерживает и семейство других команд,
аналогичных по функциям подкомандам команды BE Перейдем к рассмотрению таких команд. В
них, как и в команде BE, строки экрана и позиции внутри строки нумеруются, начиная с нуля.
Команда ВЕЕР
Назначение: выдача звуковых сигналов.
Синтаксис:
ВЕЕР [т n] ...
Комментарии. Числом т в командной строке
должна быть частота сигнала в герцах, а числом n — длительность сигнала в тиках. По умолчанию
используется пара 440 2.
Замечания:
― задав частоту
меньше 20 Гц, командой ВЕЕР можно обеспечить паузу,
― в командной
строке допустимо несколько пар т п.
Команда DELAY
Назначение: обеспечение паузы в обработке на определенное время.
Синтаксис:
DELAY [n]
Комментарии. Величина задержки л задается в секундах (по умолчанию принимается 1).
Аннулировать задержку можно путем нажатия комбинации клавиш Ctrl-Break.
Команда COLOR
Назначение: установка цветов экрана.
Синтаксис:
COLOR [color]
Комментарии. Новые установки будут действовать на весь последующий вывод (но не на
те сведения, которые уже отображены на экране). По умолчанию принимается WHI ON BLA, что удобно использовать для возврата атрибутов экрана в исходное
состояние.
Команда SCREEN
Назначение: позиционирование курсора в заданном месте экрана и вывод сообщения.
Синтаксис:
SCREEN row col [сообщение]
Комментарии. Здесь row — номер строки, a col — номер позиции в
строке, где требуется отобразить сообщение. Если сообщение не задано, то просто осуществляется позиционирование
курсора.
Команда SCRPUT
Назначение: вывод сообщения в заданном месте экрана и с заданными атрибутами.
Синтаксис:
SCRPUT row col color сообщение
Комментарии. Здесь row — номер строки, a col — номер позиции в
строке, где требуется отобразить сообщение с атрибутами color.
Команда DRAWHLINE
Назначение: вывод на экран горизонтальной линии.
Синтаксис:
DRAWHLINE row col l st color
Комментарии. Аргументы интерпретируются следующим образом:
row — номер строки, в которой требуется вывести
линию;
соl —
номер позиции в строке,
начиная с которой следует вывести линию;
l — длина линии в символах;
st — стиль линии (1 — одинарная, а 2 — двойная
линия);
color — атрибуты (в том числе цвет) линии.
Команда
DRAWVLINE
Назначение: вывод на экран вертикальной линии.
Синтаксис:
DRAWVLINE row col l st color
Комментарии. Аргументы имеют смысл, аналогичный команде DRAWHLINE.
Команда
DRAWBOX
Назначение: вывод на экран прямоугольной рамки.
Синтаксис:
DRAWBOX top left bottom
right st color [FILL bgf]
Комментарий. DRAWBOX — это мощная команда, распознающая уже имеющиеся
на экране линии и корректно модифицирующая места пересечений с ними
отображаемой рамки. Аргументы в командной строке имеют следующий смысл:
top и left —
номер строки и позиции в
ней, где нужно разместить левый верхний угол рамки;
bottom и right —
номер строки и позиции в
ней, где следует разместить правый нижний угол рамки;
st — стиль рамки:
0 — отсутствие явно нарисованной рамки,
которая в этом случае отображается полосками фонового цвета;
1 — рамка выводится одинарной линией;
2 — рамка выводится двойной линией;
3 — рамка выводится одинарными
горизонтальными и двойными вертикальными линиями;
4 — рамка выводится двойными
горизонтальными и одинарными вертикальными линиями;
color — атрибуты (в
том числе цвет) рамки;
bgf — наименование цвета, которым следует
заполнить фон области внутри рамки (если заполнитель
не задан, то фон области внутри рамки и ее содержимое не изменяются).
Команда INKEY
Назначение: ввод односимвольного значения в командном файле или синониме.
Синтаксис:
INKEY [/Ww] [сообщение] %%string
Комментарии. Данная команда, выданная в командном файле или синониме, обеспечивает ввод с клавиатуры односимвольного значения и его присваивание глобальной переменной с именем string. Если задан аргумент сообщение, то перед нажатием клавиши (или их комбинации) на экране будет
отображено указанное приглашение. Завершать ввод символа нажатием клавиши Enter не требуется.
Переключателем /Ww задается интервал времени в секундах, в течение которого команда будет
ждать ввода символа. По истечении этого интервала обработка продолжается, а значение глобальной переменной не изменяется, Если
специфицировать /W0, то ввести символ можно будет только путем
упреждающего нажатия клавиши или комбинации клавиш (ожидание отсутствует). По
умолчанию период ожидания ничем не ограничивается.
Введенное ASCII-значение запоминается как символ.
Расширенный же код клавиши представляется строкой, в качестве первого
символа которой используется символ @, а последующих — код в десятичной системе
счисления (например, нажатие Р1 приведет к вводу строки @59).
Замечание: завершить интервал
ожидания можно путем нажатия комбинации клавиш Ctrl-Break.
Команда INPUT
Назначение: ввод строки в
командном файле или синониме.
Синтаксис:
INPUT [/Ww] [сообщение] %%string
Комментарии. Эта команда аналогична команде INKEY, но имеет
следующие особенности:
1) можно ввести последовательность символов (строку);
2) ввод строки следует завершить нажатием клавиши Enter;
3) ввод расширенных кодов клавиш не поддерживается.
Команда LOADBTM
Назначение: переключение режима интерпретации командного файла (с ВАТ-режима на
ВТМ-режим и обратно), а также отображение текущего режима.
Синтаксис:
LOADBTM [ON | OFF]
Комментарии. NDOS поддерживает два режима выполнения командных
файлов — ВАТ-режим и ВТМ-режим.
ВАТ-режим идентичен единственному режиму обработки командных файлов в DOS, когда командный
файл читается построчно.
ВТМ-режим обеспечивает загрузку командного файла в память целиком и последующую
его интерпретацию. Такая техника ускоряет обработку командного файла в 2 — 5
раз, но препятствует корректному выполнению самомодифицирующихся командных
файлов и не поддерживает загрузку резидентных программ.
Если командный файл имеет расширение ВАТ, то он запускается в ВАТ-режиме,
а если ВТМ — то в ВТМ-режиме.
Команда LOADBTM позволяет переключать режим обработки внутри
командного файла. Если задать ON, то включится
режим ВТМ, a OFF — режим ВАТ. Ввод команды без аргумента
обеспечит отображение текущего режима (ON или OFF для ВТМ и ВАТ
соответственно).
Команда LOADBTM используется для оптимизации командных
файлов по времени выполнения без нанесения ущерба их возможностям, переключая
режим на ВАТ только там, где это необходимо, а затем вновь устанавливая режим
ВТМ.
Команда SETLOCAL
Назначение: сохранение сведений о рабочем каталоге, а также окружения и списка
синонимов.
Синтаксис:
SETLOCAL
Комментарии. SETLOCAL резервирует указанные сведения и области
памяти с возможностью последующего восстановления. Это полезно делать перед
выполнением программы, требующей специфической конфигурации системы. После SETLOCAL производятся
необходимые для такой программы переустановки, а затем вызывается программа.
Восстановление зарезервированных сведений и областей осуществляется командой ENDLOCAL.
Замечания:
― команды SETLOCAL и ENDLOCAL в определениях
синонимов недопустимы;
― команды SETLOCAL не могут быть вложенными в пределах одного
командного файла (за SETLOCAL должна быть выдана команда ENDLOCAL, и только после
этого можно снова mиспользовать команду SETLOCAL). Тем не менее
стек все же можно организовать, вызывая SETLOCAL каждый раз в
отдельном командном файле.
Команда ENDLOCAL
Назначение: восстановление
сведений о рабочем каталоге, а также окружения и списка синонимов.
Синтаксис:
ENDLOCAL
Комментарии. ENDLOCAL является обратной по отношению к команде SETLOCAL.
Команда KEYSTACK
Назначение: запись
последовательности символов в буфер клавиатуры.
Синтаксис:
KEYSTACK {"string"|m|@n|!} ...
Комментарии. Команда доступна, если к системе подключен драйвер KEYSTACK.SYS. Эта команда
записывает в буфер клавиатуры и выстраивает в очередь к нему последовательность
символов, длина которых может достигать 255 символов. Именно эта
последовательность символов будет подаваться в запущенную после выдачи команды
программу, в частности, имитируя нажатие клавиш. Поэтому команда KEYSTACK позволяет
«запрограммировать» макрокоманды, выполняемые после запуска любого
программного продукта, даже если он не имеет макросредств. В частности, можно
обеспечить демонстрационное выполнение программы.
Последовательность символов для буфера клавиатуры задается в командной
строке в общем случае фрагментами, для каждого из которых допустимы следующие
способы спецификации:
"string" — последовательность символов, составляющих string;
т — ASCII-символ с десятичным кодом т;
@п — расширенный код клавиши (где п — число в десятичной системе счисления).
Символ с кодом 0 имеет специальное значение: он «обманывает» программы,
периодически очищающие буфер клавиатуры. Когда в буфере клавиатуры
обнаруживается символ с кодом О, NDOS извещает
программу, что буфер клавиатуры очищен. Поэтому данный символ следует указывать
в тех местах последовательности символов, которые соответствуют очистке буфера
клавиатуры из программы.
Символ ! обеспечивает удаление из буфера всех записанных в него, но не
-прочитанных программой кодов.
Замечания:
― скорее всего, Вам придется поэкспериментировать с программой и
командой KEYSTACK, чтобы определить требуемую
последовательность символов;
― вводить команду KEYSTACK в ответ на
приглашение NDOS бессмысленно, так как все запросы на
выполнение команд и программ в данном случае проходят через буфер клавиатуры.
Пример:
■ KEYSTACK 0 @68 'лрзMYVOC.VOC 13" -
запустить текстовый редактор ЛЕКСИКОН с автоматической загрузкой в него
рабочего словаря.