Переменные. Команда set
Переменной называется поименованное значение. Для объявления переменной и одновременно для присвоения ей значения применяется команда set. Пример записи этой команды показан на следующем листинге.
rem Компилятор хел-пфайлов в формате CHM
set help_compiler= C:\Program Files\HTML Help Workshop\hhc.exe
Для извлечения значения переменной ее имя помещают между двумя знаками процента, как показано ниже.
rem Компилятор хелп-файлов в формате CHM
set help_compiler= C:\Program Files\HTML Help Workshop\hhc.exe
rem Проект хелп-файла модуля "Склад"
set store_hpj=”Z:\store.hpj”
rem Проект хелп-файла модуля "Продажи"
set sales_hpj=”Z:\sales.hpj”
rem Компилируем хелп-файлы
%help_compiler% %store_hpj%
%help_compiler% %sales_hpj%
Данный пример показывает, в чем польза переменных.
Во-первых, они позволяют вместо длинного фрагмента (например, пути к компилятору хелп-файлов) использовать внутри командного файла синонимичный ему короткий – это удобно.
Во-вторых, они позволяют избежать повторения в тексте командного файла фрагментов, которые в дальнейшем могут меняться.
Параметры командного файла тоже являются переменными, но от обычных переменных отличаются тем, что их значения задаются при запуске командного файла. В дальнейшем, говоря о переменных, в особенности о работе с их значениями, мы будем иметь в виду и параметры командного файла тоже, во всяком случае, в отсутствие явных оговорок на это счет.
При написании командных файлов часто применяют следующий прием: несколько значений переменных указывают рядом (или перемежая их какими-либо символами или строками), так, чтобы получить некоторое новое осмысленное значение.
Пример:
rem Путь к компилятору хелп-файлов
set help_compiler=" C:\Program Files\HTML Help Workshop\hhc.exe "
rem Путь к каталогу, в котором находятся проекты хелп-файлов
set project_path=”Z:\<ваша_папка>\help”
rem Вызываем компилятор для обработки конкретного проекта,
rem имя которого передаем в первом параметре
%help_compiler% %project_path%\%1.hpj
Проверка условий и выбор вариантов. Команды if и goto
Команда if позволяет выделять в командном файле группы команд, которые выполняются или не выполняются в зависимости от определенных условий. Для чего это нужно?
Проверка условия — почти необходимая мера при создании командных файлов, использующих параметры. Перед тем, как начинать работу, командный файл, вообще говоря, должен удостовериться в том, что ему передан корректный набор параметров. В противном случае велик риск, что он выполнится неверно или безрезультатно, а пользователю останется только гадать, в чем же проблема. Более того, если командный файл удаляет, перемещает или перезаписывает какие-либо данные, то при некорректных параметрах он может даже нанести ущерб.
На следующем примере показан уже знакомый вам командный файл компиляции хелп-файла. В начало командного файла добавлена проверка первого параметра на непустоту. Обратите внимание на такую особенность синтаксиса: для операции сравнения используется сдвоенный знак равенства. Если первый параметр оказывается непустым, срабатывает команда goto, которая «перебрасывает» командный процессор к указанной метке. В данном случае имя этой метки compile. Обратите внимание, что там, где метка находится, ее имя предваряется двоеточием, а в команде goto нет. При пустом первом параметре командный процессор переходит к следующей строке, которая выдает сообщение об ошибке. А потом к следующей, которая перебрасывает его в самый конец файла к метке с именем finish.
@echo off
rem Проверяем, задан ли параметр
if not "%1"=="" goto compile
rem Если параметр пуст, выдаем сообщение об ошибке
echo Не указано имя проекта хелп-файла
rem и переходим в конец командного файла
rem к метке finish
goto finish
rem Это метка с именем compile
:compile
rem Ниже расположены команды компиляции
rem Путь к компилятору хелп-файлов
set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe"
rem Путь к каталогу, в котором находятся проекты хелп-файлов
set project_path=”Z:\<ваша_папка>\help”
rem Вызываем компилятор для обработки конкретного проекта,
rem имя которого передаем в первом параметре
%help_compiler% %project_path%\%1.hpj
rem Это метка с именем finish
:finish
Предложенный способ проверки параметра не самый удачный.
Во-первых, если пользователь по ошибке укажет в качестве параметра имя несуществующего файла, командный файл этим удовлетворится и предпримет попытку компиляции. Более правильный способ — проверить, существует ли такой файл в действительности. Для этого в языке команд MS-DOS предусмотрено специальное слово exist. Поэтому лучше было бы написать: if exist %1.hpj goto compile.
Во-вторых, активное использование команды goto (т.н. безусловного перехода) и меток сильно запутывают код. Технически они ничем не плохи, но отлаживать и сопровождать командный файл, написанный в таком стиле, довольно неудобно. Поэтому программисты издавна считают безусловный переход приемом нежелательным. Ниже показан более правильный, с точки зрения стиля программирования, структурированный вариант, в котором используется конструкция if…else. Работает она так: если условие истинно, выполняются команды в скобках после if, а если ложно, то в скобках после else.
@echo off
rem Проверяем, задан ли параметр
if not exist %1.hpj (
rem Если параметр пуст, выдаем сообщение об ошибке
echo Такого проекта хелп-файла не существует.
) else (
rem Ниже расположены команды компиляции
rem Путь к компилятору хелп-файлов
set help_compiler=" C:\Program Files\HTML Help Workshop\hhc.exe"
rem Путь к каталогу, в котором находятся проекты хелп-файлов
set project_path=”Z:\<ваша_папка>\help”
rem Вызываем компилятор для обработки конкретного проекта,
rem имя которого передаем в первом параметре
%help_compiler% %project_path%\%1.hpj
)
Приведем еще один пример работы с проверками. Следующий командный файл создает каталог с именем help-files (предположим, для выгрузки в него скомпилированных хелп-файлов). При этом, если каталог с таким именем уже существует (и в нем, вероятно, находятся старые хелп-файлы, которые не хотелось бы терять: вдруг новые окажутся хуже?), командный файл присваивает ему расширение bak. Но если каталог help-files.bak уже существовал, то командный файл его удаляет (будем считать, что одной резервной копии нам хватит).
if exist help-files.bak rd help-files.bak
if exist help-files ren help-files help-files.bak
md help-files