Федерального государственного бюджетного образователь



Скачать 318.6 Kb.
Pdf просмотр
страница2/3
Дата28.11.2016
Размер318.6 Kb.
Просмотров628
Скачиваний0
1   2   3
set без параметров, то в окне отобразятся значения всех переменных среды для текущего сеанса командного окна.
Для определения новой переменной среды команду set необходимо ис- пользовать в виде:
SET переменная=строка
где
переменная
- имя новой (или переопределяемой) переменной среды, а
стро-
ка
задает строку символов, присваиваемую указанной переменной.
Например, командная строка
SET FileName=tmp.dat
создает переменную FileName, принимающую значение tmp.dat.
Значение, присвоенное какой-либо переменной, доступно для обработки в ко- мандных файлах, при использовании ее имени, заключенного в знаки процента - %.
Например команда выдачи текста на дисплей ECHO в виде:
rem Выведет строку FileName
echo FileName
rem Выведет значение переменной FileName - tmp.dat
echo %filename%
Чтобы удалить переменную среды, команду set необходимо вызвать в виде:
set имя_переменной=
Например:
rem удаляем переменную среды FileName
set FileName=
Если имя переменной не найдено в текущей среде, то при возврате команда
set
имя_переменной установит значение специальной переменной среды
errorlevel
равным 1. Это свойство можно использовать в командных файлах для определения наличия определенной переменной. Из последнего примера видно, что имена переменных для Cmd.exe регистронезависимы.
Значение некоторых полезных на практике переменных среды по команде set
не выдаются. В основном, это переменные, принимаемые значения которых динами- чески изменяются, их перечень приведен в таблице 5:
Таблица 5. Динамически изменяемые переменные среды
Имя переменной
среды
Описание
%CD%
Принимает значение строки текущего каталога
%DATE%
Принимает значение текущей даты
%TIME%
Принимает значение текущего времени
%RANDOM%
Принимает значение случайного десятичного числа в диапазоне 1-32767.
%ERRORLEVEL%
Принимает текущее значение кода завершения команды или скрипта ERRORLEVEL
%CMDEXTVERSION%
Принимает значение версии командного процессора
CMD.EXE для расширенной обработки команд.

%CMDCMDLINE%
Принимает значение строки, которая вызвала командный процессор
В связи с тем, что переменные среды хранят преимущественно строковую информацию, для работы с подобными переменными характерны специфичные операции поиска, замены, удаления подстрок. Командный интерпретатор предос-

13
тавляет встроенные средства поддержки подобных операций в команде set. На- пример, следующая команда:
set переменная1=%переменная2:строка1=строка2%
присвоит переменной1 измененное значение переменной2. Команда найдет в пе-
ременной2
все вхождения строки1, заменит их на содержимое строки2 и преоб- разованное таким образом значение переменной2 будет присвоено переменной1.
Рассмотрим пример

@echo off

set s1=one two three one two three

set s2=%s1:one=four%

set s3=%s1:two=%

echo %s2%

echo %s3%
В результате получим на экране
four two three four two three
one three one three
Если значение строки должно формироваться как конкатенация (объеди- нение) двух и более других строк, то их достаточно записать последовательно друг за другом:

@echo off

set s1=one

set s2=two

set s3=%s1% %s2%

echo %s3%
В результате получим на экране
one two
Еще одна интересная возможность – копирование подстроки. Для этого команду set необходимо вызывать в виде:
set переменная1=%переменная2:
m,n%

Эта команда возьмет значение второй указанной переменной (переменная2),
вырежет из него подстроку длиной n символов начиная с (m+1)-гo и запишет ре- зультат в первую переменную (переменная1).
@echo off
set d=12.12.2012
set month=%d:
3,2%

set year=%d:
6,4%

set hour=%time:
0,2%

echo %month%
echo %year%
echo %hour%
Значением переменной month будет значение месяца, а year - года из даты, хранящейся в переменной d в формате dd.mm.yyyy. Значение переменной hour
выделяем из переменной окружения %time%.
Зачастую информация, подлежащая хранению и обработке, должна быть представлена в числовом виде. Например, если потребуется подсчитать суммар-

