Архивы: по дате | по разделам | по авторам

От печки

Архив
автор : Сергей Леонов   29.06.1998

При слове "программирование" большинство пользователей компьютеров сразу вспоминает про какой-либо язык: кто про Бейсик, кто про C++. Кому-то может показаться странным, но заняться программированием можно, и вовсе не имея никаких интерпретаторов и компиляторов. Конечно же, я имею в виду язык командного процессора, доставшийся в том или ином варианте всем операционным системам фирмы Microsoft по наследству от старушки MS-DOS, в отличие от имевшегося в DOS, но исчезнувшего из Windows Бейсика. Интерпретатором этого языка является командный процессор command.com (или cmd.com в Windows NT), умеющий выполнять не только команды, набранные на клавиатуре (это его основная функция), но и те, которые содержатся в текстовых файлах, имеющих обычно расширение .bat (от английского "batch"). Такие файлы обычно называют "командными" или "пакетными". Программы, написанные с использованием языка командного процессора, конечно, не могут состязаться с приложениями, созданными с использованием не только С++ или Delphi, но и с обычным Бейсиком, однако в бытовых условиях могут быть очень неплохим подспорьем, когда нужно выполнить множество рутинных ручных операций (да еще и не ошибиться при наборе команд на клавиатуре). А еще эффективнее может быть применение этих средств в сочетании с тем же Бейсиком или, например, электронными таблицами для подготовки самих командных файлов. Мало того, существует большое количество примеров написания сложнейших программ, в которых один из командных файлов генерирует текст другого, а тот - третьего… Так что все дело в фантазии.

Вот несколько элементарных примеров.

При работе с большим количеством приложений DOS приходится либо включать все каталоги этих приложений в PATH (для запуска одной единственной программы), либо создавать командные файлы, типа приведенного ниже word5.bat:

@ECHO off

c:\program\word5\word.exe %1

А следующий пример до сих пор спасает меня от необходимости осваивать десятипальцевый метод слепой печати на клавиатуре, и представляет собой набор команд для компиляции модулей на языке кросс-ассемблера микропроцессора 8051 (compile.bat):

@ECHO off

c:\c-51\bin\a8051.exe %1.msa %1.lst

c:\c-51\bin\xlink.exe %1.obj -f %1.xcl

В смысл этих команд вникать вовсе не обязательно, возможно, вам приходится набирать что-то совсем другое. А любой, достаточно ленивый по натуре пользователь, набрав пару раз такие строки, должен был бы уже и сам написать что-то подобное.

Еще один совершенно классический пример, это подмена команды, для того чтобы не забыть необходимые ключи (о ключе -d при распаковке архивов zip обычно вспоминают, когда все уже распаковано в одну большую "мусорную кучу", а сам архив удален). Со времен DOS 3.30 в моем каталоге с утилитами неизменно присутствует файл unzip.bat:

@ECHO off

c:\util\pkunzip -d %1

Можно назвать файл тем же самым именем, что и сама программа, но при этом путь к командному файлу должен быть записан в PATH раньше, чем путь к этой программе. Как очередной пример, мне вспоминается долго использовавшаяся мною версия редактора MultiEdit, постоянно оставляющая после своей работы временный файл с произвольным восьмибуквенным именем и пустым расширением. Когда мне надоело удалять эти файлы вручную, я набрал следующий файл (me.bat):

@ECHO off

c:\program\me\me.exe %1

del *.

Разумеется, назвать подобную систему обработки пакетных файлов "языком программирования" будет не совсем корректно, однако многие элементы такого языка здесь имеются. Рассмотрим их вкратце (для более любознательных можно рекомендовать команду help, документацию по DOS или ссылки в конце статьи).

Первым и основным оператором любого языка (по крайней мере, если судить по разного рода учебникам) является комментарий. В данном случае это команда REM.

Нет такого языка программирования, где не было бы переменных и оператора присваивания. Есть эти элементы и в языке командного процессора. Применяется четыре типа переменных:

- переменные окружения (environment), установка значения которых выполняется командой SET, а обращение к ним - с помощью синтаксиса %ИМЯ%;

