Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Приостановка выполнения командных файлов




Для того чтобы вручную прервать выполнение запущенного bat-файла, нужно нажать клавиши <Ctrl>+<C> или <Ctrl>+<Break>. Однако часто бывает необходимо программно приостановить выполнение командного файла в определенной строке с выдачей запроса на нажатие любой клавиши. Это делается с помощью команды pause. Перед запуском этой команды полезно с помощью команды echo информировать пользователя о действиях, которые он должен произвести. Например:

ECHO Вставьте дискету в дисковод А: и нажмите любую клавишу

PAUSE

 

Команду pause обязательно нужно использовать при выполнении потенциально опасных действий (удаление файлов, форматирование дисков и т. п.). Например:

ECHO Сейчас будут удалены все файлы в С:\TEXT

ECHO Для отмены нажмите Ctrl-C

PAUSE

DEL C:\text\*.*

Вызов внешних командных файлов

Из одного командного файла можно вызвать другой, просто указав его имя. Например:

@ECHO OFF

CLS

REM Вывод списка log-файлов

DIR C:\*.log

REM Передача выполнения файлу f.bat

f.bat

COPY А:\*.* C:\

PAUSE

 

Однако в этом случае после выполнения вызванного файла управление в вызывающий файл не передается, т. е. в приведенном примере команда

COPY А:\*.* C:\

(и все следующие за ней команды) никогда не будет выполнена.

 

Для того чтобы вызвать внешний командный файл с последующим возвратом в первоначальный файл, нужно использовать специальную команду

CALL файл

Например:

@ЕСНО OFF Например:

 

CLS

RЕМ Вывод списка log-файлов

DIR С:\*.log

RЕМ Передача выполнения файлу f.bat

CALL f.bat

COPY А:\*.* С:\

PAUSE

 

В этом случае после завершения работы файла f.bat управление вернется в первоначальный файл на строку, следующую за командой call (в нашем примере это команда COPY А:\*.* С:\).

Внутри пакетного файла нельзя явным образом использовать подпрограм­мы, однако можно создать несколько пакетных файлов: один основной и один или несколько вспомогательных, каждый из которых может обрабаты­вать параметры командной строки. Так как после вызова с помощью команды call вспомогательного файла из основного управление возвращается на следующую инструкцию основного файла, то можно считать, что таким об­разом была вызвана подпрограмма.

Этим приемом можно пользоваться, скажем, при работе с оператором for... in... do, который, задает цикл только для одной команды. Рассмотрим пример.

Пусть в командном файле proc.bat записаны следующие строки:

 

@ECHO OFF

ECHO Записываем файл %1.txt

ECHO Параметр вызова: %1 > %1.txt

 

В другом пакетном файле main.bat введем:

@ECHO OFF

FOR %%i IN (Раз,Два,Три) DO CALL proc.bat %%i

 

Если запустить файл main.bat на исполнение, то это приведет к троекратному выполнению файла proc.bat. В результате парной работы этих двух командных файлов создадутся три текстовых файла: Paз.txt, Два.txt и Tpи.txt. При этом в Раз.txt будет записана строка Параметр вызова: Раз, В Два.txt — Параметр вызова: Два, В Tpи.txt — Параметр вызова: Три.

 

Команды перехода

В расширенном режиме командного интерпретатора cmd.exe в команде пе­рехода внутри файла goto можно задавать в качестве метки перехода стро­ку:eof, которая передает управление в конец текущего пакетного файла. Это позволяет легко выйти из пакетного файла без определения каких-либо меток в самом его конце, например:

@ЕСНО OFF

REM Если файл был запущен без параметров, выходим из него,

REM иначе печатаем первый параметр

IF -%1==- GOTO:EOF

ECHO %1

При включении расширенной обработки команд произошли измене­ния в команде вызова внешнего пакетного или исполняемого файла call — теперь в качестве адресата вызова в этой команде можно использовать мет­ки внутри текущего командного файла, т. е. применяется следующий син­таксис:

CALL:метка аргументы

