Лабораторная работа №2
Программирование командных файлов MS-DOS.
Введение: Любая современная операционная система (ОС) обладает набором встроенных команд, с помощью которых пользователь может общаться с машиной и выполнять действия в соответствии с определенным в системе языковыми правилам. Набор команд и степень их сложности зависят как от возможностей самой операционной системы (ОС), так и от вида интерфейса ЭВМ-пользователь. Операционная система MS_DOS достаточно проста и поэтому в ней содержится минимально необходимый набор команд. С помощью встроенных в MS_DOS команд можно, например, распечатать на экране монитора содержимое текущего каталога (команда dir), или вывести на экран содержимое тестового файла (команда type). Все команды DOS делятся на внутренние, встроенные в командный интерпретатор command.com, и внешние, расположенные как правило, в каталоге DOS системного носителя. К внешним командам относятся, например, хорошо известные команды format, fdisk, sys, copy. Кроме этого, командный язык DOS позволяет пользователю создавать командные файлы, представляющие собой последовательность обычных команд и команд, предназначенных для программирования (for, if, goto, и т.д.)
Цель работы: ознакомление студентов с правилами составления командных файлов и приобретение необходимых навыков системного программирования в процессе их создания.
Рекомендации по составлению отчета: отчет по лабораторной работе следует выполнять в редакторе Microsoft Word. Используйте в окне DOS функцию копирования результатов в буфер обмена c последующей вставкой содержимого буфера в файл отчета. Во время выполнения работы используйте русскоязычный help, расположенный в файле MSD62. Ниже приводится список внутренних, предназначенных для программирования в командных файлах, команд DOS, взятый из файла MSD62, краткая аннотация к ним и примеры использования.
Описание внутренних команд DOS, предназначенных для программирования командных файлов:
Команда CALL
Вызывает один командный файл из другого, не завершая его выполнение.
CALL [диск:][маршрут]имя_файла [параметры_ком_файла]
Например, чтобы запустить файл TEST.BAT из другого командного файла, включите в вызывающий файл команду CALL TEST.
Параметр [диск:][маршрут]имя_файла
задает расположение и имя вызываемого командного файла. Файл должен иметь расширение.BAT."Параметры_ком_файла" - это информация командной строки, необходимая для вызываемого командного файла, включая параметры, имена файлов, подставляемые параметры с %1 по %9 и переменные операционной среды.
Вы можете вызывать командный файл рекурсивно, однако при этом во избежание зацикливания требуется обеспечить команду выхода. Не используйте в команде CALL конвейеризацию (|) и символы перенаправления (<<, <, > и >>).
Команда CHOICE
Выводит пользователю заданную подсказку для выбора командного файла. Ждет, пока пользователь выберет из указанного набора клавиш. Эту команду можно использовать только в командных файлах.
CHOICE [/C[:]клавиши] [/N] [/S] [/T[:]c,nn] [текст]
Параметр "текст" задает текст, который вы хотите выводить перед подсказкой. Вопросительный знак необходим только в том случае, если вы включаете в текст перед подсказкой символ /. Если вы не задаете текст, CHOICE выводит на экран только подсказку.
Параметр /C[:]клавиши задает допустимые в подсказке клавиши. При выводе на экран клавиши будут разделяться запятыми, заключаться в квадратные скобки ([]) и сопровождаться вопросительным знаком. Если вы не указываете параметр /C, CHOICE использует по умолчанию YN. Двоеточие (:) не обязательно.
Параметр /N приводит к тому, что CHOICE не выводит подсказку. Однако текст перед подсказкой выводится. При задании /N указанные клавиши все равно будут доступны.
/S приводит к различимости в CHOICE регистра символов. Если параметр /S не задан, то для любых заданных пользователем клавиш будет восприниматься как верхний, так и нижний регистр.
Если задан параметр /T[:]c,nn, то команда CHOICE перед использованием заданной клавиши по умолчанию делает паузу в течении заданного числа секунд. В /T указываются следующие значения: c -определяет символ, который спустя nn секунд будет задаваться по умолчанию (этот символ должен быть в наборе символов, заданном в параметре /C); nn - задает продолжительность паузы в секундах (допустимые значения лежат в диапазоне от 0 до 99 - если задается 0, то перед назначением по умолчанию будет пауза).
Первая назначенная вами клавиша возвращает значение 1, вторая - 2, третья - 3 и т.д. Если пользователь нажимает клавишу, отсутствующую в списке назначенных клавиш, то CHOICE дает предупреждающий звуковой сигнал (передает на консоль символ 07h).
Если CHOICE обнаруживает состояние ошибки, то возвращает значение 255. Если пользователь передает CTRL+BREAK или CTRL+C, CHOICE возвращает значение, равное 0.
Например, если в командном файле вы указываете команду:
choice /c:ync
то пользователь видит следующее:
[Y,N,C]?
Если вы добавите:
choice /c:ync Yes, No, or Cancel
то пользователю выводится:
Yes, No, or Cancel [Y,N,C]?
Если вы зададите команду:
choice /c:ync /t:n,7
то пользователь видит на экране:
[Y,N,C]?
Если по истечении 7 секунд пользователь не нажмет клавишу, CHOICE выбирает N и возвращает значение ERRORLEVEL 2. При нажатии соответствующей клавиши до истечения 7 секунд CHOICE возвращает значение, соответствующее выбору пользователя.
Команда ECHO
Выводит на экран или скрывает текст командного файла при его выполнении. Показывает также, включено или выключено средство эхоотображения. При запуске командного файла MS-DOS обычно отображает выполняемые команды на экране. Этот режим можно выключить или включить.
ECHO [ON¦OFF]
Чтобы использовать команду для вывода сообщения, запишите:
echo [сообщение]
Параметр ON¦OFF определяет, нужно ли включить или выключить эхоотображение. Чтобы вывести на экран текущую установку, задайте команду ECHO без параметра. "Сообщение" задает текст выводимого на экран сообщения.
О приостановке выполнения командного файла рассказывается в описании команды PAUSE.
Команду ECHO с параметром сообщения полезно использовать при выключенном эхоотображении. Для вывода длинного сообщения, превышающего размер строки, задайте несколько команд ECHO.
При указании команды ECHO OFF в командной строке командная подсказка не выводится на экран. Чтобы вновь ее увидеть, наберите
ECHO ON.
Для предотвращения эхоотображения конкретной строки вы можете задать перед ней в командном файле символ @. Чтобы отобразить на экране пустую строку, наберите команду ECHO с точкой (ECHO.).
Пробел между ними не указывается.
При использовании команды ECHO нельзя указывать символ конвейеризации (|) или перенаправления (< или >).
Команда FOR
Выполняет заданную команду для каждого файла или набора файлов. Эту команду можно использовать в командных файлах или в ответ на командную подсказку.
В первом случае используется синтаксис:
FOR %%переменная IN (множество) DO команда [параметры]
а во втором случае:
FOR %переменная IN (множество) DO команда [параметры]
Параметр %%переменная или %переменная представляет подставляемую переменную. Команду FOR заменяет эту переменную текстом каждой строки в заданном множестве, пока команда после ключевого слова DO не обработает все файлы. "Множество" задает один или более файлов или текстовых строк, которые вы хотите обработать с помощью заданной команды. Скобки обязательны. "Команда" задает команду, выполняемую для каждого включенного в множество файла.
"Параметры" задают параметры данной команды (если она их использует). IN и DO - это не параметры, а обязательные ключевые слова команды FOR.
Чтобы избежать путаницы с параметрами командного файла %0 %9, для переменных следует использовать любые числа кроме 0 - 9. В простом командном файле вам хватит одного символа, например, %%F. Вложенность команд FOR на одной командной строке не допускается.
Параметр "множество" представляет одну или несколько групп файлов. В нем можно использовать трафаретные символы (* и?). Допустимы следующие множества (*.doc), (*.doc *.dat *.rpt), (olg*.doc olgj*.rpt svt*.doc svt*.rpt), (ol??1991.* kr??1991.*).
При использовании команды FOR первое значение в множестве заменяет %%переменную (или %переменную), и MS-DOS выполняет для обработки этого значения заданную команду. Этот процесс продолжается, пока MS-DOS не обработает все файлы (или группы файлов) в множестве.
Предположим, вы хотите использовать команду PRINT для распечатки содержимого всех файлов в текущем каталоге с расширением.DAT и.RPT. Для этого наберите команду:
for %f in (*.dat *.rpt) do print %f
Каждый файл в указанными расширениями подставляется в качестве %F, пока не будет распечатано содержимое всех файлов. В этой команде можно использовать символы конвейеризации и перенаправления. Например, предыдущую команду можно модифицировать следующим образом:
for %f in (*.dat *.rpt) do type %f > prn:
Команда GOTO
Передает управление MS-DOS на строку в командном файле, которая помечена заданной меткой. MS-DOS продолжает обработку команд, начиная со следующей после метки строки. Эту команду можно использовать только в командных файлах.
GOTO метка
Параметр "метка" задает строку командного файла, на которую должна перейти MS-DOS. Метка не может включать в себя разделители (пробелы, точки с запятой или знаки равенства). GOTO использует первые 8 символов каждой метки.
Метка, заданная вами в команде GOTO, должна совпадать с меткой в командном файле (перед такой меткой указывается двоеточие). Если командный файл не содержит заданной метки, то его обработка прекращается, а MS-DOS выводит на экран сообщение:
Label not found
(Метка не найдена)
GOTO часто используется с командой IF для выполнения перехода по условию. См. пример в описании команды IF.
Команда IF
Выполняет в командных файлах условную обработку. Если заданное в команде условие принимает истинное значение, MS-DOS выполняет следующую за условием команду. Если условие ложно, MS-DOS игнорирует команду. IF можно использовать только в командных файлах.
IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда
Параметр NOT определяет, что MS-DOS должна выполнять команду только в случае ложного значения условия. "ERRORLEVEL число" определяет истинное условие только если предыдущая выполняемая COMMAND.COM программа возвращает код выхода, больший или равный заданному числу.
"Команда" задает команду, выполняемую MS-DOS при удовлетворении условия. "Строка1==строка2" определяет истинное условие только при совпадении указанных строк. Строки могут быть лите-ральными или представлять собой переменные (например, %1). Кавычки для литеральных строк не требуются.
EXIST имя_файла задает истинное условие, если указанный файл существует.
Приведем пример:
if not errorlevel 1 goto A
...
:A
...
Здесь, если код выхода выполненной ранее программы отличен от 1, то выполняются операторы, следующие за меткой A. В противном случае выполняется группа операторов за строкой if.
Команда PAUSE
Приостанавливает обработку командного файла и выводит сообщение с подсказкой пользователю вида
Press any key to continue...
(Для продолжения нажмите любую клавишу)
Эта команда используется только в командных файлах и имеет синтаксис:
PAUSE
Если при выполнении командного файла вы нажмете клавиши CTRL+C, MS-DOS выведет на экран сообщение:
Terminate batch job (Y/N)?
(Прервать командный файл (Да/Нет)?)
При нажатии Y обработка командного файла завершается, и управление возвращается операционной системе. Таким образом, вы можете включить команду PAUSE перед той частью командного файла, которую может потребоваться исключить из выполнения. Когда PAUSE приостановит обработку командного файла, вы можете для его завершения нажать CTRL+C.
Команда REM
Позволяет вам включать в командный файл или в файл CONFIG.SYS комментарии. Команду REM полезно использовать для временного запрещения команд. (В CONFIG.SYS вместо REM можно использовать точку с запятой.)
REM [строка]
Параметр "строка" задает любую строку символов (в комментарии командного файла нельзя указывать символы <, > и |).
Команда REM не выводит на экран сообщений (см. описание команды ECHO). Чтобы вывести комментарии на экран, включите в CONFIG.SYS или командный файл команду ECHO ON.
Команда SHIFT
Изменяет позицию параметров в командном файле.
SHIFT
Команда SHIFT изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, %2 - в %1 и т.д. Это полезно для написания командного файла, выполняющего с любым числом параметров одну и ту же операцию. С помощью SHIFT вы можете также построить командный файл, воспринимающий более 10 параметров: те параметры, которые задаются после десятого (%9), будут сдвигаться по одному в %9.
Команда, обратная SHIFT (обратный сдвиг), отсутствует. После выполнения SHIFT вы не сможете восстановить первый параметр (%0), который был перед сдвигом.
Приведем в качестве примера командный файл DIRCOP.BAT, который копирует список файлов в заданный каталог. В качестве параметра задаются имя каталога и любое число файлов.
@echo off
set ddir=%1
:getname
shift
if "%1"=="" goto end
copy %1 %ddir%
goto getname
:end
set ddir=
Параметры пакетного файла. Программирование пакетных файлов
Как и во всяком языке программирования, командный интерпретатор содержит переменные (параметры), которым могут быть назначены конкретные значения во время выполнения пакетного файла (программы). Переменные могут обозначаться любым набором символов, который не должен начинаться с цифры или служебного символа и не должен содержать пробелы. Например, набор символов temp или темр8 является допустимым для обозначения переменной, а 6temp или temp 8 – недопустимым набором. Переменные командного интерпретатора обычно называют именованными параметрами. Присвоить значение именованным параметрам можно с помощью команды set. Например,
set temp = c:\windows\temp
Прим: команда set без параметров выводит на экран список всех переменных, назначенных на данный момент операционной системой и пакетными файлами с указанием их значений.
Прочитать же содержимое такой переменной можно, например, командой echo. Но при этом название переменной необходимо заключить в знаки %. Например,
echo %temp%
Кроме именованных параметров командный интерпретатор содержит и так называемые позиционные параметры (переменные), которые используются пакетными файлами для ввода собственных параметров (то, что указывается вслед за названием файла). В командной строке имя файла и параметры разделяются один от другого пробелами. Внутри пакетного файла позиционным параметрам соответствуют переменные, обозначаемые символами от %0 до %9, то есть всего таких переменных ровно десять. При этом переменная %0 принимает значение равное названию самого файла. Поэтому фактически первому позиционному параметру будет соответствовать переменная %1, второму -%2 и т.д. до %9.
Чтобы проверить данное утверждение, составим пакетный файл start.bat и включим в него следующие строки:
echo off echo Название файла %0 echo Первый позиционный параметр %1 echo Второй позиционный параметр %2 echo Третий позиционный параметр %3 |
а затем выполним его с командной строки
Start.bat p1 p2 p3
После выполнения файла мы увидим значения всех позиционных параметров.