- аргументы командной строки, имеющие символические имена от %0 до %9;

- системная переменная ERRORLEVEL (используется так же, как и переменные окружения), значение которой обычно устанавливается в 0 при нормальном завершении программы и принимает некоторое положительное значение при наличии ошибок;

- переменные цикла FOR, описание которых лучше прочесть в документации по DOS (если уж они вам понадобились - без описания все равно не обойтись).

Все переменные относятся к типу STRING (строковые значения), кроме ERRORLEVEL, являющейся байтовой.

Несмотря на такие ограничения в типах переменных, в Сети можно найти образцы программ на языке командного процессора, реализующие, например, десятичную арифметику, путем различных хитрых преобразований строк, состоящих из десятичных цифр!

Пожалуй, вторым по важности (да не обидятся на меня приверженцы структурных языков типа Паскаля) можно признать условный и безусловный операторы перехода и метки. И такая возможность тоже имеется. Метки предваряются двоеточием (кстати, двоеточие часто можно использовать в качестве замены оператора комментария, если в командном файле нет совсем или мало меток). Оператор безусловного перехода, он и в Африке - GOTO, а условный - как и обычно IF. Имеется три типа проверяемых условий: сравнение строковых переменных и констант, проверка значения ERRORLEVEL и проверка существования файлов. Для тех, кто решится программировать на языке командных файлов, сразу замечу, что при отладке программ с циклом на базе GOTO, внутрь цикла лучше вставить какую-либо команду (например DIR), иначе прервать программу в случае бесконечного выполнения будет невозможно.

Имеется и оператор цикла, однако, как уже упоминалось, подробности его применения лучше посмотреть в документации, так как они слишком велики для данной статьи.

Но, пожалуй, самое интересное то, что на подобном языке можно писать и некое подобие модульных программ, то есть существует оператор вызова процедуры (подпрограммы) с параметрами. В качестве такой процедуры используется опять же командный файл.

CALL имя

Мало того, этот вызов может быть рекурсивным! Количество вложенных вызовов ограничено объемом памяти (мне всегда было интересно - какой же именно, и всегда было недосуг проверить). Во всяком случае, под Windows NT сообщение "Insufficient Memory" было получено мною на 8307 вызове (test.bat), записавшем соответствующее количество строк в файл листинга:

@ECHO off

ECHO * >> test.lst

CALL test

В этой команде, а также при вызове пакетного файла из командной строки могут использоваться до девяти аргументов. Аргумент %0 существует всегда, и значением его является имя самого выполняемого файла.

К передаче параметров относится и еще одна замечательная команда: SHIFT. Она сдвигает все параметры, указанные при вызове командного файла на один влево, при этом первый (%0) теряется, второй становится первым и так далее. Теперь остается только сделать проверку на то, что очередной параметр представляет собой пустую строку, и можно обрабатывать произвольное их количество:

@ECHO off

:start

IF "%1"=="" GOTO finish

echo %1

SHIFT

GOTO start

:finish

Ну и, конечно, ввод/вывод. Если вы хотите вывести некоторый текст на экран, достаточно набрать команду

ECHO текст

При необходимости вывести этот текст в файл, команда модифицируется следующим образом:

ECHO текст > файл

или

ECHO текст >> файл

Первая создает файл с указанным именем (и замещает существующий), вторая добавляет текст к имеющемуся в указанном файле, а если такового нет, то сначала создает его. Разумеется, при выводе можно указывать и переменные, и параметры.

Эта же команда используется с параметрами off и on для подавления и обратного разрешения отображения выполняемых команд на экране, а используемый в примерах символ @ подавляет вывод на экран отдельной строки.

А вот со вводом данных дело обстоит гораздо хуже, а вернее, просто никак. Никаких механизмов для запроса к пользователю даже на уровне да/нет не существует. Впрочем, недостаток этот с лихвой компенсируется количеством имеющихся в сети программ типа "ask", задающих пользователю вопрос и устанавливающих соответствующее значение переменной ERRORLEVEL или другой. Да и написать такую - дело одной минуты для любого программиста. Есть, правда, команда PAUSE, которая останавливает выполнение, выводит сообщение "Press any key to continue…" и ждет нажатия на клавиатуру, но ничего передать в программу она не может.

