Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Всё о работе в Интернет" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Секреты Windows: статьи о реестре, rundll32.exe, программах И снова пакетные файлы, часть 2
Другие наши рассылки:
Новости нашего сайта:
Данная статья была написана для журнала Мой компьютер. Условные операторы в пакетных файлах
Как и в любом другом языке сценариев, в bat-файле можно использовать условные операторы. Реализованы они при помощи команды if, которая имеет несколько вариантов синтаксиса. В каждом варианте синтаксиса после команды if можно указывать опцию not, чтобы инвертировать условный оператор. Проверка существования файла Чтобы проверить существование файла, достаточно воспользоваться синтаксисом следующего вида. if [not] exist имя_файла команда Если файл существует (не существует), выполнить данную команду. if [not] exist имя_файла (команда) else команда2 Если файл существует (не существует), выполнить данную команду. Иначе выполнить команду команда2. if [not] exist имя_файла ( команда1 команда2 … ) else ( Команда11 Команда12 … ) Если файл существует (не существует), выполнить команды команда1 и команда2. Иначе выполнить команды команда11 и команда12. Проверка существования переменной Чтобы проверить существование переменной, достаточно воспользоваться синтаксисом следующего вида. if [not] defined переменная команда Если переменная существует (не существует), выполнить данную команду. if [not] defined переменная (команда) else команда2 Если переменная существует/не существует, выполнить данную команду. Иначе выполнить команду команда2. if [not] defined переменная ( команда1 команда2 … ) else ( Команда11 Команда12 … ) Если переменная существует/не существует, выполнить команды команда1 и команда2. Иначе выполнить команды команда11 и команда12. Представленные варианты синтаксиса доступны только в том случае, если в программе cmd.exe включена расширенная обработка команд. Проверка равенства значения переменной Чтобы проверить, равно ли значение переменной определенной строке, достаточно воспользоваться следующими вариантами синтаксиса. if [not] переменная==строка команда Если значение переменной равно/не равно указанной строке, выполнить данную команду. if [not] переменная==строка (команда) else команда2 Если значение переменной равно/не равно указанной строке, выполнить данную команду. Иначе выполнить команду команда2. if [not] переменная==строка ( команда1 команда2 … ) else ( Команда11 Команда12 … ) Если значение переменной равно/не равно указанной строке, выполнить команды команда1 и команда2. Иначе выполнить команды команда11 и команда12. Например, ниже представлен листинг одного из уже созданных нами ранее bat-файлов с добавлением условных операторов. echo off if '%1'=='' ( echo При запуске bat-файла нужно указать один или два аргумента, определяющих выполняемые команды ) else ( rem Если аргумент запуска содержит пробелы, запятые или точки с запятой, rem тогда он должен быть взят в кавычки. rem Поэтому нам придется воспользоваться переменными %~1 и %~2, rem чтобы удалить ограничивающие кавычки аргументов (если они есть) start %~1 if not '%2'=='' start %~2 ) Обратите внимание на следующую строчку представленного выше листинга: if '%1'=='' (. Данная строчка будет обрабатываться правильно лишь в том случае, если переменная %1 не содержит в себе символов '. Если же вы точно знаете, что эти символы будут использоваться в значении переменной %1, тогда переменную %1 можно ограничить другими символами. Например, {}. То есть: if {%1}=={} (. Проверка переменной среды %ERRORLEVEL% Чтобы выполнить какие-либо действия в зависимости от значения переменной %ERRORLEVEL%, необходимо воспользоваться следующими вариантами синтаксиса команды if. if [not] ERRORLEVEL число команда Если в переменной %ERRORLEVEL% содержится (не содержится) число, равное либо большее чем указанное, выполнить данную команду. if [not] ERRORLEVEL число (команда) else команда2 Если в переменной %ERRORLEVEL% содержится (не содержится) число, равное либо большее чем указанное, выполнить данную команду. Иначе выполнить команду команда2. if [not] ERRORLEVEL число ( команда1 команда2 … ) else ( Команда11 Команда12 … ) Если в переменной %ERRORLEVEL% содержится (не содержится) число, равное либо большее чем указанное, выполнить команды команда1 и команда2. Иначе выполнить команды команда11 и команда12. Еще раз обратите внимание на то, как интерпретируется число в синтаксисе для проверки errorlevel. Оно проверяется не на равенство, а на «больше либо равно». Например, если для проверки значения errorlevel вы используете два оператора сравнения, первый из которых сравнивает со значением 1, а второй со значением 2, тогда сначала нужно указывать тот, который сравнивает со значением 2, а уже потом тот, что сравнивает со значением 1. Иначе условный оператор, сравнивающий со значением 1, будет выполняться даже в том случае, если значение переменной errorlevel равно 2. То есть, необходимо всегда проверять содержимое переменной errorlevel в порядке убывания. Условие на основе сравнения строк Если вам необходимо сравнить значения двух переменных (или переменной и строки), следует воспользоваться операторами сравнения. В пакетных файлах используются следующие операторы сравнения.
Операторы сравнения используются в следующих вариантах синтаксиса команды if. if [not] переменная оператор_сравнения строка команда Если значение переменной удовлетворяет (не удовлетворяет) оператору сравнения с указанной строкой, выполнить данную команду. if [not] переменная оператор_сравнения строка (команда) else команда2 Если значение переменной удовлетворяет (не удовлетворяет) оператору сравнения с указанной строкой, выполнить данную команду. Иначе выполнить команду команда2. if [not] переменная оператор_сравнения строка ( команда1 команда2 … ) else ( Команда11 Команда12 … ) Если значение переменной удовлетворяет (не удовлетворяет) оператору сравнения с указанной строкой, выполнить команды команда1 и команда2. Иначе выполнить команды команда11 и команда12. Представленные варианты синтаксиса доступны только в том случае, если в программе cmd.exe включена расширенная обработка команд. Использование меток
Несмотря на то, что во всех полнофункциональных языках программирования использование меток считается дурным тоном, в пакетных файлах метки применяются намного чаще, чем другие операторы выбора. Меткой называется указатель на определенную часть кода пакетного файла, на которую впоследствии можно будет выполнить быстрый переход. Чтобы поставить метку достаточно с новой строки написать :название_метки. Переходы же на метки выполняются при помощи команды goto :название_метки. Помимо пользовательских меток существует набор стандартных меток. Например, к таким меткам относится метка :EOF, указывающая на окончание сценария. То есть, чтобы завершить выполнение сценария, не выполняя команды, представленные в нем ниже, достаточно воспользоваться командой вида goto :EOF. Например, эту команду можно вызывать из условного оператора. Например, if переменная==строка goto :EOF. В листинге ниже представлен пример использования меток. echo off if '%1'=='' goto :EMPTY if '%1' LEQ 7 rundll32.exe shell32.dll Options_RunDLL %1 goto :EOF :EMPTY echo При запуске bat-файла нужно указать аргумент запуска, определяющий вызываемый диалог (число от 0 до 7) Как приостановить работу сценария
Иногда бывает необходимо приостановить работу сценария. Например, если сценарий после своего завершения в командной строке отображает какой-либо текст, тогда пользователь просто не увидит этот текст, если запустит сценарий при помощи двойного нажатия на bat-файле (так как по умолчанию при завершении bat-файла автоматически закрывается и командная строка, в которой он выполнялся). Вы можете запретить завершение сценария до тех пор, пока пользователь не нажмет какую-либо клавишу. Для этого применяется программа choice.exe. Например, при использовании команды Choice /M "Select Y for exit" /N /C Y сценарий не завершится до тех пор, пока пользователь не нажмет на кнопку Y. Более простой в использовании альтернативой данной возможности программы choice.exe является программа pause.exe. Вам достаточно лишь вызвать данную программу, чтобы в командной строке отобразилось приглашение Для продолжения нажмите любую клавишу . . .. При этом работа сценария не будет завершена до тех пор, пока пользователь не нажмет любую клавишу. Также вы можете воспользоваться программой timeout.exe, чтобы установить автоматическое завершение сценария только через указанный промежуток времени. Например, команда вида timeout /T количество_секунд отобразит в командной строке строку обратного отсчета. После окончания количества указанных в команде секунд (или после нажатия пользователем любой клавиши) работа программы timeout.exe будет завершена (а вместе с ней и работа сценария, если это последняя команда в сценарии). Например, ниже представлен листинг пакетного файла, использующего возможность ожидания ввода пользователя. echo off if '%1'=='' goto :EMPTY if '%1' LEQ 7 rundll32.exe shell32.dll Options_RunDLL %1 goto :EOF :EMPTY echo При запуске bat-файла нужно указать аргумент запуска, определяющий вызываемый диалог (число от 0 до 7) Choice /M "Select Y for exit" /N /C Y Взаимодействие с пользователем при помощи программы choice.exe
Очень интересной особенностью программы командной строки choice.exe является то, что она позволяет определить клавишу, которую пользователь нажал. При этом нажатая пользователем клавиша, при завершении работы программы choice.exe, помещается в переменную среды %ERRORLEVEL%. Основной синтаксис программы choice.exe следующий: choice.exe /M [строка приглашения ввода клавиши] /C [список клавиш, которые разрешено нажать пользователю]. Помимо основных опций программа choice.exe поддерживает набор дополнительных опций. Эти опции представлены ниже.
Например, в листинге ниже представлен пример используемого нами bat-файла, выполняющего взаимодействие с пользователем при помощи программы choice.exe. echo off choice /M "Введите число от 0 до 6 для запуска соответствующего диалога" /N /C 0123456 if errorlevel 255 exit rundll32.exe shell32.dll Options_RunDLL %errorlevel% Как работать с переменными среды
Ранее мы с вами уже использовали некоторые встроенные переменные среды. В частности, переменные среды %ERRORLEVEL% и %CMDCMDLINE%. Помимо них пользователю также доступны переменные среды, представленные ниже.
Помимо встроенных переменных среды в сценариях можно использовать стандартные переменные среды операционной системы. Список этих переменных среды (а также их значения) можно просмотреть, введя команду set. Вы и самостоятельно можете создавать переменные среды. Для этого применяется команда вида set имя_переменной_среды=значение. Каждый bat-файл рекомендуется начинать строкой setlocal, а заканчивать строкой endlocal. Благодаря этому все изменения значений стандартных переменных среды, а также все созданные во время выполнения сценария переменные среды, после выполнения сценария будут удалены. То есть, таким образом вы гарантируете, что после выполнения вашего сценария не будет создана ни одна новая переменная среды, а также не будет изменено значение стандартных переменных среды. Запуск пакетных файлов из пакетного файла
Одной из дополнительных возможностей bat-файлов является возможность запуска bat-файлов из другого bat-файла. Сделать это несложно. Для этого достаточно воспользоваться командой вида call [путь к bat-файлу и аргументы его запуска]. Более интересной разновидностью команды call является команда вида call :[имя метки] [аргументы запуска, если есть]. Данная команда доступна только при включенной расширенной обработке команд. С ее помощью из одного bat-файла можно создать несколько. То есть, данная команда запускает еще одну копию bat-файла, передавая управления на команды, расположенные после метки. Как только выполнение новой копии подходит к концу, она удаляется из памяти, и управление передается основной копии bat-файла, а точнее, команде, расположенной после вызова call. В качестве примера давайте рассмотрим представленный в листинге ниже пакетный файл. Он содержит в себе пример вызова дополнительного bat-файла из основного при помощи метки. Если посмотреть внимательно на такой вид использования команды call, можно заметить что фактически мы с вами создали функцию. echo off choice /M "Введите число от 1 до 5, либо введите 6 для генерации случайного числа" /N /C 123456 /T 10 /D 6 if errorlevel 255 exit /b if errorlevel 6 ( call :GenNumb ) if errorlevel 5 ( echo выполняются какие-либо действия 5 goto :Exit ) if errorlevel 4 ( echo выполняются какие-либо действия 4 goto :Exit ) if errorlevel 3 ( echo выполняются какие-либо действия 3 goto :Exit ) if errorlevel 2 ( echo выполняются какие-либо действия 2 goto :Exit ) if errorlevel 1 ( echo выполняются какие-либо действия 1 goto :Exit ) :Exit pause exit /b :GenNumb choice /M "Введите число от 1 до 5" /C 12345 Использование циклов в bat-файлах
Циклы позволяют легко выполнять одни и те же команды для определенного набора файлов или значений. Создаются циклы при помощи команды for, основной вид которой следующий: FOR %переменная IN (набор_значений) DO ( Команда1 Команда2 … ) Здесь,
Существует несколько вариантов синтаксиса цикла for.
Стандартные пакетные файлы Windows Vista
В поставку Windows Vista входит несколько стандартных пакетных файлов, которые можно использовать для дальнейшего ознакомления с возможностями пакетных файлов.
Оригинал статьи: http://www.onestyle.com.ua/txt.php?u=110
|
В избранное | ||