При вызове такой команды создается новый контекст текущего пакетного файла с заданными аргументами и управление передается на инструкцию. расположенную сразу после метки. Для выхода из такого пакетного файла необходимо два раза достичь его конца. Первый выход возвращает управ­ление на инструкцию, расположенную сразу после строки call, а второй выход завершает выполнение пакетного файла. Например, если запустить с параметром Копия-1 командный файл следующего содержания:

 

@ECHO OFF

ECHO %1

CALL:2 Копия-2

:2

ECHO %1

 

то на экран выведутся три строки:

Копия-1 Копия-2 Копия-1

Таким образом, подобное использование команды call очень похоже на обычный вызов подпрограмм (процедур) в алгоритмических языках про­граммирования.

Операторы сравнения

IF [NOT] строка1==строка2 команда

IF [NOT] EXIST файл команда

IF [NOT] ERRORLEVEL число команда.

При включении расширенной обработки команд можно дополнительно применять еще три варианта этой команды:

IF [/I] строка1 оператор__сравнения строка2 команда

IF CMDEXTVERSION число команда

IF DEFINED переменная команда

 

Рассмотрим сначала оператор if в следующем виде:

IF [/I] строка1 оператор_сравнения строка2 команда

Синтаксис и значение операторов_сравнения представлены в таблице ХХХ.

Таблица ХХХ - Операторы сравнения в IF

 

Оператор Значение Оператор Значение
EQL Равно LEQ Меньше или равно
NEQ Не равно GTR Больше
LSS Меньше GEQ Больше или равно

 

Приведем пример использования операторов сравнения:

@ECHO OFF

CLS

IF -%1 == -Вася ECHO Привет, Вася!

IF -%1 NEQ -Вася ECHO Привет, но Вы не Вася!

 

Ключ /I, если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка 1== строка2 команды if. Например, условие

IF /I DOS==dos...

будет истинным.

Отметим также, что сравнение проводится по общему типу данных, так что если обе сравниваемые строки содержат только цифры, то обе строки пре­образуются в числа, после чего выполняется сравнение этих чисел. Напри­мер, условие

IF 002 LEQ 5...

будет истинным.

Операторы сравнения чисел можно применять и в операторе

IF ERRORLEVEL...

Например:

IF ERRORLEVEL LEQ 1 GOTO Case1

 

При включенной расширенной обработке команд для более удобной работы с кодами завершения программ можно использовать выражение %errorlevel%. Строка %errorlevel% будет развернута в строковое представле­ние текущего значения кода ошибки errorlevel, за исключением ситуации, когда уже имеется переменная среды с именем errorlevel; в этом случае, естественно, подставляется значение этой переменной.

 

Для определения внутреннего номера версии текущей реализации расши­ренной обработки команд применяется оператор if в следующем виде:

IF CMDEXTVERSION число команда

Здесь условие cmdextversion применяется подобно условию errorlevel, но число сравнивается с вышеупомянутым внутренним номером версии. Пер­вая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие cmdextversion никогда не бывает истинно.

Для определения наличия заданной переменной среды предназначен сле­дующий вариант команды IF:

IF DEFINED переменная команда

Здесь условие DEFINED применяется подобно условию EXISTS наличия задан­ного файла, но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена. Например:

@ECHO OFF

CLS

IF DEFINED Username GOTO:VarExists

ECHO Переменная Username не определена

GOTO:EOF

:VarExists

ECHO Переменная Username определена,

ECHO ее значение равно %Username%

Организация циклов

Рассмотрим подробно различные варианты команды FOR. Первый из них реализуется, если указать в команде FOR ключ /D:

FOR /D %переменная IN (набор) DO команда [параметры]

 

В случае если набор содержит подстановочные знаки, то команда выполняется для всех подходящих имен каталогов, а не имен файлов. Скажем, выполнив следующий командный файл:

@ECHO OFF

CLS

FOR /D %%f IN (C:\*.*) DO ECHO %%f.

мы получим список всех каталогов на диске С.

 

С помощью ключа /R можно задать рекурсию в команде FOR:

FOR /R [[диск:] путь] %переменная IN (набор) DO команда [параметры]

В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа /R не указано имя каталога, то выполнение команды начинается с текущего каталога. На­пример, для распечатки всех файлов с расширением txt в текущем каталоге и всех его подкаталогах можно использовать следующий пакетный файл:

@ЕСНО OFF

CLS

FOR /R %%f IN (*.txt) DO PRINT %%f

Если вместо набора указана только точка (.), то команда проверяет все под­каталоги текущего каталога. Например, если мы находимся в каталоге c:\text с двумя подкаталогами books и articles, to в результате выполнения файла:

@ЕСНО OFF

CLS

FOR /R %%f IN (.) DO ECHO %%f

на экран выведутся три строки:

С:\ТЕХТ\.

C:\TEXT\BOOKS\.

С:\TEXT\ARTICLES\.

Ключ /L позволяет реализовать с помощью команды FOR арифметический цикл, в этом случае синтаксис имеет следующий вид:

FOR /L %первменная IN (начало,шаг, конец) DO команда [параметры]

заданная после ключевого слова in тройка (начало,шаг,конец) раскрывается в последовательность чисел с заданными началом, концом и ша­гом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1). Например, в результате выполнения следующего командного файла:

@ECHO OFF

CLS

FOR /L %%f IN (1,1,5) DO ECHO %%f

 

переменная цикла %%f пробежит значения от 1 до 5, и на экране напечата­ются пять чисел:

Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:

@ECHO OFF

CLS

FOR /L %%f IN (1,1,5) DO CALL:2 %%f

GOTO:EOF

:2

SET /A M=10*%1

ECHO 10*%1=%M%

 

В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку: 2. В шестой строке пере­менная цикла умножается на десять, и результат записывается в перемен­ную M. Таким образом, в результате выполнения этого файла выведется сле­дующая информация:

10*1=10 10*2=20 10*3=30 10*4=40 10*5=50

Самые мощные возможности (и одновременно самый запутанный синтаксис) имеет команда for с ключом /F.

FOR /F ["ключи"] %переменная IN (набор) DO команда [параметры]

 

Здесь параметр набор содержит имена одного или нескольких файлов, кото­рые по очереди открываются, читаются и обрабатываются. Обработка состо­ит в чтении файла, разбиении его на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла (заданной команды).

По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропуска­ются. Необязательный параметр "ключи" служит для переопределения задан­ных по умолчанию правил обработки строк. Ключи представляют собой за­ключенную в кавычки строку, содержащую приведенные в таблице 2.2 ключевые слова:

Таблица 2.2 - Ключи в команде FOR /f

Ключ Описание
EOL=C Определение символа комментариев в начале строки (допускается задание только одного символа)
SKIP=N Число пропускаемых при обработке строк в начале файла
DELIMS=XXX Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции
TOKENS=X,Y,M-N Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла  

 

 

При использовании ключа tokens=x,y,m-n создаются дополнительные пере­менные. Формат m-n представляет собой диапазон подстрок с номерами от м до N. Если последний символ в строке tokens= является звездочкой, то соз­дается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.

Разберем использование этой команды на примере пакетного файла parser.bat, который производит разбор файла myfiie.txt:

@ECHO OFF

IF NOT EXIST myfile.txt GOTO:NoFile

FOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN (myfile.txt) DO @ECHO %%i %%j %%k

GOTO:EOF

:NoFile

ECHO He найден файл myfile.txt!

 

Здесь во второй строке производится проверка наличия файла myfiie.txt, в случае отсутствия этого файла выводится предупреждающее сообщение.

 

Команда for в третьей строке обрабатывает файл myfiie.txt следующим образом:

1 Пропускаются все строки, которые начинаются с символа точки с запятой (EOL=;).

2 Вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми (delims=,).

3. В теле цикла переменная %%i используется для второй подстроки, %%j — для третьей, а %%к получает все оставшиеся подстроки после третьей.

В нашем примере переменная %%i явно описана в инструкции for, а переменные %%j и %%к задаются неявно с помощью ключа tokens=. Например, если в файле myfiie.txt были записаны следующие три строки:

