Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабораторныйПрактикум1.pdf
Скачиваний:
395
Добавлен:
02.02.2015
Размер:
4.76 Mб
Скачать

4.2. СЦЕНАРИИ (КОМАНДНЫЕ ИЛИ ПАКЕТНЫЕ ФАЙЛЫ)

Сценарии32 (командные (.CMD) или пакетные (.BAT) файлы) предназначены для последовательного выполнения команд, в них содержащихся. Сценарии являются текстовыми и имеют расширение

.CMD (Command). В ранних версиях DOS и Windows сценарии имели расширение .BAT (Batch), в линейке Windows NT (XP, 7…) используется расширенный набор команд, поэтому ввели новый тип, файлы которого не распознаются в старых системах, в новых системах сценарии .BAT выполняются наравне со сценариями .CMD. По умолчанию сценарии интерпретируются в режиме расширенной обработки.

Сценарии запускаются по имени, т.е. для примера, представленного ниже, нужно ввести «C.CMD» и нажать Enter. Сценарии можно запускать без указания расширения: «C», но если система обнаружит несколько исполняемых файлов разных типов с одним и тем же именем, то будет запущен первый найденный файл с учётом списка поиска типов, хранящихся в переменной окружения PATHEXT, т.е. если в этой папке будет файл C.EXE, то будет запущен он, а не C.CMD, так как в списке тип .EXE стоит перед типом .CMD.

Сценарии должны быть созданы (для кириллических версий

Windows) в кодировке 866, которая используется в консоли. Блокнот по умолчанию для текстовых документов использует кодировку 1251 или юникод. Кодировка (866 или 1251) не имеет значения, если сценарии не содержат символов национального алфавита, имеющих различное положение в кодировках. Набранный с использованием национальных алфавитов в блокноте текст в кодировке 1251 при выполнении сценария будет отображаться и выполняться неверно, особенно это касается имён файлов и папок.

Далее все примеры командных файлов запишите в журнал.

Создайте текстовый файл F:\C.CMD, запишите в него следующий перечень команд, затем запустите командный файл:

F: & CD \

MD \A1\B1\C1 \A1\B2\C2 \A1\B2\C3

