
- •Лабораторная работа №1 Теоретическая часть
- •Основные конструкции языка
- •Передача управления указанному командному файлу. После окончания выполнения вызываемого файла управление будет возвращено на строку, следующую за командой call.
- •Передача управления на указанную функцию в пределах исполняемого в данный момент командного файла.
- •Передача управления на метку
- •Сравнение двух операндов (строк или чисел)
- •Проверка существования файла
- •Проверка результата завершения последней отработавшей программы
- •Сдвиг влево переменных типа % на указанное число позиций
- •Манипуляция значением переменной
- •Лабораторная работа №1 Практическая часть
- •Лабораторная работа № 1 Задание для самостоятельной работы
- •Содержание отчета
Лабораторная работа №1 Теоретическая часть
Цель работы: Изучение языка пакетных командных файлов (Batch Script).
Основные конструкции языка
Передача управления указанному командному файлу. После окончания выполнения вызываемого файла управление будет возвращено на строку, следующую за командой call.
Формат вызова:
CALL <имя файла> <список параметров>
Возврат из вызываемого файла:
EXIT <код завершения>
Пример использования:
CALL backup.bat C:\MyDocuments\*.* C:\Backups\MyDocuments.rar
Передача управления на указанную функцию в пределах исполняемого в данный момент командного файла.
После окончания выполнения функции управление будет возвращено на строку, следующую за командой вызова функции.
Внутри функции доступ к переданным в неё параметрам осуществляется через переменные %1 - %9.
Результат выполнения функции передается в переменную %ERRORLEVEL%.
Формат вызова:
CALL :<имя функции> <список параметров>
Возврат из функции:
EXIT /B <возвращаемое значение>
Пример использования:
REM Устанавливаем значения операндов
SET OP1 = 2
SET OP2 = 3
SET OP3 = 5
REM Вызываем функцию с именем SUM с параметрами OP1, OP2 и OP3
CALL :SUM %OP1% %OP2% %OP3%
REM Выводим на экран результат работы функции
ECHO RESULT = %ERRORLEVEL%
PAUSE
EXIT
REM Заголовок функции SUM
:SUM
REM Выводим на экран значения переданных в функцию параметров
ECHO OPERANDS: %1 %2 %3
REM Суммируем параметры и помещаем результат в переменную RESULT
SET /A RESULT = %1 + %2 + %3
REM Выходим из функции с результатом, хранящимся в переменой RESULT
EXIT /B %RESULT%
Очистка экрана
Формат вызова:
CLS
Управление режимом отображения команд при их исполнении
Формат вызова:
ECHO ON – включение отображения команды перед её вызовом
ECHO OFF – выключение
@<команда> – выключение режима только для указанной команды
Пример использования:
@CALL :SUM
@ECHO OFF
Вывод строки текста
Формат вызова:
ECHO <строка> | %<имя переменной>%
Пример использования:
ECHO Hello, %USERNAME%
Данная команда выведет на экран строку Hello, и имя текущего пользователя системы
Оператор цикла
Осуществляет многократный вызов команды (или блока команд).
Обратите внимание, что внутри цикла имя переменной должно предваряться символами %%, в то время как в остальных конструкциях языка имя переменной должно обрамляться символами % с двух сторон.
Формат вызова для перебора всех элементов файловой системы, соответствующих указанному шаблону:
FOR [ /D | /R [<путь>] ] %%<имя переменной> IN (<шаблон имени файла>) DO <команда или блок>
/D – перебор имен каталогов вместо имен файлов
/R – перебор всех файлов (или каталогов, если в качестве шаблона указан символ . ) начиная с каталога по указанному пути (или, если путь не указан, начиная с текущего каталога) и во всех его подкаталогах
Пример использования:
FOR %%FILE IN (*.doc) DO @ECHO %%FILE
Выведет на экран перечень всех файлов с расширением .DOC
Формат вызова для перебора значений с начального по конечное, с указанным шагом:
FOR /L %%<имя переменной> IN (начало,шаг,конец) DO <команда или блок>
Пример использования:
FOR /L %%I IN (1,2,10) DO @ECHO %%I
Выведет на экран числа 1,3,5,7,9
Формат вызова для обработки содержимого всех файлов в <наборе>, либо значения, содержащегося в <строке>, либо набора строк, возвращаемого после выполнения <команды>.
Обработка осуществляется в соответствии с правилами, определяемыми ключевыми словами, разделенными пробелами, в строке <ключи>.
FOR /F ["ключи"] %переменная IN (набор-файлов) DO команда [параметры]
FOR /F ["ключи"] %переменная IN ("строка") DO команда [параметры]
FOR /F ["ключи"] %переменная IN ('команда') DO команда [параметры]
Ключи могут быть следующими:
Прекращать обработку строки при появлении в ней указанного символа:
eol=<символ окончания строки>
Не обрабатывать первые n строк:
skip=<число пропускаемых строк в начале обработки каждого блока данных
Указать символы, которые обозначают границы колонок данных:
delims=<набор символов, обозначающих разделители колонок данных (по умолчанию разделителями являются символ пробела и табуляции)
Указать колонки данных, которые следует передавать в тело цикла:
tokens=порядковые номера колонок данных для каждой строки, которые будут переданы в тело цикла при каждой итерации, или символ * (звездочка).
В случае использования символа * в тело цикла будут передаваться все символы вплоть до конца строки.
Порядковые номера могут быть указаны диапазонами типа m-n (то есть от колонки с номером m до колонки с номером n).
Данные первой колонки передаются в переменную, указанную при описании цикла, данные последующих колонок передаются в автоматически создаваемые переменные, по следующему принципу: например, переменная цикла - %A, тогда вторая колонка попадет в переменную %B, третья - в %C и т.д.
Пример использования №1:
FOR /F "skip=2 eol=; tokens=2,4-5,* delims=, " %%I IN (*.txt) DO @ECHO %%I %%J %%K %%L
Будут обработаны все строки, за исключением двух первых, из каждого файла с расширением txt.
Из обрабатываемых строк будут выделены колонки данных, разделяемые символами пробел и запятая.
В тело цикла будут переданы колонки № 2, 4, 5 и все последующие. Из значения для каждой строки будут помещены в переменные I, J, K, L и выведены на экран командой ECHO.
Пример использования №2:
FOR /F " tokens=1,2 delims=," %%I IN ("Putin, Vladimir, Vladimirovich") DO @ECHO %%J %%I
Будет выведено: Vladimir Putin
Пример использования №3:
@ECHO OFF CHCP 1251
SETLOCAL EnableDelayedExpansion
FOR /F "skip=5 tokens=1,5" %%I IN ('dir') DO (
SET /A LINE_NO=LINE_NO + 1
>>Result.txt @ECHO Строка #: !LINE_NO! Данные: %%I %%J
)
Команда CHCP1251 включает режим обработки текстовых данных в кодировке 1251.
Команда SETLOCAL EnableDelayedExpansion включает режим развертывания значения переменных во время выполнения кода (позднее развёртывание), а не в момент запуска скрипта (раннее развертывание), как это действует по-умолчанию. Для использования режима позднего развёртывания переменная должна быть заключена в знаки !, а не %.
Команда DIR выводит следующее:
C:\Users\User>dir
Том в устройстве C не имеет метки.
Серийный номер тома: 2CFE-B0B6
Содержимое папки C:\Users\User
23.10.2011 10:51 <DIR> .
23.10.2011 10:51 <DIR> ..
15.10.2011 13:21 39 file1.txt
15.10.2011 13:21 7 file2.txt
Приведенный цикл будет обрабатывать все строки, которые выдает команда DIR, за исключением первых пяти. При обработке команда FOR будет из каждой строки выделять колонки, которые отделены друг от друга символами пробела или табуляции. В данном примере будут взяты колонки №1 (дата) и %5 (имя файла).
Команда SET /A LINE_NO=LINE_NO + 1 будет увеличивать значение переменной LINE_NO при каждой итерации цикла на единицу.
Команда >>Result.txt @ECHO Строка #: !LINE_NO! Данные: %%I %%J будет выводить в файл Result.txt строки вида Строка #<номер строки> Данные: <дата> <имя файла>.
Обратите внимание на то, что переменная LINE_NO обрамлена символами !. Если бы она была обрамлена символами %, то конструкция %LINE_NO% была бы заменена значением переменной LINE_NO в момент запуска скрипта и при всех итерациях цикла не менялась.