Windows 7

Использование параметров пакетного файла

Большинство утилит командной строки требуют дополнительной информации, такой как имя файла (например, для COPY или DEL) или пути папки (например, для CD или MD). Эти дополнительные части информации, называемые параметрами, позволяют указать то, как должна работать команда.

К пакетным файлам можно добавить некоторую степень гибкости. Чтобы понять, как это работает, сначала рассмотрим следующий пример:

0ЕСНО OFF
ECHO.
ECHO Первый параметр - %1
ECHO Второй параметр - %2
ЕСЙО Третий параметр - %3

Как видите, этот пакетный файл не делает ничего полезного помимо вывода на экран строк ECHO (первая из которых — пустая строка). Любопытно, однако, что каждая следующая команда ECHO заканчивается символом процента (%) и числом. Наберите эти команды и сохраните в пакетном файле по имени Parameters .bat. Затем, чтобы увидеть, что означают эти необычные символы, введите следующее в командной строке:

parameters A B C

Вывод выглядит следующим образом:

С:\>parameters A B C
Первый параметр - А
Второй параметр - В
Третий параметр - С

Приведенная ниже команда ECHO в Parameters.bat выводит первую строку в выводе (после пустой строки)

ECHO Первый параметр - %1

Когда Windows 7 встречает символ %1 в командном файле, она просматривает исходную команду, видит первый элемент после имени пакетного файла и затем заменяет %1 этим элементом. В данном примере первым элементом является А, поэтому Windows 7 использует его вместо %1. Только после этого команда ECHO будет обработана, и строка появится на экране.

for: циклы в пакетном файл

Команда FOR обеспечивает циклическое выполнение инструкций в пакетном файле:

FOR %%параметр IN (набор) DO команда

  • %%параметр Это параметр, изменяющийся при каждом шаге цикла. После двух знаков %% можно использовать любой одиночный символ (кроме 0-9). Применяется два символа % из-за того, что Windows удаляет один при обработке пакетного файла.
  • IN (набор) Это список (называемый набором) значений %%параметр. Для разделения элементов в наборе можно использовать пробелы, запятые или точки с запятой, и элементы должны заключаться в скобки.
  • DO команда Для каждого элемента в наборе пакетный файл выполняет инструкции, заданные в команда. Параметр %%параметр обычно встречается где-то внутри команды команда.

Ниже приведен пример команды FOR в простом пакетном файле, который поможет прояснить описанное выше:

0ЕСНО OFF
FOR %%В IN (А В С) DO ECHO %%В

Этот пакетный файл (назовите его Parameters .bat) сгенерирует следующий вывод:

D :\BATCH>parameters2
А *•
В
С

Все это делает цикл, проходящий по трем элементам набора (А, В и С), подставляя каждый раз значение %%В в команду ECHO %%В.

goto: переход к строке в пакетном файле

Базовый пакетный файл имеет простую линейную организацию. Выполняется первая команда, затем вторая, третья и т.д. до конца файла. Скучно, но в большинстве случаев это именно то, что и требуется. Однако иногда обычный подход пакетных файлов — выполнение строки за строкой — не подходит. Например, в зависимости от параметра или результата предыдущей команды может понадобиться пропустить несколько строк. Как это сделать? Для этого предназначена команда GOTO:

...
... (начальные команды)
GOTO NEXT
... (команды, которые пропускаются)
:NEXT
... (остальные команды)
...

Здесь команда GOTO сообщает пакетному файлу, что нужно искать строку, начинающуюся с двоеточия и слова NEXT (это называется меткой), и игнорировать все команды до этого места. Команда GOTO удобна для обработки различных пакетных команд в зависимости от параметра. Ниже показан простой пример:

0ЕСНО OFF
CLS
GOTO %1

ECHO Эта часть пакетного файла выполняется, если параметр - А
GOTO END
:В ECHO Эта часть пакетного файла выполняется, если параметр - В
:END

Предположим, что этот файл называется GOTOtest. ВАТ, и для его запуска вводится следующая команда:

gototest а

В пакетном файле строка GOTO % 1 превращается в GOTO А. Это заставляет его пропустить все до метки : А и выполнить последующие команды (в данном примере — просто оператор ECHO), после чего затем пропустить все до : END, не выполняя оставшиеся команды пакетного файла.

if: обработка условий в пакетных файлах

В пакетных файлах часто принимаются решения перед обработкой. Ниже приведено несколько примеров таких решений.

  • Если параметр %2 равен /Q, перейти к разделу QuickFormat. В противном случае выполнять обычное форматирование.
  • Если пользователь забыл ввести параметр, прервать выполнение пакетного файла, иначе — продолжить.
  • Если файл, который пользователь желает переместить, уже существует в новой папке, выдать предупреждение. Иначе выполнить перемещение.
  • Если последняя команда не удалась, отобразить сообщение об ошибке и прервать выполнение, иначе — продолжить.