32 RSDN. Урок bat-аники (http://www.rsdn.ru/?article/winshell/batanyca.xml) Командные файлы (http://white55.narod.ru/cmd.html)

54

DIR /B /OGN C:\WINDOWS\System32\*.EXE >F:\A1\B2\C3\DIR_C.TXT TYPE F:\A1\B2\C3\DIR_C.TXT |MORE

COPY F:\A1\B2\C3\DIR_C.TXT \A1\B1\C1 TREE /F F:\

При выполнении этого сценария отображаются последовательно как сами команды, так и их результаты. Сначала сценарий переходит в корень диска F: (две команды, объединённые &). Затем командой MD (в расширенном режиме) создаётся дерево папок. Причём, если на диске отсутствуют родительские папки для конечной папки списка, то они также создаются, у MD заданы три параметра – папки, которые будут созданы последователь так же, если бы команда MD вызывалась трижды

скаждым из них (разделителем списка могут быть пробел, запятая, точка

сзапятой). Далее сортированный список исполняемых файлов папки в краткой форме сохраняется в файл, который выводится на консоль и копируется в папку C1. В завершении сценария на консоль выводится дерево папок с файлами (ключ /F).

Командные файлы от просто списка команд отличаются возможностью применения простых алгоритмических выражений – условного оператора и цикла, а также возможностью передачи параметров. Для перехода внутри командного файла используется оператор GOTO и метка, которая является именем, начинающимся с двоеточия. Команда ECHO OFF отключает (ECHO ON включает) вывод команд пакетного файла на экран. Символ «@» подавляет вывод текущей команды на экран. Для вывода текста на экран используется команда ECHO с последующей строкой. Командные файлы могут содержать комментарии, которые не выполняются, описывают команды или временно блокируют выполнение команд. Строка комментария начинается командой REM (remark). В сценарии можно использовать локальные переменные и системные переменные окружения. Как было указано ранее, для получения значения переменной, её имя нужно поместить между символами процента. На экран значение переменной можно вывести командой ECHO. Так как символ процента является служебным, он не выводится командой ECHO, для отображения самого символа процента, его нужно дублировать, но записанные вплотную в процентах две переменные выведут объединённую строку без символов процента, несмотря на то,

55

что в строке присутствует последовательность из двух символов процента. Для вывода остальных служебных символов (&, |, >, <) перед ними нужно добавить «^» (каре), этот же символ, записанный последним в строке, переносит строку (продолжение, следующую часть) на следующую строку. Создайте новый файл F:\EH.CMD, запишите в него следующее содержимое и запустите на выполнение:

@ECHO OFF

ECHO Windows установлена в папку %windir%

ECHO %%HOMEDRIVE%%%%HOMEPATH%% --^> %HOMEDRIVE%%HOMEPATH%

Сценарии поддерживают работу с аргументами командной строки (аргументы записываются после имени, разделяемые пробелами, если в аргументе, например, в имени, присутствуют пробелы, то аргумент помещается в двойные кавычки). Внутри сценария доступ к аргументам осуществляется по номеру %0—%9. Аргумент %0 содержит имя и абсолютный путь самого сценария. Если аргументов больше, чем девять, то используется команда SHIFT, которая сдвигает аргументы на один влево, т.е. нулевой аргумент теряется, первый становится нулевым, второй первым и т.д. Перебрать все аргументы без использования сдвига позволяет оператор цикла FOR.

В сценариях можно обращаться как к глобальным переменным окружения, так и создавать собственные. Команда SET имя=значение задаёт значение переменной, команда SET /A выражение позволяет производить вычисления, а команда SET /P переменная=подсказка позволяет по ходу действия сценария ввести пользователю в консоли значение переменной (см. SET /?).

Для исследования работы сценариев с параметрами ниже рассмотрены варианты сценариев – аналогов команды (создание структуры папок):

MD \K2 & CD \K2 & MD A1 A2 A3 B1\C1 G2\E2 V3\X3\N3

Создайте файл F:\MT1.CMD с содержимым:

@ECHO OFF

CLS

MD \K2 :START

IF "%1"=="" GOTO END

56

MD "\K2\%1"

SHIFT GOTO START :END

TREE F:\

Запустите этот командный файл с параметрами:

F:\MT1.CMD A1 A2 A3 B1\C1 G2\E2 V3\X3\N3

Вы увидите, что отобразится дерево каталогов, в которое были добавлены структуры папок из перечня. Рассмотрите структуру командного файла. В файле присутствуют две метки – START и END, определяющие положение начала и окончания цикла. Оператор IF проверяет, задан ли первый параметр (оператором сравнения является два символа равенства «=»). Если параметр пуст, то производится переход на метку выхода. В теле цикла выполняется создание папки с именем, содержащимся в первом параметре в папке K2, затем командой SHIFT производится сдвиг параметров (второй параметр становится первым), и так продолжается до исчерпания параметров, пока первый параметр станет пустым. Для организации цикла в конце тела цикла производится переход на начало цикла командой GOTO START. После окончания цикла выводится дерево папок для контроля выполнения. Для рассмотрения следующего метода нужно очистить созданную структуру, выполните команду RD /S /Q \K2, запишите этот же сценарий с помощью оператора цикла под именем MT2.CMD:

@ECHO OFF

CLS MD K2

FOR %%i IN (%*) DO MD "K2\%%i"

TREE F:\

Запустите командный файл с параметрами:

F:\MT2.CMD A1 A2 A3 B1\C1 G2\E2 V3\X3\N3

Оператор FOR (см. FOR /?) позволяет перебрать список (аргументы, строки текстового файла, папки), помещая последовательно значения элементов в счётчик цикла, который обозначается одной латинской буквой (регистр большие/маленькие учитывается), перед которой стоит

два значка процента (%%i), с помощью модификаторов значение

57

переменной-счётчика цикла можно преобразовывать (см. FOR /?). После слова IN в скобках идет список аргументов (так как начинается с процента), в списке находятся все аргументы (маска *). После слова DO помещена команда, которую нужно выполнить для каждого значения счётчика цикла. В конце сценария для контроля выводится дерево папок.

Использование цикла позволяет решить следующую административную задачу: необходимо очистить папку временных файлов (при загрузке назначаемого профиля). Казалось бы, простая задача, но штатные команды DEL и RD не могут с ней справиться. Команда DEL может удалить все файлы, включая расположенные в подпапках (DEL /S /Q %TMP%\*), но сами папки при этом остаются. Команда RD справилась бы с задачей (RD /S /Q %TMP%), удалив папку со всем содержимым, но саму временную папку удалять нельзя. Можно записать универсальный сценарий ClFo.CMD (Clear Folder), который для заданной папки сначала в цикле удалит все подпапки с содержимым, затем все оставшиеся файлы и сценарий ClTMP.CMD (Clear TMP), который вызывает ClFo для папки временных файлов. В связи с высокой деструктивной способностью эти сценарии можете рассмотреть, но не набирать без надобности. Сценарий ClFo.CMD:

@ECHO OFF

REM Сценарий ClFo

IF "%1"=="" GOTO HELP IF "%1"=="/?" GOTO HELP

IF /I "%2"=="/R" ATTRIB –R –S –H "%~1\*" /S /D

REM Перебрать и удалить все подпапки во временной папке

FOR /D %%i IN (%1\*) DO RD /S /Q "%%i"

REM Удалить все оставшиеся файлы

DEL /S /Q /F %1\*

EXIT /B :HELP

ECHO Удаляет содержимое указанной папки ECHO Запуск: %~n0 имя_папки [/R]

ECHO Необязательный ключ /R позволяет удалять

ECHO файлы с атрибутами R/O, System, Hidden

И сценарий ClTMP.CMD:

@ClFo %TMP% /R

58

В сценарии ClFo сначала производится проверка на отсутствие аргумента или его соответствие «/?», в случае выполнения условия производится переход к области вывода справки о запуске сценария. В случае если планируется очищать папки, от файлов с атрибутами только чтение, скрытый, системный, то ключом /R в условном операторе IF командой ATTRIB производится сброс служебных атрибутов, ключ /I у оператора IF позволяет игнорировать регистр сравниваемый строк, поэтому можно одинаково использовать ключи /R или /r. Вставка в параметр %2 символа «~» %~2 удаляет обрамляющие кавычки, так как к строке добавляется подстрока и результат берётся в кавычки, иначе кавычки будут внутри пути. Оператор цикла FOR использует ключ /D, который указывает воспринимать все подстановочные знаки (*) в списке как папки, в результате в счётчик цикла будут присвоены по очереди имена всех подпапок (в папке, описанной первым аргументом), которые последовательно будут удалены командой RD. На случай, если какую то из подпапок не удалось удалить, команда DEL удаляет не только оставшиеся файлы в указанной папке, но в подпапках, если таковые имеются, что обеспечивает максимальное освобождение дискового пространства. В команде ECHO используется вывод аргумента %0 с расположенным между знаком процента и номером модификатором ~n, который выделяет из значения имя файла (см. CALL /?). Модификаторы параметра или счётчика цикла вставляются в них между символом процента и цифрой параметра или буквой имени счётчика цикла, список модификаторов приведен ниже в таблице:

~

переменная I раскрывается с удалением обрамляющих

 

кавычек (")

~f

(Fullpath) переменная раскрывается в полное имя файла

~d

(Disk) переменная раскрывается в букву диска

~p

(Path) переменная раскрывается в путь

~n

(Name) переменная раскрывается в имя файла

~x

(eXtension) переменная раскрывается в расширение файла

~s

(short) раскрытый путь содержит только короткие имена

~a

(Attribute) переменная раскрывается в атрибуты файла

~t

(Time) переменная раскрывается в дату/время файла

~z

(siZe) переменная раскрывается в размер файла

 

59

~$PATH: проводится поиск по каталогам, заданным в переменной среды PATH, и переменная раскрывается в полное имя первого найденного файла. Если указанная переменная среды не определена или в результате поиска не найден ни один файл, то этот модификатор заменяется на пустую строку.

При объединении модификаторов (тильда ~ вставляется один раз спереди) получаются комбинированные результаты: %~dp0 – переменная %1 заменяется только на имя диска и путь (в данном случае вернёт полный путь к файлу сценария, так как полный путь сценария содержится в параметре %0), %~nx1 – переменная %1 заменяется только на имя файла и его расширение. Модификаторы не могут использоваться вместе с оператором %* (все параметры).

Очистите структуру командой RD /S /Q \K2, запишите и рассмотрите сценарий создания дерева папок под именем MT3.CMD, который демонстрирует использование подпрограмм:

@ECHO OFF

CLS MD K2

FOR %%i IN (%*) DO CALL :MD "K2\%%i"

TREE F:\

EXIT /B :MD

MD %1

EXIT /B

Запустите командный файл с параметрами:

F:\MT3.CMD A1 A2 A3 B1\C1 G2\E2 V3\X3\N3

Подпрограмма – часть сценария, к которой можно многократно обращаться. Команда CALL используется для вызова других сценариев или подпрограмм внутри текущего сценария с возможностью передачи параметров. Подпрограмма вызывается по метке (метка начинается с двоеточия и обозначает позицию в сценарии, заметьте, то у оператора GOTO перед меткой двоеточие не ставится, т.к. GOTO работает только с метками, а CALL должен различать объект вызова – метку или внешний файл). Подпрограмма ведёт себя как отдельный сценарий, у неё своё окружение и параметры, так, первый параметр %1 при старте сценария

60

содержит данные, передаваемые при запуске сценария, внутри подпрограммы %1 (MD %1) данные, переданные оператором CALL после метки в командной строке ("K2\%%i", где счётчик цикла %%i заменяется конкретным значением). При выходе из подпрограммы оператором EXIT /B управление передаётся оператору, следующему за оператором CALL, вызвавшем подпрограмму. Использование оператора EXIT /B в основном тексте сценария завершает работу сценария.

Внутри сценария может использоваться команда PAUSE, которая останавливает работу сценария, выводит сообщение о необходимости нажатия клавиши для продолжения и ожидает нажатие клавиши. Часто PAUSE используется в сценариях, действие которых может нести деструктивные действия. Если пользователь запустил сценарий случайно, то в режиме паузы сценарий можно завершить клавишами Ctrl+C или

Ctrl+Break.

Для контроля ошибок используется переменная ERRORLEVEL – после выполнения команды содержит код ошибки (0, если ошибки нет). DATE и TIME – соответственно возвращают текущую дату и время. В качестве примера создайте файл F:\VAR.CMD, содержащий следующий текст:

@ECHO OFF

SET DP=%DATE%

IF NOT EXIST "\%DP%" MD "\%DP%" ECHO %TIME%>"\%DP%\PROC.TXT" TaskList /svc >> "\%DP%\PROC.TXT"

Запустите команду VAR. Если в корне диска F: отсутствует (IF NOT EXIST) папка, именем которой является текущая дата, то она создаётся, в ней создаётся файл PROC.TXT, в который записывается текущее время и дописывается информация об активных процессах системы. В сценарии имя папки хранится в переменной DP. Часто значение переменной DATE используется для создания папки сохранения состояния программ и/или архива текущего состояния документов. Формат даты по умолчанию (ДД.ММ.ГГГГ – день.месяц.год: 01.10.2013) неудобен для создания папок, так как при отображении сортированного списка подобных папок или файлов они будут расположены не в хронологическом порядке. Удобнее использовать формат даты ГГГГ.ММ.ДД (2013.10.01) или

61

краткий ГГММДД (131001), в этом случае сортированный список будет расположен в хронологическом порядке. Формат записи локальных переменных позволяет извлекать подстроку или заменять в строке одну подстроку другой (см. SET /?). Если %имя% возвращает значение переменной имя, то запись %имя:str1=str2% вернёт новую строку, которая образована из значения имя, в котором все вхождения подстроки str1 заменены на str2. Для извлечения части строки используется формат

%имя:~позиция,количество%, где позиция – количество пропускаемых символов значения переменной имя (может быть равно 0), а количество – количество возвращаемых символов. Если значение позиция отрицательно (нет –0, нумерация с единицы), то стартовый символ вычисляется с конца строки справа налево (но подстрока извлекается от позиции слева направо!). Если значение количество не указано, то извлекается подстрока до конца строки. Если количество отрицательно, то значение обозначает «кроме последних n символов», если с минусом указано абсолютное значение больше, чем символов в подстроке с позиции, то возвращается пустая строка. Создайте и запустите сценарий

VAR1.CMD:

@ECHO OFF

SET D0=%DATE%

SET D1=%D0:~6%%D0:~2,4%%D0:~0,2%

SET D2=%D0:~8%%D0:~3,2%%D0:~0,2% SET T=%TIME::=-%

SET T=%T:~0,-3%

ECHO %D0%

ECHO %D1%

ECHO %D2%

ECHO %T%

MD %D1%

ECHO Активен сеанс пользователя %USERNAME% > %D1%\%T%.TXT

В сценарии VAR1 переменной D0 присваивается строка значения текущей даты (например, 01.10.2013). Переменной D1 присваивается строка из трёх подстрок: %D0:~6% все символы после шестого (год) + %D0:~2,4% четыре символа, пропустив два (номер месяца с точками) + %D0:~0,2% два символа с начала строки (день). Аналогично составляется значение переменной D2 для даты в краткой форме. Нельзя создавать

62