14
ный размер, занимаемый файлами в папке, или для подсчета количества запущен- ных процессов. В этом случае команду set необходимо использовать с ключом /A.
set /А переменная=выражение
Использование ключа /A означает, что стоящая справа от знака равенства строка является числовым выражением, значение которого необходимо вычис- лить. Численные значения для команды set — это десятичные числа, кроме чисел с префиксами 0x для шестнадцатеричных чисел и 0 для восьмеричных чисел. Та- ким образом число 20 можно представить как 0x14 и 024.
Например, если задать команду
SET /А Sum=5+6
то значение переменной Sum будет равно одиннадцати.
Все операторы, поддерживаемые командой set, приведены в таблице 6.
Строки таблицы отсортированы в порядке убывания приоритета.
Таблица 6. Операторы, поддерживаемые при арифметических вычислени- ях командой set.
Оператор
Выполнение оператора
( )
Группировка
* / % + -
Арифметические действия
<< >>
Логический перенос
&
Поразрядное И
^
Поразрядное исключающее ИЛИ
|
Поразрядное ИЛИ
= *= /= %= += -= &= ^= |= <<= >>=
Операторы присваивания
,
Разделитель выражения
В связи с тем, что такие знаки как % >> << & | функционально ”перегру- жены” (используются для обозначения нескольких операций в разных контекстах использования), то при их использовании необходимо заключить строку выраже- ния в кавычки.
Если в выражении встречается строка, не являющаяся числовой лексемой, то оно будет интерпретирована как имя переменной среды, команда set преобра- зует ее значение в числовую форму и использует в выражении для формирования результата. Если в выражении используется переменная с именем, не определен- ным в текущем сеансе командной строки или это значение не может быть преоб- разовано в числовую форму, то вместо нее подставляется нулевое значение. Это позволяет использовать переменные среды в арифметических выражениях без об- рамления их имен знаками %. Следующий пример иллюстрирует выполнения арифметических операций с переменными среды.
@echo off

set a=5

set b=25

set /a c=b/a+tmpVar

set c
В результате выполнения новой переменной среды c будет присвоено зна- чение 5, и на экран будет выведено ее значение (а также всех переменных среды,

15
начинающихся с символа с). Переменная tmpVar не была определена, поэтому ее значение при вычислении значения выражения будет принято за 0.
Значение переменной можно задать и как результат работы команды. Так можно получить серийный номер тома текущего диска:
@echo off
vol | find “:” >out.tmp
set /p var=
set serial=%var:
22,9%

del out.tmp
echo %serial%
Использование параметров командной строки
Вызов командных файлов можно параметризовать. Под этим подразумева- ется вызов командного файла с передачей ему от одного до нескольких парамет- ров. В таком случае скрипт, помещенный в командный файл, может обрабатывать различную информацию при разных параметрах вызова, делая его гибче и адап- тированнее нуждам оператора. Например, командный файл архивирования фай- лов в некоторой папке может получать имя обрабатываемой папки из параметров вызова и тогда его можно применять к различным папкам, а не к одной, имя кото- рой жестко прописано в коде командного скрипта.
Для доступа к параметрам командной строки в командном файле приме- няются символы %0, %1,…,%9. При этом вместо %0 всегда подставляется имя выполняемого пакетного файла, а вместо %1, %2,…, %9 — значения первых де- вяти параметров командной строки соответственно Если в командной строке при вызове пакетного файла задано меньше девяти параметров, то "лишние" перемен- ные из %1 - %9 являются пустыми строками. Модифицируем ранее рассмотрен- ный пример архивирования и удаления файлов arc.bat.
rem Вызов arc.bat имя_папки маска_файлов имя_архива

@echo off

d:\winrar\rar a %1\%3 %1\%2

