Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Секреты Windows: статьи о реестре, rundll32.exe, программах И снова пакетные файлы, часть 2


Другие наши рассылки:
  • Новости IT-мира: Ежедневно ссылки на новые новости и статьи популярных компьютерных сайтов.
  • Рецензии на новые книги: Описание новых книг о компьютерах, дизайне, бухгалтерии, психологии и др. направлениях мысли человечества.
  • Новости нашего сайта: Ежедневно ссылки на новые материалы, поступающие на наш сайт: от ссылок на статьи до ссылок на новые и обновленные записи онлайновых баз данных.

Данная статья была написана для журнала Мой компьютер.

Условные операторы в пакетных файлах

Как и в любом другом языке сценариев, в 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 в порядке убывания.

Условие на основе сравнения строк Если вам необходимо сравнить значения двух переменных (или переменной и строки), следует воспользоваться операторами сравнения. В пакетных файлах используются следующие операторы сравнения.

  • EQL. Проверить на равенство.
  • NEQ. Проверить на неравенство.
  • LSS. Проверить, меньше ли.
  • LEQ. Проверить, меньше или равно.
  • GTR. Проверить, больше ли.
  • GEQ. Проверить, больше или равно.

Операторы сравнения используются в следующих вариантах синтаксиса команды 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 поддерживает набор дополнительных опций. Эти опции представлены ниже.

  • /N. Не добавлять к строке приглашения строку [список доступных клавиш]?.
  • /CS. При нажатии пользователем на клавиши учитывать используемый регистр.
  • /T секунды. Определяет количество секунд, по истечении которых будет программно нажата клавиша по умолчанию (определенная в опции /D) в том случае, если пользователь так и не нажал нужную клавишу.
  • /D символ. Символ, который будет нажат по умолчанию, если пользователь так и не нажмет нужную клавишу.

Например, в листинге ниже представлен пример используемого нами 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%. Помимо них пользователю также доступны переменные среды, представленные ниже.

  • %CD%. Содержит текущую директорию.
  • %DATE%. Содержит текущую дату.
  • %TIME%. Содержит текущее время.
  • %RANDOM%. Возвращает случайное десятичное число.
  • %ERRORLEVEL%. Содержит код выполнения последней команды.
  • %CMDEXTVERSION%. Содержит версию расширенной обработки команд.
  • %CMDCMDLINE%. Содержит строку запуска bat-файла.

Помимо встроенных переменных среды в сценариях можно использовать стандартные переменные среды операционной системы. Список этих переменных среды (а также их значения) можно просмотреть, введя команду 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 для указания на значение из набора, используемое в данный момент;
  • набор значений определяет значения, которые будут последовательно присваиваться переменной при каждой новой итерации цикла.

Существует несколько вариантов синтаксиса цикла for.

  • FOR %переменная IN (строка1[, строка2,…]) DO команды. Выполнить набор команд столько раз, сколько строк находится в наборе. При этом при каждом выполнении команд цикла for переменной присваивается значение новой строки набора.
  • FOR /L %переменная IN (начало,шаг,конец) DO команды. Выполнить набор команд столько раз, сколько промежуточных цифр находится между начальной и конечной цифрой набора (и с указанным шагом). То есть, фактически указанный таким образом набор преобразуется в обычный набор цифр. Например, набор 1, 1, 5 преобразуется в набор 1, 2, 3, 4, 5.
Стандартные пакетные файлы Windows Vista

В поставку Windows Vista входит несколько стандартных пакетных файлов, которые можно использовать для дальнейшего ознакомления с возможностями пакетных файлов.

  • msdtcvtr.bat. Данный файл находится в каталоге %systemroot%\System32\Msdtc\Trace и используется для трассировки работы координатора распределенных транзакций MSDTC.
  • iisswtch.bat. Данный файл создается только после установки сервера IIS (определен в компоненте, доступном в каталоге %systemroot%\winsxs\x86_microsoft-windows-iis-legacyscripts_31bf3856ad364e35_6.0.6000.16386_none_7c0faaed7a4bede9). Он содержит в себе единственную команду — cscript iis_switch.vbs //nologo %1 %2.
  • winrm.cmd. Данный файл находится в каталоге %systemroot%\System32 и используется для запуска файла winrm.vbs. Делается это довольно интересным способом — при помощи команды @cscript //nologo "%~dpn0.vbs" %*.
  • login.cmd. Данный файл создается только после установки сервера Telnet. Он расположен в каталоге %systemroot%\System32 и используется как сценарий, настраивающий оболочку для пользователей, вошедших в систему при помощи сеанса Telnet.
Оригинал статьи: http://www.onestyle.com.ua/txt.php?u=110

В избранное