ддд ББББ ВВВВ,ГГГГГ ДДДД

ЕЕЕЕЕ,ЖЖЖЖ ЗЗЗЗ

;КККК ЛЛЛЛЛ МММММ

то в результате выполнения пакетного файла parser.bat на экран выведется

следующее:

ББББ ВВВВ ГГГГГ ДДДД

ЖЖЖЖ ЗЗЗЗ

Замечание

Ключ tokens= позволяет извлечь из одной строки файла до 26 подстрок, по­этому запрещено использовать имена переменных, начинающиеся не с букв английского алфавита (a-z). Следует помнить, что имена переменных for являются глобальными, поэтому одновременно не может быть активно более 26 переменных.

Команда for /f также позволяет обработать отдельную строку. Для этого следует ввести нужную строку в кавычках вместо набора имен файлов в скобках. Строка будет обработана так, как будто она взята из файла. Напри­мер, файл следующего содержания:

@ECHO OFF

FOR /f "EOL=; TOKENS=2,3* DELIMS=, " %%i IN ("AAA ББББ ВВВВ,ГГГГГ ДДДД") DO @ECHO %%i %%j %%k

 

При своем выполнении напечатает

ББББ ВВВВ ГГГГГ ДДДД

 

Команда for /f позволяет обработать строку вывода другой команды. Для этого следует вместо набора имен файлов в скобках ввести строку вызова команды в апострофах (не в кавычках!). Строка передается для выполнения интерпретатору команд cmd.exe, а вывод этой команды за­писывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующий командный файл:

@ECHO OFF

CLS

ECHO Имена переменных среды:

ECHO

FOR /F "DELIMS==" %%i IN ('SET') DO ECHO %%i

 

выведет перечень имен всех переменных среды, определенных в настоящее время в системе.

В Windows также расширены операции подстановки ссылок на пере­менные команды for. В for допускается применение тех же синтаксических конструкций (операторов), что и для заменяемых параметров; описание этих операторов приведено в таблице 2.3.

Таблица 2.3 - Операторы для переменных команды for

Операторы Описание
%~Fi Переменная %i расширяется до полного имени файла
%~Di Из переменной %i выделяется только имя диска
%~Pi Из переменной %i,выделяется только путь к файлу
%~Ni Из переменной %i выделяется только имя файла
%~Xi Из переменной %i выделяется расширение имени файла
%~Si Значение операторов N и х для переменной %i изменяется так, что они работают с кратким именем файла

 

Например, следующий командный файл выведет полные имена всех файлов с расширением txt.

@ECHO OFF

CLS

FOR %%i IN (*.txt) DO ECHO %%~Fi

 

Команды PUSHD и POPD

Иногда бывает необходимо в командных файлах запоминать текущий ката­лог, переходить в другой каталог, выполнять какие-либо действия, а затем возвращаться в исходный Для этого используются две команды

PUSHD И POPD

Команда PUSHD сохраняет имя текущего каталога для команды POPD и осуще­ствляет переход в другой каталог Ее синтаксис имеет вид

PUSHD [путь | … ]

Здесь параметр путь задает каталог, который будет сделан текущим.

 

Когда включена расширенная обработка команд, команда PUSHD допускает ввод сетевых путей в дополнение к обычным именам дисков и путям Например

PUSHD \\Server1\Programs

Если указан сетевой путь, команда PUSHD создает временное имя диска, ука­зывающее на заданный сетевой ресурс, а затем производит смену текущего диска и каталога, используя вновь определенное имя диска Выделение вре­менных имен дисков проводится в обратном порядке, начиная с Z:, причем выбирается первое свободное имя диска

Вновь сделать текущим каталог, сохраненный командой PUSHD, можно с по­мощью команды POPD. Команда POPD может быть использована только один раз для изменения каталога, после чего буфер будет очищен Когда включе­на расширенная обработка команд, команда popd удаляет временные имена дисков, созданные pushd для сетевых ресурсов