del %1\%2
Теперь этот командный файл необходимо вызывать с тремя параметрами: в первом передается полный путь к папке с файлами, второй параметр определяет маску файлов, подлежащих архивации и удалению, а третий параметр задает имя архива, в который будут помещены заархивированные файлы.
Обратиться к командному файлу можно так:
arc.bat d:\tmp *.txt arc.rar
А для другой папки, возможно, потребуется архивация файлов с расшире- нием log и вызов командного файла примет вид:
arc.bat d:\work\logs *.log log.rar
Если в командный файл передается более 9 параметров, на помощь прихо- дит команда shift, которая сдвигает значения параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение
%2
— в %1 и т. д. Замещаемому параметру %9 присваивается десятое значение параметра вызова. Если же такой параметр не задан, то переменная %9 получит в

16
качестве значения пустую строку. Необходимо помнить, что не существует ко- манды, обратной shift. Таким образом, не удастся восстановить параметр (%0) после выполнения команды shift.
Команда shift поддерживает ключ /n, который указывает команде начинать сдвиг с n-го аргумента, где n — число от нуля до восьми. Например:
shift /3 сдвинет %4 на %3, %5 на %4 и т. д. %0, %1 и %2 останутся неизменными.
Если в командной строке задано больше десяти параметров, то команду
shift
можно использовать несколько раз.
Для практических случаев использования командных файлов нередки слу- чаи, когда в качестве параметров им передаются имена файлов и папок. В этом случае в командном файле может встать проблема выделения из этого имени со- ставляющих частей – названия диска, пути, непосредственно имени или расшире- ния файла. Для автоматического выделения подобных объектов можно использо- вать операторы, перечисленные в таблице 7.
Таблица 7 - Операторы для заменяемых параметров
Операторы
Описание
%
Fn
Переменная %n расширяется до полного имени файла
%
Dn
Из переменной %n выделяется только имя диска
%
Pn
Из переменной %n выделяется только путь к файлу
%
Nn
Из переменной %n выделяется только имя файла
%
Xn
Из переменной %n выделяется расширение имени файла
%
Sn
Значение операторов N и X для переменной %n изменяется так, что они работают с кратким именем файла
%
Tn
Дата и время создания файла
%
Zn
Размер файла
%
An
Атрибуты файла
%
$PATH:n Проводится поиск по каталогам, заданным в переменной сре- ды PATH, и переменная %n заменяется на полное имя первого най- денного файла. Если переменная PATH не определена или в резуль- тате поиска не найден ни один файл, эта конструкция заменяется на пустую строку. Переменную PATH можно заменить на любое другое допустимое значение
Например, всегда можно узнать, с какого диска был запущен командный файл:
echo %
D0

Комбинируя операторы из таблицы 7, можно получать составные конст- рукции:
%
DPn — из переменной %n выделяется имя диска и путь,
%
NXn — из переменной %n выделяется имя файла и расширение
Команда

17
ren %1 %
N1_old%
X1

переименует файл, имя которого передается в качестве параметра, дописав к име- ни файла _old: file.dat переименуется в file_old.dat.
Взаимодействие пользователя с командных файлов
Для взаимодействия пользователя с командным файлом предусмотрен го- раздо меньший выбор средств по сравнению с традиционными алгоритмически- ми языками.
Для того чтобы вручную прервать выполнение запущенного командно- го файла, необходимо нажать клавиши + или +. Если надо лишь приостановить работу командного файла до момента нажатия клавиши на клавиатуре, можно воспользоваться командой pause. Хорошим стилем счита- ется выдача предупреждения пользователя о потенциально опасных для данных командах и приостановкой выполнения. Тогда у пользователя будет возможность продолжить выполнения командного скрипта при нажатии клавиши или его за- вершения по + / +:
ECHO Сейчас будут удалены все файлы в d:\work
ECHO Для отмены нажмите Ctrl-C
PAUSE
DEL d:\work\*.*
Для того, чтобы пользователь мог задать значение переменной с клавиату- ры используется команда set с ключом /p:
SET /P имя переменной = текст

