Организация в пакетных файлах проверки условий и циклов
Команда If
Обработка условий в пакетных программах.
Синтаксис
if [not] errorlevel число команда [else выражение]
if [not] строка1==строка2 команда [else выражение]
if [not] existимя_файла команда [else выражение]
Параметры
not - задает выполнение команды только в случае невыполнения условия.
errorlevel число - условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа.
команда - команда, которая должна быть обработана в случае выполнения условия.
строка1==строка2 - условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки.
exist имя_файла - условие выполняется, если существует файл с именем имя_файла.
оп_сравнения - трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.
Оператор | Описание |
EQU | равно |
NEQ | не равно |
LSS | меньше |
LEQ | меньше или равно |
GTR | больше |
GEQ | больше или равно |
Если расширения командного процессора разрешены, следует использовать также следующий синтаксис:
if [/i] строка1 оп_сравнения строка2 команда [else выражение]
if cmdextversion число команда [else выражение]
if defined переменная команда [else выражение]
Параметры
/i - сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел.
cmdextversion число - условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены).
defined переменная - условие выполняется, если переменная определена.
выражение - команда и все ее параметры для обработке в командной строке при выполнении оператора else.
· Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
· Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
· Использование команды defined переменная
При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.
%errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение.
В следующем примере показано использование значения errorlevel после выполнения пакетной программы:
goto answer%errorlevel%
:answer0
echo Код возврата программы равен 0
:answer1
echo Код возврата программы равен 1
goto end
:end
echo Готово!
Операторы сравнения оп_сравнения также можно использовать следующим образом:
if %errorlevel% LEQ 1 goto okay%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.
%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.
· Использование оператора else
Оператор else должен размещаться в той же строке, что и команда if.Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:
IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. отсутствуетПримеры
Если файл Product.dat не удается найти, появится следующее сообщение:
if not exist product.dat echo Не найден файл данных
Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:
if exist c:mydir\nul goto process
Оператор if и команду echo можно использовать в одной командной строке: Например:
if exist *.rpt echo Отчет получен.
Команда For
Запуск некоторой команды для каждого файла из заданного множества.
Синтаксис
for {%переменная|%%переменная} in (множество) doкоманда [ПараметрыКоманднойСтроки]
Параметры
{%переменная|%%переменная} - обязательный параметр. Замещаемый параметр. Используйте %переменная для выполнения команды for из командной строки. Используйте %%переменная для выполнения команды for в пакетном файле. Переменные учитывают регистр и могут быть представлены со значением альфа, например, %A, %B или %C.
(множество) - обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными.
команда - обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр (множество).
ПараметрыКоманднойСтроки - задает параметры командной строки, которые используются с указанной командой.
· Использование программы for
Команда for может быть использована в пакетном файле или непосредственно из командной строки.
· Использование параметров командной строки пакетного файла
Перечисленные ниже атрибуты применяются к команде for.
· В команде for переменная %%переменная (или %%переменная) будет заменяться текстовой строкой из заданного параметра множество, пока параметр команда не обработает все файлы этого множества.
· Имена параметров переменная команды for учитывают регистр буквы, они являются глобальными и одновременно может быть активно не больше 52 переменных.
· Для обозначения параметра переменная можно использовать любые символы, кроме цифр 0–9, чтобы не было конфликта с параметрами пакетных файлов %0–%9. Для простых пакетных файлов вполне достаточно обозначений с одним символом, например %%f.
· Задание множества файлов
Параметр множество может представлять группу файлов или несколько групп файлов. Для задания групп файлов можно использовать подстановочные знаки (* и ?). Следующие множества файлов являются допустимыми:
(*.doc)
(*.doc *.txt *.me)
(jan*.doc jan*.rpt feb*.doc feb*.rpt)
(ar??1991.* ap??1991.*)
· Когда используется команда for, первое значение в параметре множество заменяет параметр %%переменная (или %переменная), а затем для обработки этого значения выполняется указанная команда. Это продолжается до тех пор, пока не будут обработаны все файлы (или группы файлов), которые соответствуют значению параметра множество.
· Использование ключевых слов in и do
· In и do не являются параметрами, но они требуются для работы команды for. Если какое-то из слов пропущено, на экран будет выведено сообщение об ошибке.
· Использование дополнительных форм команды for
Если расширения командного процессора разрешены (по умолчанию), то поддерживаются следующие дополнительные формы команды for.
· Только каталоги
Если параметр множество содержит подстановочные знаки (* и ?), команда, указанная в параметре команда, выполняется для каждого каталога (кроме множества файлов в указанном каталоге), совпадающего с параметром множество. Используется следующий синтаксис.
for /D {%% | %}переменная in (множество) doкоманда [ПараметрыКоманднойСтроки]
· Рекурсивная
Проходит по дереву каталогов с корнем в [диск:]путь, выполняя инструкцию for для каждого каталога в дереве. Если после ключа /R не задан каталог, предполагается текущий каталог. Если параметр множество задано одной точкой (.), то команда просто перечислит каталоги в дереве. Используется следующий синтаксис.
for /R [[диск :]путь] {%% | %}переменная in (множество) doкоманда [ПараметрыКоманднойСтроки]
Дополнительную информацию по команде forможно получить с помощью справки.
Практическое задание
2.1. Запустите консоль командной строки. Перейдите в ваш рабочий каталог и создайте каталог Lab2.
2.2. Создайте пакетный файл, выполнив команду copyили с помощью файлового менеджера (Far, Total Commander).Имя файла задайте сами, расширение его должно быть .bat или .cmd,например My.bat. Наберите текст пакетного файла, выводящего сообщение из трех строк на экран с пустыми строками до и после него:
echo off
echo.
echo Эта пакетная программа
echo демонстрирует работу
echo команды echo
echo.
2.3. Сохраните файл - нажмите Ctrl+Z.
2.4. Запустите файл на выполнение, набрав в командной строке его имя.
2.5. Рассмотрим использование команд rem, pause, goto и меток. В этом примере все файлы с диска A копируются в текущий каталог. После этого на экран выводится запрос вставить другой диск в дисковод А, затем команда pause приостанавливает работу программы, чтобы пользователь мог сменить диск и нажать любую клавишу для продолжения процесса. Данная пакетная программа работает как бесконечный цикл. Команда goto begin возвращает управление на начало командного файла. Для завершения работы этой пакетной программы требуется нажать комбинацию CTRL+C и Y. Создайте и выполните пакетный файл, приведенный ниже:
@echo off
rem It is comment!
:begin
copy a:*.*
echo Please put a new disk into drive A
pause
goto begin
2.6. Рассмотрим использование параметров командной строки. Создадим файл для копирования содержимого одной папки в другую. Каждый раз, запуская файл, мы можем задавать новые папку-источник и папку-приемник. Например, для копирования содержимого из папки Folder1 в папку Folder2, где параметр %1 заменяется на значение Folder1, а параметр %2 — на значение Folder2. Новый файл будет состоять из одной строки:
xcopy %1\*.* %2
2.7. Если мы сохраним его под именем my3.cmd, то для запуска файла нужно ввести:
my3.cmd C:\folder1 D:\folder2
Результат будет таким же, как и при записи в пакетный файл строки:
xcopy C:\folder1 \*.* D:\folder2
Выполните запуск данного файла, указав реальные параметры, и убедитесь в правильности его работы.
2.8. Рассмотрим использование команд shift, ifи собственные переменные окружения.
В следующем пакетном файле Mycopy.bat показано, как использовать команду shift с произвольным числом пакетных параметров. Файл копирует набор файлов в заданный каталог. Пакетные параметры представлены аргументами имени файла и каталога. Для фиксации значения первого параметра используется собственная переменная todir.
MYCOPY.BAT копирует произвольное число файлов в задаваемый при запуске каталог.Используется следующий синтаксис:mycopy каталог файл1 файл2 ... Создайте следующий пакетный файл:@echo offset todir=%1:getfileshiftif "%1"=="" goto endcopy %1 %todir%goto getfile:endset todir=echo EXIT!Можно также использовать в команде shift ключ /n, который указывает команде начинать сдвиг с n-го аргумента, где n — число от нуля до восьми. При использовании shift /2 нет необходимости использовать переменную todir. Например: