DOS - долгожитель среди операционных систем. Часть 2

Автор: Михаил Федотов, aka $ky$pe@R

Если вы читали прошлую статью, то, должно быть, помните, что я там рассказывал о некоторых командах ДОСа и их использовании в пакетных файлах. С этим я тогда немного забежал вперед, так как 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-). А на сегодня все. До новых встреч!

Источник: http://www.nestor.minsk.by/kg/

вернуться назад

Рейтинг www.nvkz.net