Пользователю будет выведен текст-приглашение и командный файл пе- рейдет в режим ожидания ввода с клавиатуры. Введенная строка заносится в пе- ременную среды.
set /p Folder=Введите имя папки
Еще одну интересную возможность – делать выбор одного из альтернатив- ных вариантов, предоставляет команда choice.
Команды передачи управления
Последовательное выполнение команд в командном файле можно прервать несколькими способами. Во-первых, можно использовать команду перехода
goto метка
Эта, табуированная в языках высокого уровня, команда в условиях слабо структурируемых командных файлов используется довольно часто. Метка, на ко- торую осуществляется переход по этой команде, оформляется следующим обра- зом:
:метка
Очевидно, что безусловный переход должен быть обусловлен командой if, иначе не выполнятся команды, помещенные между командой перехода и меткой в случае перехода вперед или произойдет зацикливание при переходе назад. В ка- честве метки перехода можно указывать строку :eof, которая передает управление в конец текущего пакетного файла:

18
@ЕСНО OFF
REM Если файл был запущен без параметров, выходим из него,
REM иначе печатаем первый параметр
IF -%1==- GOTO :EOF
ECHO %1
Второй способ передачи управления, причем как внутри самого пакетного файла, так и при обращении к другим пакетным файлам – использование команды
call
Для того, чтобы обратиться к внешнему командному файлу достаточно указать его и его параметры в команде call:
call файл пакетные_параметры
Пример:
call test.bat par1 par2 par3
Данный вызов приведет к передаче управления командному файлу test.bat c тремя указанными параметрами. Альтернативой подобному запуску может стать использование имени стороннего командного файла в качестве имени команды:
test.bat par1 par2 par3
Но при последнем вызове после окончания работы командного файла test.bat управление не будет возвращено в вызывавший командный файл, а, следо- вательно, не будут выполнены все следующие за командой вызова инструкции.
Вызов же командой call позволяет по окончании работы вызванного командного файла вернуться в вызвавший и продолжить его выполнение.
В качестве адресата вызова команды call допустимо использовать метки внутри текущего командного файла:
CALL :метка аргументы
При вызове такой команды создается новый контекст текущего пакетного файла с заданными аргументами и управление передается на инструкцию, распо- ложенную сразу после метки. Для выхода из такого пакетного файла необходимо два раза завершить его работу, достигнув конца командного скрипта или вызвав команду exit /b (ключ /b позволяет завершить работу лишь командного файла, а не сеанса оболочки). При этом первый выход будет означать возврат управления на инструкцию, расположенную сразу после строки call, а второй выход заверша- ет выполнение пакетного файла. Такое поведение команды call позволяет оформ- лять фрагменты кода в виде подпрограмм:
call :proc1 par1 par2
...
:proc1
rem Здесь %0=:proc1 %1=par1 %2=par2
...
exit /b
...
Команды перехода
Организация ветвлений алгоритмов в зависимости от выполнения или не-

19
выполнения того или иного условия является одной из популярнейших структур- ных конструкций при написании программ на большинстве языков программиро- вания. Не стал исключением и язык командных файлов. Для организации перехо- да по условию здесь может быть использована команда if. Ниже представлены все возможные варианты вызова этой команды.
if [/i] [not] строка1==строка2 команда [else команда]
if [not] errorlevel число команда [else команда]
if [not] exist имя_файла команда [else команда]
if [/i] строка1 оп_сравнения строка2 команда [else команда]
if cmdextversion число команда [else команда]
if defined переменная команда [else команда]
Первый вариант операции сравнения позволяет выполнить команду в зави- симости от совпадения или несовпадения двух строк (которые могут быть пред- ставлены и переменными). Например, так мы можем предотвратить запуск ко- мандного файла без параметров:

@echo off

if -%1 == - goto :eof

При сравнении с использованием переменных всегда необходимо учиты- вать возможный вариант отсутствия переменной с указанном имени в текущем контексте командного окна. Например, если командный файл запущен без пара- метров, то переменная %1 будет не определена, и на этапе выполнения безобид- ная на первый взгляд конструкция