Для такого типа решений необходимо использовать команду IF. Она имеет следующую общую форму:

IF условие команда

  • условие Логическое условие, оцениваемое, как ДА или НЕТ (например, “Забыл ли пользователь указать параметр?”).
  • команда Это то, что выполняется в случае положительного ответа (наподобие “Прервать выполнение пакетного файла”).

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

0ЕСНО OFF
CLS
IF "%1"=="А" ECHO Эта часть пакетного файла выполняется, если параметр - А.
IF "%1"=="В" Эта часть пакетного файла выполняется, если параметр - В.

Условная часть оператора IF несколько замысловата. Рассмотрим первую: "%1"=="А". Вспомните, что условие — это всегда вопрос, на который существует два ответа, положительный и отрицательный. В данном случае вопрос звучит так: Равен ли первый параметр (%1) значению А?

Двойной символ равенства (==) выглядит загадочно, но именно так сравниваются две строки в пакетном файле. Если ответ положительный, команда выполняется. Если же отрицательный, то управление переходит к следующему IF, который проверяет параметр на равенство В.

Правильная техника составления пакетных файлов требует проверки, не только чему равен параметр, но также, существует ли он вообще. Это важно, потому что пропущенный параметр может вызвать крах пакетного файла. Например, ниже показано содержимое пакетного файла по имени DontCopy.bat, который предназначен для копирования всех файлов из текущей папки в новое место (заданное вторым параметром), за исключением файлов, указанных в первом параметре:

@ЕСНО OFF
CLS
ATTRIB +Н %1
ECHO.
ECHO Копирование всех файлов в %2 кроме %1:
ECHO.
XCOPY *.* %2
ATTRIB -Н %1

Что случится, если пользователь забудет добавить параметр (%2)? Тогда команда XCOPY превращается в XCOPY * . *, что прервет выполнение пакетного файла со следующей ошибкой: Невозможно скопировать файл в себя.

Решение состоит в добавлении команды IF, проверяющей существование параметра %2:

0ЕСНО OFF
CLS
IF "% 2 "= = "" GOTO ERROR
ATTRIB +H %1
ECHO.
ECHO Копирование всех файлов в %2 кроме %1:
ECHO.
XCOPY32 *.* %2
ATTRIB -Н %1
GOTO END
:ERROR
ECHO Вы не указали место назначения!
ECHO Пожалуйста, попробуйте еще...
:END

Условие "%2"==" " буквально сравнивает %2 с пустой строкой (""). Если это условие истинно, программа переходит (с помощью GOTO) к метке : ERROR, и пользователю выдается сообщение. Обратите внимание, что если все хорошо (т.е. пользователь указал второй параметр), пакетный файл выполняется нормально и переходит к метке : END, чтобы обойти вывод сообщения об ошибке.

Другой вариацией IF является команда IF EXIST, которая проверяет существование файла. Это удобно, например, когда вы используете COPY или MOVE. Во-первых, можно проверить, существует ли файл, который планируется переместить или скопировать. Во-вторых, можно проверить, нет ли файла с тем же именем в целевой папке (как известно, файл, который перезаписан копированием “поверх” с тем же именем, восстановить невозможно). Ниже приведен пример пакетного файла по имени SafeMove. bat, который использует команду MOVE для перемещения файла с предварительной проверкой его существования в целевой папке.

@ЕСНО OFF
CLS
IF EXIST %1 GOTO SO_FAR_SO_GOOD
ECHO Файл %1 не существует!
GOTO END
:SO_FAR_SO_GOOD
IF NOT EXIST %2 GOTO MOVE_IT
ECHO Файл %1 существует в целевой папке!
ECHO Для завершения нажмите Ctrl+C;
PAUSE
:MOVE_IT
MOVE %1 %2
:END

Чтобы объяснить, что происходит, рассмотрим следующую простую команду: safemove moveme.txt "%userprofile%\documents\moveme.txt"

Первый IF проверяет существование %1 (MOVEME.TXT в данном примере). Если такой файл есть, программа переходит к метке : SO FAR SO GOOD. Иначе она сообщает пользователю, что файл отсутствует, и переходит к метке : END.

Второй IF слегка отличается. В данном случае необходимо продолжать, только если MO VE ME. TXT отсутствует в папке Мои Документы текущего пользователя, поэтому к условию добавляется NOT. (Включать NOT можно в любое условие IF.) Если условие окажется истинным (т.е. то, что задано в %2, не существует), управление переходит к :MOVE_IT и выполняется перемещение файла. Иначе пользователь предупреждается и ему предоставляется возможность отменить задание.

Вас может заинтересовать

Это интересно

Windows 10