Таким образом, PUSHD и POPD можно использовать в командных файлах для возврата в каталог, откуда была вызвана пакетная программа Приведем пример пакетного файла deltxt.bat, который удаляет все файлы с расшире­нием txt в каталоге, заданном первым параметром командной строки.

@ECHO OFF

IF -%1==- GOTO:NoParam

REM Переходим в нужный каталог

PUSHD %1

DEL * txt

REM Возвращаемся в исходный каталог

POPD

CLS

ECHO Все текстовые файлы в каталоге %1 удалены!

GOTO:EOF

:NoParam

ECHO He задано имя каталога!

PAUSE

 

 

Задание

 

 

1. Пусть имеется текстовый файл protokol.txt, в котором хранится журнал обработанных файлов в следующем формате:

Имя: file1.txt Дата: 02.01.2001 Время: 14:50

Имя: file22.txt Дата: 03.02.2001 Время: 23:50

Имя: letter2.txt Дата: 02.01.2001 Время: 12:00

Имя: soft.txt Дата: 10.01.2000 Время: 13:00

 

Слово дата здесь начинается в каждой строке с двадцатой позиции. Необходимо написать командный файл, с помощью которого сделать вы­борку из этого файла (т. е. создать новый текстовый файл с нужной ин­формацией) за заданный в командной строке месяц (мм) и год (гггг) в файл out.txt, сформированный файл упорядочить по дате обработки. Нужные месяц и год указать как параметры командной строки.

Если пакетный файл запуска­ется вообще без параметров, то вывести описание его синтаксиса.

 

2. Написать командный файл, который будет копировать из текущего каталога все файлы с расширением txt, кроме одного файла, указанного в качестве второго параметра командной строки, в каталог, указанный первым параметром. Если имя каталога, в который должно производиться копирование, не задано, то вывести сообщение об этом, если будет введен символ Y – продолжить работу, т.е. создать каталог и скопировать файлы, N - прервать выполнение файла.

Если пакетный файл запуска­ется вообще без параметров, то вывести описание его синтаксиса.

3. Создать командный файл, который выводил бы содержимое каталога, указанного в качестве параметра командной строки, причем пользователю должна быть предоставлена возможность выбора с помощью меню устройства для вывода: на экран (информация выводится по одному экрану), в текстовый файл catalog.txt.

Командный файл должен обрабатывать два ключа:

/a – сортировка выводимой информации по алфавиту

/d – по дате создания.

Если пакетный файл запуска­ется вообще без параметров, то вывести описание его синтаксиса.

4. Написать командный файл, который печатал бы общее число перемен­ных среды, а всю остальную информацию о переменных выводил в заданный в качестве параметра командной строки текстовый файл, который затем открывается в Блокноте (Notepad). Если файл для вывода не задан, то выво­дить список на экран. Также предусмотреть два дополнительных ключа: если задан ключ /b, то выводить только имена переменных (без значе­ний, как в предыдущем упражнении), если задан ключ /a, то выводить имя переменной и ее значение в круглых скобках:

По умолчанию считать заданным ключ /b. Если пакетный файл запуска­ется вообще без параметров, то вывести описание его синтаксиса.

 

5. Написать пакетный файл, который автоматически удалял бы в каталоге, указанном в командной строке все подкаталоги, размер которых превышает 20 Мбайт.

Если пакетный файл запуска­ется вообще без параметров, то вывести описание его синтаксиса.

 

6. Пусть имеется текстовый файл sums.txt с разделителями следующего формата:

Фамилия|Имя|Отчество|Сумма

Например:

Петров|Петр|Петрович|1450

Иванов|Иван|Иванович|1200

Необходимо написать пакетный файл seeksum.cmd, который запускался бы с двумя параметрами командной строки:

MIN МАХ

где min — минимальная сумма, мах — максимальная сумма, и искал в файле sums.txt всех людей, у которых сумма меньше либо равна мах, но больше либо равна min. Информацию выводить в файл suminfo.txt, при­чем фамилии должны идти в алфавитном порядке.

Если пакетный файл запуска­ется вообще без параметров, то вывести описание его синтаксиса.

 

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...