if %1 == /h goto help
приведет к ошибке из-за отсутствия левого операнда в операторе сравнения. По- этому рекомендуется использовать в правой и левой части операции сравнения какой-нибудь дополнительный символ, например '-' (или заключать сравниваемые объекты в кавычки).
Второй вариант команды if опирается на результат выполнения предыду- щей команды. Здесь необходимо учесть, что в результате своего выполнения ко- манды Windows выставляют переменную окружения errorlevel в значение кода своего завершения. Общепринято, что код завершения 0 соответствует успешно- му завершению команды, а 1 и более – неудачному завершению (например, ниче- го не найдено командой find, команда ping не получила ответ на запрос, команда
del
не смогла удалить файл и т.п.) и анализ значения переменной дает возмож- ность выполнить различные действия, например, при успешном или неуспешном выполнении предшествующей команды:
ping www.volpi.ru >nul
if %errorlevel% 1 (
echo %date% %time% Нет связи с сайтом www.volpi.ru>>
report.txt
ipconfig /all >>report.txt
)
Приведенный выше пример иллюстрирует возможность выполнения не- скольких команд в случае выполнения (или невыполнения) заданного условия.
Для группировки команд используются круглые скобки.
Если алгоритм работы командного файла предусматривает переход в слу-

20
чае отношений «больше», «меньше», «больше или равно», «меньше или равно», то можно использовать другой синтаксический вариант команды if:
if [/i] строка1 оп_сравнения строка2 команда [else команда]
Здесь для сравнения используются трехбуквенные операторы, названия и назначение которых приведены в таблице 8. Ключ /i позволяет игнорировать ре- гистр символов при сравнении.
Таблица 8. Операторы сравнения в команде if
Оператор
Описание
EQU равно
NEQ не равно
LSS меньше
LEQ меньше или равно
GTR больше
GEQ больше или равно
call test.bat par1 par2 par3
if %errorlevel% GTR 1 (
echo Ошибка выполнения стороннего скрипта
exit /b 1)

Отметим также, что сравнение проводится по общему типу данных, так что если обе сравниваемые строки содержат только цифры, то обе строки пре- образуются в числа, после чего выполняется сравнение этих чисел.
if %FileSize% LEQ 1000000 (…) else (…)
Если в команде if используется конструкция else, то она обязательно должна располагаться в той же строке, что и if.
Поставить выполнение или невыполнение некоторого фрагмента кода в за- висимость от существования некоторой переменной может команда:
if defined переменная команда [else команда]
Здесь условие defined принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена:
@ECHO OFF
IF not defined FolderName set FolderName=d:\tmp
xcopy /y /c *.log %FolderName%
Аналогично для проверки существования файла на диске используется ко- манда
if [not] exist имя_файла команда [else команда]
Пример использования команды:

if not exist %1 goto NoSuchFile

rem Вывод содержимого файла на экран

echo Содержимое файла '%1'

type %1

goto :EOF

21


:NoSuchFile

rem Файл не найден. Выводим сообщение и создаем пустой файл

echo Файл '%1' не найден.

copy nul %1
Наконец, последний вариант условной команды:
if cmdextversion число команда [else команда]
ставит выполнение команды в зависимость от внутреннего номера версии теку- щей реализации расширенной обработки команд Номер версии будет увеличи- ваться на единицу при каждом добавлении существенных возможностей расши- ренной обработки команд. Таким образом можно адаптировать работу командно- го файла к возможностям установленной на компьютере командной оболочки.
Если расширенная обработка команд отключена, условие cmdextversion не будет истинно.

Организация циклов в командных файлах
Циклическое повторение некоторого фрагмента командного файла можно организовать с использованием пары команд if и goto. Но гораздо эффективнее использовать для этих целей команду for. Команда for обеспечивает выполнение заданной команды (группы команд) для всех элементов некоторого множества
(например, для всех файлов в папке). Обобщенный синтаксис команды
Каталог: resource
resource -> Муниципальное учреждение дополнительного образования
resource -> Муниципальное учреждение дополнительного образования
resource -> Невероятно быстрый: Micromax представляет свой первый смартфон с восьмиядерным процессором Canvas Knight
resource -> Мощный, но легкий: Micromax представляет смартфон Canvas Turbo Mini Рекламная компания смартфона в России впервые пройдет с участием Хью Джекмана, известного голливудского киноактёра и продюсера
resource -> Micromax анонсирует старт продаж Canvas Magnus Q334


Поделитесь с Вашими друзьями:
1   2   3


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал