Приостановка выполнения командных файлов
⇐ ПредыдущаяСтр 3 из 3 Для того чтобы вручную прервать выполнение запущенного 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
Приведем пример использования операторов сравнения: @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
При использовании ключа 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
Например, следующий командный файл выведет полные имена всех файлов с расширением 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|