
- •Пакетные файлы. Общий подход
- •Использование переменных окружения.
- •Входные параметры для командного файла
- •Переходы и метки
- •If exist имя_файла команда
- •Примеры Создание файлов
- •Присвоение съемному диску одной и той же буквы
- •Создание поколений архивов по датам и времени
- •Создание архивов - более сложный вариант
- •Выполнение команд по расписанию
- •Остановка и запуск системных сервисов
- •Выдача значения переменной errorlevel
- •Диалог с пользователем
- •Задержки в командных файлах
- •Поиск компьютеров с запущенным приложением
- •Поиск компьютеров с запущенным приложением по списку
- •Выключение компьютеров по списку, созданному на основе сетевого окружения
- •Работа с оконными приложениями
- •Типичные ошибки
Входные параметры для командного файла
Существует возможность передать командному файлу параметры командной строки и использовать их значения в операторах самого командного файла.
BAT-файл < параметр1 > , < параметр2 >, ... < параметрN >
В самом командном файле первый параметр будет доступен как переменная %1, второй - %2 и т.п. Имя самого командного файла доступно как переменная %0. Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных параметров. Обычно для вывода текста используется команда
ECHO < текст >
Однако если текст заменить на %1, - то будет выдан первый параметр, на %2 - второй и т.д.
Создаем файл parm.bat следующего содержания:
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
и запускаем его на выполнение следующей командой:
parm.bat FIRST second “two words”
после его выполнения вы поймете, как это работает и что параметры с пробелами, нужно заключать в двойные кавычки. Для того, чтобы обрабатываемые командным процессором строки не выдавались на экран, можно воспользоваться командой ECHO OFF, поместив ее в первую строку командного файла. Для того, чтобы строка командного файла игнорировалась командным процессором поместите в ее начало REM< пробел > . Таким образом можно помещать комментарии, зачастую нелишние в больших командных файлах:
rem ECHO OFF выключает режим вывода содержания строк командного файла на экран
REM будет выводиться только результат их выполнения.
ECHO OFF
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
Попробуйте ECHO OFF заменить на @ECHO OFF – результат говорит сам за себя. Строка, которая выключает режим вывода, перестала выдаваться на экран.
Переходы и метки
В командных файлах можно использовать команды условного перехода, меняющие логику их работы в зависимости от выполнения определенных условий. Для иллюстрации приемов использования условных переходов создадим командный файл, целью которого будет присвоение заранее определенной буквы диска для съемных носителей, в качестве которых будут использоваться флэш-диски. Условия таковы – есть 2 флэш-диска, один из которых должен быть виден в проводнике как диск X: а второй – как диск Y: независимо от того, в какой порт USB они подключены. Будем считать, что реальные диски могут быть подключены как F: или G: Опознавание дисков будем выполнять по наличию файла с определенным именем (лучше такой файл сделать скрытым в корневом каталоге и назвать его как-нибудь необычно):
Flashd1.let – на первом диске
Flashd2.let – на втором
Т.е. задача командного файла заключается в том, чтобы проверить наличие на сменных дисках F: и G: файлов Flashd1.let или Flashd2.let и, в зависимости от того, какой из них присутствует, присвоить диску букву X: или Y:
Для поиска файла на диске используем команду IF EXIST:
If exist имя_файла команда
В качестве команды проще всего воспользоваться SUBST, сопоставляющей имя диска и каталог.
SUBST X: C:\ - оздает виртуальный диск X:, содержимым которого будет корневой каталог диска C:
Создаем командный файл setXY.bat со следующими строками:
@ECHO OFF
IF EXIST G:\flashd1.let SUBST X: G:\
IF EXIST F:\flashd1.let SUBST X: F:\
IF EXIST G:\flashd2.let SUBST Y: G:\
IF EXIST F:\flashd2.let SUBST Y: F:\
После выполнения такого файла у вас появятся диски X: и Y: Но если такой файл выполнить повторно, команда SUBST выдаст сообщение об ошибке – ведь диски X: и Y: уже существуют.
Желательно обойти выполнение SUBST, если виртуальные диски X: и Y: уже созданы, (или удалять их, используя SUBST с параметром –d перед подключением ). Модифицируем командный файл с использованием GOTO - передачи управления строке пакетного файла по метке.
GOTO метка
Метка должна находиться в отдельной строке и начинаться с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало сообщений об ошибке:
@ECHO OFF
REM если не существует X: - то перейдем на метку SETX
IF NOT EXIST X:\ GOTO SETX
REM если существует X: - перейдем на проверку наличия Y:
GOTO TESTY
:SETX
IF EXIST G:\flashd1.let SUBST X: G:\
IF EXIST F:\flashd1.let SUBST X: F:\
:TESTY
REM если Y: существует – завершим командный файл.
IF EXIST Y:\ GOTO EXIT
IF EXIST G:\flashd2.let SUBST Y: G:\
IF EXIST F:\flashd2.let SUBST Y: F:\
REM выход из командного файла
:EXIT
Сообщение об ошибке SUBST исчезло. Признаки ошибок при выполнении команд можно отслеживать и в самом командном файле, анализируя переменную ERRORLEVEL, значение которой формируется при выполнении большинства программ. ERRORLEVEL равно 0, если программа завершилась без ошибок и 1 – при возникновении ошибки. Могут быть и другие значения, если они предусмотрены в выполняемой программе.
В качестве команды в строке командного файла можно использовать также командный файл. Причем, для передачи с возвратом обратно к точке выполнения вызывающего командного файла используется команда CALL . Создадим командный файл test.bat, следующего содержания:
@ECHO OFF
ECHO Вызов 1.bat
CALL 1.bat
ECHO Возврат.
И файл 1.bat, содержащий команду PAUSE, приостанавливающую выполнение командного файла до нажатия любой клавиши.
@ECHO OFF
pause
При выполнении test.bat будет выдано на экран сообщение
Вызов 1.bat
и управление получит 1.bat с командой pause. После начатия клавиши на клавиатуре управление получит командная строка “ECHO Возврат.” и на экран будет выдано
Возврат.
Если же в test.bat убрать CALL , то возврат из файла 1.bat выполняться не будет. Кстати, используя передачу управления командному файлу, можно организовать его зацикливание. Попробуйте добавить в конец файла test.bat строку:
CALL test.bat
Выйти из зацикливания командного файла можно по нажатию комбинации CTRL-Break. Возможно использование команды CALL для вызова процедуры внутри командного файла. В этом случае в качестве аргумента используется не имя внешнего файла, а метка: .... call :proc1 .... :proc1 .... exit ....