DOS — долгожитель среди
операционных систем. Часть 2
Если вы читали прошлую статью этой серии
, то, должно быть, помните, что я там
рассказывал о некоторых командах ДОСа и их
использовании в пакетных файлах. С этим я
тогда немного забежал вперед, так как BAT-файлы
— главная тема сегодняшнего материала.
Если же вы не знакомы с содержанием
предыдущей статьи, то рекомендую прочесть
ее перед тем, как приступать к этой.
Итак, BAT-файлы — это текстовые файлы,
состоящие из команд ДОС, интерпретируемых
при запуске. Во многом BAT'ы похожи на
программы.
Кроме команд pause, echo и пр., описанных в
предыдущей части, есть и ряд других
инструкций, которые могут быть полезны при
создании пакетного файла .BAT. Причем эти
инструкции, по сути, командами не являются,
они выполняют функции операторов в языках
программирования.
Одна из них — IF — классический
оператор, в том или ином виде
присутствующий практически в любом языке
программирования. Позволяет проверять
правильность условия, заданного
пользователем. Например, строка if exist readme.txt
echo There is a readme.txt file in the current directory выдаст
сообщение "There is a readme.txt file in the current directory"
в случае, если в текущей папке есть файл
readme.txt. Эту команду можно условно разделить
на три части: вызов команды (слово "IF"),
условие для проверки (в данном случае —
строка exist readme.txt, проверяющая наличие файла
readme.txt в текущей папке) и команда,
выполняемая, если условие соблюдено (здесь
это — echo There is a readme.txt file in the current directory). В
данном примере можно изменить имя файла и
команду, и он будет работать.
Большинство программ при закрытии
оставляют после себя какое-либо значение,
называемое возвращаемым, которое указывает
на результат работы приложения. Скажем,
если какая-либо софтина вырубилась с
возвращаемым значением -1, то, скорее всего,
имел место глюк или сбой. Инструкция if errorlevel
1 echo Errorlevel 1 напишет "Errorlevel 1", если
последняя запущенная программа возвратила
значение 1. Также при помощи IF можно
сравнивать числа и строки (при сравнении
используется двойной знак "равно", т.е.
"=="). Кстати, сравнивать можно и
параметры, с которыми был запущен командный
файл: первый параметр (до первого пробела)
обозначается знаком %1, второй — %2 и т.д.
Например:
echo off
if %1== hello echo Hello!
Командный файл, запущенный с параметром hello,
ответит аналогичной любезностью, т.е.
поздоровается. Первая строка — echo off —
отключает вывод на экран текущей строки
кода bat-файла перед ее выполнением.
Маленькое предупреждение: если параметров
не будет вообще, то ДОС не преминет об этом
сообщить.
К любому из выражений можно подставить
слово NOT, которое, как несложно догадаться,
заставляет инструкцию IF'а выполняться,
только если ее условие ложно. Простейший
пример выглядит так:
if exist command.com echo There is a command.com file in the current directory
if not exist command. com echo There is NO file named command.com in the current
directory
Какие действия он выполняет, по-моему,
вполне очевидно.
Помимо оператора условия IF, в командном
языке ДОС присутствует и оператор циклов FOR,
предназначенный для циклического
выполнения определенных инструкций. Правда,
интерпретация этой команды несколько
нестандартна — она имеет вид:
for %%A in (TXT CPP H EXE) do copy mygame.%%A C:\games\mygame
Не пугайтесь. На самом деле все достаточно
просто. Вышеназванная инструкция просто
скопирует файлы mygame.txt, mygame.exe, mygame.cpp, mygame.h из
текущей папки, если они там есть, в папку C:\GAMES\MYGAME.
Цикл выполняется следующим образом: вместо
параметра %%A или любого другого, стоящего
сразу после инструкции for, подставляется
первое слово из скобок после in, а затем
выполняется действие, стоящее после слова do,
затем на место %%A становится уже второе
слово из in'овских скобок и с результатом
выполняется то же действие и т.д. Например,
инструкция for %%FILE_NUMBER in (00 01 02) do del
noname%%FILE_NUMBER.obj удалит из текущей папки файлы
noname00.obj, noname01.obj, noname02.obj.
Зачастую при выполнении пакетного файла
возникает необходимость перейти от одной
части кода к другой, независимо от того,
раньше или позже она расположена, пропуская
все инструкции, стоящие между этими двумя
участками BAT'а. Это реализуется с помощью
команды goto. Чтобы обозначить нужный участок
кода, его нужно пометить знаком :x, где
вместо x стоит название метки. Например:
<…кусок кода…>
:metka
<…код метки…>
goto metka
В этом примере инструкции кода метки будут
выполняться ad infinitum, т.е. до бесконечности,
потому что каждый раз, когда команды будут
выполнены, указание goto metka заставит ДОС
снова вернуться к началу метки. В таких
случаях описанное безобразие прекращается
по нажатию на Ctrl-C или Ctrl-Break. Например, если
нужно напечатать какой-то документ в
нескольких экземплярах, можно
воспользоваться следующим кодом:
echo off
: print
echo A copy of readme.txt is being printed…
echo Press Ctrl-Break or Reset if when you get tired of this:-)…
copy readme.txt prn
pause
goto print
В данном случае DOS будет печатать документ
readme.txt, если, конечно, таковой имеется в
текущей папке, до полного истощения
расходников принтера и даже дальше;-).
Есть еще весьма примечательная команда SHIFT,
обеспечивающая сдвиг формальных
параметров относительно фактических.
Говоря по-русски, если пакетный файл был
вызван с тремя параметрами, например: view
readme.txt please, то формальному обозначению %1
изначально соответствует параметр view, %2
— readme.txt, %3 — please. После вызова
инструкции SHIFT %1 будет соответствовать
слову readme.txt, а %2 — please. После еще одного
вызова параметру %1 будет соответствовать
слово please, а если инструкция будет
выполнена еще раз, то вообще ничего не
останется8-].
И последняя часто употребляемая в BAT'ах
команда — exit. Если вы из одного пакетного
файла запустили другой, то без
использования этой команды обратно в
первый командный файл управление не
возвращается.
Ну вот мы и получили необходимый минимум
знаний о пакетных файлах. Теперь продолжим
начатую мной в прошлой статье тему —
команды ДОС. На этот раз обсудим инструкции,
используемые несколько реже, но тоже
достаточно полезные.
В прошлый раз, говоря о файловых операциях,
я забыл упомянуть команду RD (или RMDIR),
служащую для удаления папки. Ее параметр
— имя папки, а ключей нет.
Команды DATE и TIME выводят на экран текущую
дату и время соответственно, кроме того,
если задать им в качестве параметра новое
значение даты или времени, то системным
часам будут установлены введенные величины.
Зачастую приходится искать в текстовых
файлах какую-то строку. Сделать это можно с
помощью инструкции find. Первый ее параметр
— строка для поиска, второй — файлы, в
которых его требуется выполнить. Ключ /V
заставляет DOS выводить все файлы, НЕ
содержащие строку. Если нужно искать текст
без учета регистра символов,
воспользуйтесь ключом /I.
Команда sort, имеющая вид: sort <файл для
сортировки> > <файл конечного
результата> предназначена для сортировки
слов в текстовом файле в алфавитном порядке
и сохранения результатов в файл, указанный
после знака ">". Более подробно об
инструкциях find и sort можно узнать, набрав "find
/?" или "sort /?".
Чтобы узнать версию установленной ОС,
введите команду ver.
Команда format предназначена для
форматирования флоппи- или жесткого диска.
Ее параметр — имя диска. Ключ /Q включает
быстрое форматирование, занимающее
несколько меньше времени, чем стандартное,
и невозможное в случае, если диск никогда не
форматировался ранее. Весьма часто
используется ключ, задающий емкость диска
— /F:X, где вместо X ставится объем
форматируемого диска (e.g. 160, 320, 720 Кб, 1.2, 1.4 Мб).
Ключ /1 позволяет отменить двустороннее
форматирование, попробуйте использовать
его, если что-то глючит.
Если возникает необходимость перенести
системные файлы на какой-либо диск,
воспользуйтесь командой sys X:, где X: — диск
для переноса.
В следующий раз мы немного поговорим об
устройстве ДОС, Esc-последовательностях и
еще о множестве непонятных терминов,
значение которых я постараюсь объяснить8-).
А на сегодня все. До новых встреч!
Михаил Федотов, aka $ky$pe@R,
skyspear@tut.by
© компьютерная
газета