Давно известное "народное" применение командных файлов - чистка диска от накапливающегося мусора. Всем известно, что при активном использовании системы, а тем более при периодических "зависаниях", на диске остается много временных, а то и просто незакрытых файлов. В домашних условиях такой "мусор" обычно удаляется вручную, а вот для администратора сети автоматизация удаления временных файлов может сократить пробегаемое за день расстояние от одного компьютера к другому на несколько километров. (Разумеется, такую процедуру лучше выполнять не в процессе работы, а при запуске системы.)

Итак, для начала выполним процедуру поиска так называемых потерянных кластеров. На мой вкус для этого вполне годится старый добрый chkdsk, который, хотя и не полностью проверяет диск, но быстр и не задает лишних вопросов.

chkdsk c: /f

Затем удалим "плоды" его работы, то есть файлы в корневом каталоге с расширением .chk:

del c:\*.chk

Удалим также временные файлы в специально для этого предназначенном каталоге системы:

del c:\%temp%\*.???

Здесь стоит отметить, что в данном случае три знака вопроса вовсе не аналогичны "звездочке", по той лишь причине, что шаблон "*.*" всегда выдает запрос на подтверждение удаления файлов, а в приведенном варианте удаление происходит тихо и незаметно.

Некоторые программы при нештатном завершении (а то и при штатном, как упомянутый выше MultiEdit) оставляют в корневом каталоге диска файлы с именем типа "abjhvndk" и пустым расширением. Так как других файлов с пустым расширением в корневом каталоге нет (это не относится к тем, кто использует Windows NT, там есть файл ntldr), можно включить в нашу программу и эту строку:

del c:\*.

У вас, вероятно, есть что чистить на диске и кроме этого, например, файлы кэша Internet Explorer'а, файлы с расширением tmp, те, имя которых начинается с "тильды" (~), или что-то еще - это дело вкуса и убежденности в том, что те или иные назойливо появляющиеся файлы вам действительно не нужны.

Лучшее место для этих команд - в файле autoexec.bat, а еще удобнее включить их в отдельный файл, а его вызвать из autoexec.bat через CALL.

Работая системным администратором, мне часто приходилось выполнять такие операции, как заведение учетных записей пользователей, создание для них персональных каталогов на сервере и тому подобное, причем одновременно для групп из 50-100 человек. Как обычно, импорт списка пользователей ничем не помогает, например, в Windows NT без дополнительных средств мне все равно приходилось бы набирать все имена вручную. Сколько при этом будет сделано ошибок, учитывая, что администратор обычно не имеет навыков профессиональной машинистки (не считая разве что команд Unix'а)? Между тем, список тех же имен и паролей обычно уже имеется в каком-либо виде, чаще всего как таблица Excel или Word. Дальше все просто: освобождаем необходимое количество столбцов и вписываем туда DOS-команду, например, для заведения пользователя в Windows NT это "net user", потом идут столбцы со списком имен и паролей, добавляем еще столбец с необходимыми ключами (в нашем случае это "/add") и копируем команды и ключи на всю высоту списка. Осталось только экспортировать таблицу в текстовый файл с использованием пробела в качестве разделителя, и дать ему имя, например adduser.bat. Теперь этот файл можно запускать на выполнение и спокойно идти курить или даже обедать. Вы будете избавлены как от ошибок набора, так и от ручной работы одновременно.

Не следует забывать, что интерпретация и порядок выполнения команд могут несколько отличаться от версии к версии (например, для DOS 6.22 и Windows NT).

Таким образом, практически любой юзер может гордо сказать, что занимался в своей жизни и столь серьезным делом, как программирование.

Для тех, кто заинтересуется языком командных файлов, можно рекомендовать заглянуть, к примеру, на странички
gearbox.maem.umr.edu/~batch
www.uxbinfo.com/412
garbo.uwasa.fi/pc/batchutil.html
gatsby.tafe.tas.edu.au/batch,
где имеется как подробное описание языка, так и большое количество примеров и готовых утилит.

© ООО "Компьютерра-Онлайн", 1997-2021
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.