Использование пакетных файлов для Windows. Командные файлы windows


НОУ ИНТУИТ | Лекция | Язык интерпретатора Cmd.exe. Командные файлы

Аннотация: Описываются возможности языка командных файлов: работа с переменными и параметрами командной строки, реализация циклов, условных операторов и операторов перехода. Даются примеры обработки текстовых файлов с помощью командных файлов

Язык интерпретатора Cmd.exe. Командные файлы

Язык оболочки командной строки (shell language) в Windows реализован в виде командных (или пакетных) файлов. Командный файл в Windows — это обычный текстовый файл с расширением bat или cmd, в котором записаны допустимые команды операционной системы (как внешние, так и внутренние), а также некоторые дополнительные инструкции и ключевые слова, придающие командным файлам некоторое сходство с алгоритмическими языками программирования. Например, если записать в файл deltmp.bat следующие команды:

C:\ CD %TEMP% DEL /F *.tmp

и запустить его на выполнение (аналогично исполняемым файлам с расширением com или exe), то мы удалим все файлы во временной директории Windows. Таким образом, исполнение командного файла приводит к тому же результату, что и последовательный ввод записанных в нем команд. При этом не проводится никакой предварительной компиляции или проверки синтаксиса кода; если встречается строка с ошибочной командой, то она игнорируется. Очевидно, что если вам приходится часто выполнять одни и те же действия, то использование командных файлов может сэкономить много времени.

Вывод сообщений и дублирование команд

По умолчанию команды пакетного файла перед исполнением выводятся на экран, что выглядит не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование команд, идущих после нее (сама команда ECHO OFF при этом все же дублируется). Например,

REM Следующие две команды будут дублироваться на экране … DIR C:\ ECHO OFF REM А остальные уже не будут DIR D:\

Для восстановления режима дублирования используется команда ECHO ON. Кроме этого, можно отключить дублирование любой отдельной строки в командном файле, написав в начале этой строки символ @, например:

ECHO ON REM Команда DIR C:\ дублируется на экране DIR C:\ REM А команда DIR D:\ — нет @DIR D:\

Таким образом, если поставить в самое начало файла команду

то это решит все проблемы с дублированием команд.

В пакетном файле можно выводить на экран строки с сообщениями. Делается это с помощью команды

Например,

@ECHO OFF ECHO Привет!

Команда ECHO. (точка должна следовать непосредственно за словом "ECHO") выводит на экран пустую строку. Например,

@ECHO OFF ECHO Привет! ECHO. ECHO Пока!

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

Используя механизм перенаправления ввода/вывода (символы > и >>), можно направить сообщения, выводимые командой ECHO, в определенный текстовый файл. Например:

@ECHO OFF ECHO Привет! > hi.txt ECHO Пока! >> hi.txt

С помощью такого метода можно, скажем, заполнять файлы-протоколы с отчетом о произведенных действиях. Например:

@ECHO OFF REM Попытка копирования XCOPY C:\PROGRAMS D:\PROGRAMS /s REM Добавление сообщения в файл report.txt в случае REM удачного завершения копирования IF NOT ERRORLEVEL 1 ECHO Успешное копирование >> report.txt
Использование параметров командной строки

При запуске пакетных файлов в командной строке можно указывать произвольное число параметров, значения которых можно использовать внутри файла. Это позволяет, например, применять один и тот же командный файл для выполнения команд с различными параметрами.

Для доступа из командного файла к параметрам командной строки применяются символы %0, %1, …, %9 или %*. При этом вместо %0 подставляется имя выполняемого пакетного файла, вместо %1, %2, …, %9 — значения первых девяти параметров командной строки соответственно, а вместо %* — все аргументы. Если в командной строке при вызове пакетного файла задано меньше девяти параметров, то "лишние" переменные из %1 – %9 замещаются пустыми строками. Рассмотрим следующий пример. Пусть имеется командный файл copier.bat следующего содержания:

@ECHO OFF CLS ECHO Файл %0 копирует каталог %1 в %2 XCOPY %1 %2 /S

Если запустить его из командной строки с двумя параметрами, например

copier.bat C:\Programs D:\Backup

то на экран выведется сообщение

Файл copier.bat копирует каталог C:\Programs в D:\Backup

и произойдет копирование каталога C:\Programs со всеми его подкаталогами в D:\Backup.

При необходимости можно использовать более девяти параметров командной строки. Это достигается с помощью команды SHIFT, которая изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение %2 – в %1 и т.д. Замещаемому параметру %9 присваивается значение параметра, следующего в командной строке за старым значением %9. Если же такой параметр не задан, то новое значение %9 — пустая строка.

Рассмотрим пример. Пусть командный файл my.bat вызван из командной строки следующим образом:

Тогда %0=my.bat, %1=p1, %2=p2, %3=p3, параметры %4 – %9 являются пустыми строками. После выполнения команды SHIFT значения замещаемых параметров изменятся следующим образом: %0=p1, %1=p2, %2=p3, параметры %3 – %9 – пустые строки.

При включении расширенной обработки команд SHIFT поддерживает ключ /n, задающий начало сдвига параметров с номера n, где n может быть числом от 0 до 9.

Например, в следующей команде:

параметр %2 заменяется на %3, %3 на %4 и т.д., а параметры %0 и %1 остаются без изменений.

Команда, обратная SHIFT (обратный сдвиг), отсутствует. После выполнения SHIFT уже нельзя восстановить параметр (%0), который был первым перед сдвигом. Если в командной строке задано больше десяти параметров, то команду SHIFT можно использовать несколько раз.

В командных файлах имеются некоторые возможности синтаксического анализа заменяемых параметров. Для параметра с номером n (%n) допустимы синтаксические конструкции (операторы), представленные в табл. 3.1.

Таблица 3.1. Операторы для заменяемых параметров Операторы Описание
%~Fn Переменная %n расширяется до полного имени файла
%~Dn Из переменной %n выделяется только имя диска
%~Pn Из переменной %n выделяется только путь к файлу
%~Nn Из переменной %n выделяется только имя файла
%~Xn Из переменной %n выделяется расширение имени файла
%~Sn Значение операторов N и X для переменной %n изменяется так, что они работают с кратким именем файла
%~$PATH:n Проводится поиск по каталогам, заданным в переменной среды PATH, и переменная %n заменяется на полное имя первого найденного файла. Если переменная PATH не определена или в результате поиска не найден ни один файл, эта конструкция заменяется на пустую строку. Естественно, здесь переменную PATH можно заменить на любое другое допустимое значение

Данные синтаксические конструкции можно объединять друг с другом, например:

%~DPn — из переменной %n выделяется имя диска и путь,

%~NXn — из переменной %n выделяется имя файла и расширение.

Рассмотрим следующий пример. Пусть мы находимся в каталоге C:\TEXT и запускаем пакетный файл с параметром Рассказ.doc ( %1=Рассказ.doc ). Тогда применение операторов, описанных в табл. 3.1, к параметру %1 даст следующие результаты:

%~F1=C:\TEXT\Рассказ.doc %~D1=C: %~P1=\TEXT\ %~N1=Рассказ %~X1=.doc %~DP1=C:\TEXT\ %~NX1=Рассказ.doc

www.intuit.ru

Командные файлы Windows часть 2

03:56 pm - Командные файлы Windows часть 2

Выполнение каких либо действий в заданный интервал времени.

    Речь пойдет не о запуске командного файла в определенное время, а о выполнении какой-то его части только в определенный интервал времени, например, с 10:00 до 12:00. Решения данной задачи потребует сравнения текущего времени с указанным промежутком. Для примера, создадим командный файл, выполняющий запуск стандартного калькулятора Windows , только в том случае, если он запущен в интервале времени от 10:00 до 12:00. Необходимо получить текущее время и выполнить проверку того, что оно не больше 12:00 и не меньше 10:00 .Команда IF позволяет выполнить сравнение строк при использовании формата:

IF /I строка1 оператор_сравнения строка2 команда

где оператор_сравнения принимает следующие значения:

EQL - равно NEQ - не равно LSS - меньше LEQ - меньше или равно GTR - больше GEQ - больше или равно а ключ /I, если он указан, задает сравнение текстовых строк без учетарегистра. Этот обычно используется для сравнения текстовых строк в форме строка1==строка2. Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется их сравнение. Следовательно, для решения нашей задачи нужно сравнить строку из первых двух символов значения переменной TIME ( чч:мм:сс ) с заданным диапазоном :REM Время меньше 12:00 - перейти на анализ второго условия, иначе - выход if %time:~0,2% lss 12 goto tst2 exit :tst2 Rem Время больше 10:00 - перейти к выполнению, меньше - завершить работу выполнив exit if %time:~0,2% gtr 10 goto excalc exit :excalc calc.exe

Подобным же образом можно организовать проверку по дате, учитывая тот факт, что для данного способа сравнения необходимо использовать только числовые значения из переменных.

Пример создания архива каталога "Мои Документы".

    Этот командный файл создает архивы содержимого папки "Мои Документы" пользователей Win2K/XP, размещая их в каталоги

C:\ARHIV\Мои документы\Имя пользователя\Дата\время

Используются переменные окружения USERPROFILE, USERNAME, WINDIR.Если вы разобрались с предыдущим примером, содержимое данного командного файла не должно вызывать особых затруднений, поскольку в нем присутствуют комментарии ( rem ), поясняющие в короткой форме смысл и назначение последующих строк:

@echo off

rem Задается переменная FROM - откуда брать данные для архивирования

set FROM=%USERPROFILE%\Мои Документы

rem Задается переменная TO - куда помещать архивы

set TO=C:\arhiv\Мои документы\%USERNAME%

rem Создадим каталог ТО

md "%TO%\"

rem Сформируем имя подкаталога из текущей даты

set VDATE=%date:~-10%

rem Сформируем имя файла архива из текущего времени - 12:00:00.99

rem отбросим сотые доли секунды и заменим символ : на символ . Результат - 12.00.00

set vtime=%TIME:~0,-3%

set vtime=%vtime::=.%

rem Создадим подкаталог для файла архива

md "%TO%\%VDATE%"

rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками

rem вариант для архиватора ARJ : arj.exe a -r "%TO%\%VDATE%\%VTIME%.arj" "%FROM%\*.*"

rem При использовании архиватора RAR:

rar.exe a -r "%TO%\%VDATE%\%VTIME%.rar" "%FROM%\*.*"

Если у вас возникнут проблемы связанные с неверной кодировкой символов русского алфавита в именах файлов и каталогов, попробуйте воспользоваться командой CHCP для смены кодовой страницы

chcp 866 - установить кодовую страницу 866 (DOS-кодировка)

chcp 1251 - установить кодовую страницу 1251 (Windows-кодировка)

Этот командный файл можно значительно сократить, убрав ненужные переменные VTIME и VDATE, которые в данном примере, используются лишь для того ,чтобы скрипт имел более наглядный и простой для понимания вид.

В операционных системах Windows XP/Vista/7 формат даты по умолчанию не содержит название дня недели. Если есть необходимость получить это значение без изменения настроек системы и использования дополнительного программного обеспечения, можно воспользоваться сценарием Hindows Script Host (WSH).

- создаем файл сценария для получения названия дня недели, пусть с именем weekday.vbs, и содержащим строку вывода на экран результата выполнения функции WeekDayName

WScript.Echo WeekDayName(Weekday(Now), True)

- выполняем скрипт WSH с использованием консольной версии программы обработки сценариев cscript.exe и подавлением лишних сообщений (ключ //nologo)

cscript //nologo weekday.vbs

Пример командного файла для получения названия дня недели с использованием функции WeekDayName :

ECHO OFF

echo WScript.Echo WeekDayName(Weekday(Now), True) > weekday.vbs

for /f "Tokens=1*" %%i in ('cscript /nologo weekday.vbs') DO set DayName=%%i

echo %DayName%

REM Дальше можно использовать переменную DayName, а файл weekday.vbs - удалить

REM ERASE dayname.vbs

REM ...

Возможности, предоставляемые в сценариях WSH, намного превосходят возможности командной строки CMD, поэтому, если задачу необходимо решить с помощью командного файла, можно воспользоваться приемом, как в рассмотренном выше примере.

Изменение даты и времени файлов или папок.

    В Windows, к сожалению, не существует стандартного консольного средства для изменения даты и времени создания, доступа и модификации файлов и папок . Кто имел дело с Unix/Linux знает, что в этих операционных системах имеется простая и удобная утилита touch с помощью которой можно изменить время последнего доступа или время модификации файла на текущее значение или на значение времени, заданное в качестве аргумента командной строки. Если файл не существует, утилита создает пустой файл с указанным именем и устанавливает время создания , последнего изменения, и последнего доступа. Поэтому, нередко touch используют для создания пустых файлов.

Не секрет, что командная оболочка Unix/Linux значительно превосходит по своим возможностям командную строку Windows, поэтому, вполне понятно появление пакета UNIX Shell and Utilities для Windows NT и старше. Этот пакет представляет собой Windows-версии наиболее популярных утилит из среды Unix/Linux , которые могут выполняться как консольные команды в среде оболочки пользователя (в среде модуля sh.exe, входящего в пакет) или как исполняемые файлы в командной строке Windows. В набор входит более 200 программ от компании Mortice Kern Systems (MKS), рекомендуемых Microsoft в качестве средства миграции с Unix на Windows.

Благодаря набору UNIX Shell and Utilities многие, не решаемые в среде командной строки Windows задачи, можно решить с помощью unix-подобных утилит. И в том, числе, задачу изменения даты и времени создания, модификации и доступа файла или папки с помощью утилиты touch.exe Скачать, около 50Кб

Справку по работе с touch.exe можно получить при запуске утилиты с принятым в Unix ключом "--help"

touch.exe --help

При этом пользователю выводится краткая подсказка

touch [-acm] [-r|-f файл] [-t [[CC]YY]MMDDhhmm.[SS]] file файл

-a - Устанавливает время последнего доступа ( access )к файлу. Время последнего изменения не устанавливается, если явно не задан ключ -m ( modify )

-c - Указывает утилите не создавать файл, если он не существует.

-m - Устанавливает время последнего изменения файла.

-r file - Использовать значения времени из файла, заданного аргументом file.

-t time - Устанавливает время последнего изменения (модификации) и доступа в соответствии с указанным форматом date_time.

Формат даты, указанный в ключе -t задается в соответствии с шаблоном [[СС]YY]MMDDhhmm[.SS]:

СС - первые две цифры года (век).

YY - последние две цифры года.

MM - двузначный номер месяца.

DD - двузначный номер дня.

hh - значение часов даты.

mm - значение минут даты.

SS - значение секунд даты.

    Примеры использования утилиты touch.exe в командной строке Windows:

touch C:\folder\myfile.txt - изменить время доступа и модификации файла C:\folder\myfile.txt на текущее. Если файл не существует, он будет создан с нулевой длиной и текущим временем создания, модификации и доступа.

touch C:\folder - изменить время доступа и модификации папки C:\folder на текущее.

touch -f C:\ntldr C:\folder - изменить время доступа и модификации папки C:\folder на время, установленное для файла C:\ntldr

touch -t 199803080102.00 C:\folder - установить для существующей папки "C:\folder" значение даты и времени модификации - 1998г., 8 марта, 1 час : 2 минуты :00 секунд

touch -t 1112.30 C:\folder - установить для существующей папки "C:\folder" значение даты и времени модификации - текущая дата, 11 час : 12 минут :30 секунд

touch -a -t 2222.20 C:\folder - изменить только время доступа, время модификации не изменяется.

    Кроме утилиты touch для модификации времени файлов (но не папок) можно воспользоваться простой и удобной программой Юрия Усманова setdate . Скачать,архив zip размером около 16Кб).

Примеры использования:

setdate.exe -c C:\1.txt 22.11.2011 - установить для файла C:\1.txt дату создания 22.11.2011

setdate.exe -m C:\1.txt 22.11.2011 - установить для файла C:\1.txt дату изменения (модификации) 22.11.2011

setdate.exe -a C:\1.txt 22.11.2011 - установить для файла C:\1.txt дату доступа 22.11.2011

setdate.exe -d C:\1.txt 22.11.2011 - установить для файла C:\1.txt все даты 22.11.2011

Выполнение команд по расписанию.

В операционных системах WINDOWS 2000/XP и старше существует утилита командной строки AT.EXE, позволяющая управлять задачами для планировщика заданий Windows, и таким образом, выполнить команду или пакетный файл в указанное время на локальном или удаленном компьютере.

Естественно, для успешного функционирования команды AT необходимо, чтобы была запущена системная служба Планировщик заданий (обычно она существует и запускается автоматически при стандартной установке системы).

Примеры команды

AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]

AT [\\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[,...] | /NEXT:день[,...]] "команда"

\\имя_компьютера - имя удаленного компьютера. Если этот параметр опущен, задача относится к локальному компьютеру.

код - порядковый номер запланированной задачи. Указывается если нужно отменить уже запланированную задачу с помощью ключа /delete.

/delete - отменить запланированную задачу. Если код задачи опущен,отменяются все задачи, запланированные для указанногокомпьютера.

/yes - не будет запроса на подтверждение при отмене всехзапланированных задач.

время - Время запуска команды.

/interactive - интерактивный режим, разрешение взаимодействия задачи с пользователем. Задачи, запущенные без этого ключа невидимы для пользователя компьютера.

/every:день[,...] Запуск задачи осуществляется по указанным дням недели или месяца. Если дата опущена, используется текущий день

месяца.

/next:день[,...] Задача будет запущена в следующий указанный день недели (например в следующий четверг). Если дата опущена, используется текущий день месяца.

"команда" - Команда или имя командного файла.

Примеры использования:</li>
  • Просмотр списка запланированных задач:
  • AT

  • - Удаление уже спланированных задач:
  • AT 3 /DELETE - удаление задачи с номером 3

    AT /DELETE /YES - удаление всех задач без запроса подтверждения

  • Создание интерактивных задач
  • at \\SERVER 15:21 /interactive notepad.exe - на компьютере SERVER в 15:21 запустить видимое для пользователя приложение "Блокнот" (notepad.exe)

    AT 15:30 /interactive regedit.exe - в 15:30 запустить видимый редактор реестра на своем компьютере.

  • Аналог "будильника" - всплывающие окна с текстом, напоминающие о необходимости каких-либо действий. Для посылки сообщения удаленному пользователю используется утилита NET.EXE в режиме отправки сообщения SEND. На компьютерах должна быть запущена служба сообщений, иначе NET SEND не будет работать. В ОС Windows Vista и более поздних, отправку сообщений нужно выполнять с помощью утилиты msg.exe, поскольку команда net send в этих ОС больше не поддерживается. Описание команды MSG
  • AT 17:30 net.exe send COMP Пора домой - в 17:30 отправить сообщение "Пора домой" пользователю компьютера COMP

    AT 17:30 msg.exe * /server:COMP Пора домой - то же, что и в предыдущем случае, но с использованием команды msg

    AT 17:39 msg.exe * Пора домой - запланировать на 17:39 отправку текстового сообщения "Пора домой" всем пользователям данного компьютера в среде Windows Vista / 7 / 8

    AT \\PROXY 15:30 net.exe send COMP2 Test Message - создать задание на компьютере PROXY, чтобы в 15:30 им было отправлено сообщение "Test Message" на компьютер COMP2

    AT 15:45 net.exe send имя своего компьютера Task Scheduler test - в 15:45 на своем компьютере показать сообщение "Task Scheduler test"

    Для доступа к удаленному компьютеру и создания заданий, пользователь, выполняющий команду AT должен обладать соответствующими правами по отношению к удаленной системе.

    Создаваемые командой AT задачи доступны для обработки в среде пользователя с помощью оснастки "Назначенные задания" Windows.

    Пуск - Панель управления - Назначенные задания - здесь можно просматривать, изменять и удалять созданные командой AT задачи. В Windows Vista / 7 используется меню - Панель управления - Администрирование - Планировщик заданий.

    Остановка и запуск системных служб.

     

    Для остановки и запуска служб из командной строки, в любой версии Windows, можно воспользоваться командой NET.EXE

    NET.EXE STOP < имя службы >

    NET.EXE START < имя службы >

    В качестве параметра команды можно использование как короткое, так и полное имя службы ("Dnscache" - короткое, "DNS-клиент" - полное имя службы). Имя службы, содержащее пробелы заключается в двойные кавычки. Пример перезапуска службы "DNS-клиент"

    net stop "DNS-клиент"

    net start "DNS-клиент"

    То же, с использованием короткого имени:

    net stop Dnscache

    net start Dnscache

    Полное имя службы можно скопировать из "Панель управления" - "Администрирование" - "Службы" - Имя службы - "Свойства" - "Выводимое имя".

    То же самое, но в режиме командной строки: "Пуск" - "Выполнить" - services.msc.

    Для управления службами гораздо удобнее воспользоваться утилитой PsService.exe из утилит PsToolsУтилита не требует установки и работает в любой OS Windows. Кроме запуска и остановки, позволяет выполнить поиск конкретной службы на компьютерах локальной сети, опросить состояние и конфигурацию службы, изменить тип запуска, приостановить службу, продолжить, перезапустить.

        Для работы с системными службами в Windows XP и старше, можно использовать утилиту sc.exe, позволяющую не только остановить/запустить службу, но и опросить ее состояние, параметры запуска и функционирования, изменить конфигурацию, а также работать не только с системными службами, но и с драйверами. При наличии соответствующих прав, можно управлять службами не только на локальной, но и на удаленной машине. Примеры:

    sc.exe stop DNSCache - остановить службу DNSCache на локальном компьютере.

    sc \\192.168.0.1 query DNSCache - опросить состояние службы DNSCache на компьютере c IP-адресом 192.168.0.1

    sc \\COMP start DNSCache запустить службу DNSCache на компьютере COMP

    Подсказку по работе с утилитой можно получить, введя:

    sc /?

    Выдача значения переменной ERRORLEVEL .

       Этот простенький командный файл выдаст на экран значение переменной ERRORLEVEL по конкретной командной строке. Вначале выполняется проверка на наличие хотя бы одного входного параметра, и если ничего не задано, выдается сообщение об ошибке и происходит завершение по команде exit. Если же хотя бы один параметр задан, то входные параметры считаются командной строкой и выполняются, а значение ERRORLEVEL выдается с помощью команды ECHO. Содержимое файла (я назвал его echoEL.bat):

    @echo off

    if "%1" NEQ "" GOTO PARMOK

    ECHO Нужно задать командную строку для определения ERRORLEVEL

    exit

    :PARMOK

    %1 %2 %3 %4 %5 %6 %7 %8

    ECHO %1 %2 %3 %4 %5 %6 %7 %8 ERRORLEVEL=%ERRORLEVEL%

    Примеры запуска: echoEL.bat NET SHARE     - будет выполнена команда NET SHARE (выдать список разделяемых сетевых ресурсов) и выдан код ERRORLEVEL

    echoEL.bat NET SHARE X"="C:\     - будет выполнена команда NET SHARE X:=C:\ (создать разделяемый сетевой ресурс с именем X, и путем в корневой каталог диска C:) Обратите внимание на то, что символ = заключен в двойные кавычки.

        Перечисленные выше варианты задают корректную командную строку. Но попробуйте задать неверный параметр для NET.EXE или вообще несуществующую команду и вы увидите, какое значение примет ERRORLEVEL.

    Диалог с пользователем

       Для диалога с пользователем можно использовать команду:

    SET /P имя переменной = текст

    при выполнении которой, на экран выдается текстовое сообщение < текст > и ожидается ввод ответа. Пример - выполним запрос пароля и присвоим его значение переменной "pset":

    set /p pset="Enter password - "

    echo Password is - %pset%

    Недостатком данного способа является невозможность продолжения выполнения командного файла при отсутствии ответа пользователя, поэтому очень часто вместо set используются сторонние программы. В составе операционных систем семейства Microsoft Windows имеется утилита командной строки CHOICE позволяющая довольно просто реализовать диалог с пользователем и проанализировать введенные им данные, однако в разных версия ОС утилита может присутствовать в стандартной поставке ( Windows 7 ) или входить в наборы дополнительных программных инструментов ( Resource Kit Windows XP ) Простейшая версия - CHOICE.COMСкачать (1.7кб), работающая во всех ОС семейства Windows.

    CHOICE выдает пользователю текстовое сообщение и ожидает выбора одного из заданных вариантов ответа (нажатия клавиш на клавиатуре). По результатам выбора формируется переменная ERRORLEVEL, значение которой равно порядковому номеру выбора. По умолчанию вариантов выбора два - Y или N. Если ответ равен Y - то ERRORLEVEL=1, если N - то ERRORLEVEL=2. Можно использовать более 2-х вариантов выбора и есть возможность задать выбор по умолчанию, когда пользователь за определенное время не нажал ни одной клавиши. Формат командной строки:

    CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]

    /C[:]choices   -   определяет допустимые варианты выбора. Если не задано - YN

    /N                 -   не выдавать варианты выбора.

    /S                  -   строчные и заглавные буквы отличаются.

    /T[:]c,nn        -   Выбор по умолчанию равен "c" через "nn" секунд

    text                - Строка текста выводимая в качестве запроса

    Создадим командный файл, демонстрирующий использование CHOICE. Он будет реагировать на нажатие клавиш "1","2",3" и "0" .При нажатии "0" выполняется завершение, а при нажатии остальных - сообщение пользователю. Если в течении 10 секунд ничего не нажато - завершение.

    @ECHO OFF

    :CHOICE

    CHOICE /C:1230 /T:0,10 Ваш вариант

    IF %ERRORLEVEL% EQU 4 GOTO EXIT

    echo Ваш выбор=%ERRORLEVEL%

    GOTO CHOICE

    :EXIT

        Теперь, используя CHOICE вы можете создавать командные файлы, логика работы которых может определяться пользователем.

    Задержки в командных файлах

       Когда-то, еще в DOS, для организации ожидания в командном файле использовалась команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог \system32 и использовать в ваших командных файлах.

    :SLEEP N     - где N - количество секунд для задержки.

        Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99):

    choice.com /T:y,10 /N     - задержка на 10 секунд

        Более удобный способ основан на использовании утилиты ping.exe для петлевого интерфейса. Пинг для петлевого интерфейса (имя хоста - localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е. практически мгновенно, а интервал между посылкой icmp-пакетов составляет 1 секунду. Указывая количество "пингов" с помощью ключа "-n" можно получить задержку на n секунд:

    ping 127.0.0.1 -n 30 > nul     - даст задержку на 30 секунд

    Перенаправление вывода команды ping на фиктивное устройство nul ( > nul ) позволяет убрать сообщения утилиты ping.exe с экрана.

    В составе команд CMD Windows 7 имеется команда TIMEOUT для организации режима ожидания заданного интервала времени, либо до нажатия любой клавиши на клавиатуре. Описание команды - по ссылке "Список команд CMD Windows"

    Определение доступности IP-адреса

       Для проверки доступности сетевого узла используется упоминаемая выше стандартная утилита ping.exe. Утилита выполняет отправку ICMP-пакета на проверяемый узел (эхо-запрос) и ожидает ответный пакет (эхо-ответ). Результат проверки никак не отражается в переменной ERRORLEVEL и может быть получен только в данных стандартного вывода ping. Ненулевое значение ERRORLEVEL утилита ping.exe формирует только в том случае, если заданы ошибочные параметры командной строки. Иными словами, в некоторых случаях, нужный результат выполнения определенной команды нельзя определить по значению переменной ERRORLEVEL, и приходится анализировать, например, результат текстового вывода.

    Если внимательно посмотреть на сообщения программы ping.exe при опросе доступного и недоступного узла, то можно заметить, что они значительно отличаются :

    ping 456.0.0.1 - ping на несуществующий адрес

    Ответ на такую команду может отличаться от конкретной версии утилиты, и может быть приблизительно таким

    При проверке связи не удалось обнаружить узел 456.0.0.1. Проверьте имя узла и повторите попытку.

    ping yandex.ru - ping на адрес узла yandex.ru

    Ответ на ping доступного узла:

    Обмен пакетами с yandex.ru [87.250.250.11] по 32 байт:

    Ответ от 87.250.250.11: число байт=32 время=10мс TTL=55

    Таким образом, для решения задачи определения доступности узла в командном файле, достаточно проанализировать характерные слова в выводе ping.exe при успешном ответе. Наиболее характерно в данном случае наличие слова TTL. Оно никогда не встречается при возникновении ошибки и состоит всего лишь из символов английского алфавита. Для поиска "TTL" в результатах ping.exe удобнее всего объединить ее выполнение в цепочку с командой поиска строки символов FIND.EXE (конвейер ping и find). Справку по использованию можно получить командой

    find /?

    Поиск текстовой строки в одном или нескольких файлах.

    FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "строка" [[диск:][путь]имя_файла[ ...]]

    /V Вывод всех строк, НЕ содержащих заданную строку.

    /C Вывод только общего числа строк, содержащих заданную строку.

    /N Вывод номеров отображаемых строк.

    /OFF[LINE] Не пропускать файлы с установленным атрибутом "Автономный".

    /I Поиск без учета регистра символов.

    "строка" Искомая строка.

    [диск:][путь]имя_файла

    Один или несколько файлов, в которых выполняется поиск.

    Если путь не задан, поиск выполняется в тексте, введенном с клавиатуры

    либо переданном по конвейеру другой командой.

    Как видно из справки, find.exe можно использовать для поиска нужной строки символов в тексте, переданном по конвейеру командой ping.exe. Если текст найден, значение переменной ERRORLEVEL будет равно 0

    ping -n 1 COMPUTER | find /I "TTL" > nul

    if %ERRORLEVEL%==0 goto LIVE

    ECHO computer не доступен

    подпрограмма обработки недоступного состояния

    ...

    Exit

    :LIVE - начало подпрограммы обработки состояния доступности узла

    ...

    ...

    В конвейер добавлена команда перенаправления стандартного вывода на фиктивное устройство nul, т.е. подавление вывода. Ключ -n 1 задает однократный опрос узла COMPUTER для ping.exe.

    Определение текущей версии Windows.

       Так же, как и в предыдущем примере, для определения версии операционной системы в процессе выполнения командного файла, можно воспользоваться поиском определенных фрагментов текста в результатах выполнения команд, отображающих сведения о системе. Например, во всех операционных системах семейства Windows ( и даже в DOS ) существует специальная команда VER, предназначенная для отображения сведений о версии ОС. В результате выполнения команды, например, в среде Windows XP, отображается текст:

    Microsoft Windows XP [Версия 5.1.2600]

    В среде Windows 7, текст отличается:

    Microsoft Windows [Version 6.1.7600]

    Таким образом, результат выполнения команды VER в среде разных версий Windows, всегда содержит определенный текст, характерный только для данной ОС, и задача определения версии решается довольно просто:

    @echo off set curr_OS= REM ver | find /i "5.0" if %errorlevel% == 0 set curr_OS=Windows 2000 REM ver | find /i "5.1" if %errorlevel% == 0 set curr_OS=Windows XP REM ver | find /i "5.2.3" if %errorlevel% == 0 set curr_OS=Windows Server 2003 REM ver|find /i "6.0" if %errorlevel% == 0 set curr_OS=Windows Vista REM ver | find /i "6.1">nul if %errorlevel% == 0 set curr_OS=Windows 7 REM if "%curr_OS%"=="" set curr_OS=Unknown echo Текущая версия ОС - %curr_OS%

    Можно также воспользоваться более информативным выводом команды NET CONFIG WORKSTATION. При выполнении в среде Windows XP вывод команды представляет собой следующий текст:

    Имя компьютера \\COMP1 Полное имя компьютера COMP1.Mydomain Имя пользователя USER2 Активная рабочая станция на NetbiosSmb (000000000000) NetBT_Tcpip_{F53DEAF8-0AF5-4875-B565-8ED55C594769} (000D87009D28) Версия программы Windows 2002 Домен рабочей станции Mydomain DNS-имя домена рабочей станции Mydomain Домен входа Mydomain Интервал ожидания открытия COM-порта (с) 0 Отсчет передачи COM-порта (байт) 16 Таймаут передачи COM-порта (мс) 250 Команда выполнена успешно.

    Для среды Windows 7 результат выполнения команды выглядит так:

    Имя компьютера \\COMP1 Полное имя компьютера COMP1.Mydomain Имя пользователя user2 Активная рабочая станция на NetBT_Tcpip_{F53DEAF8-0AF5-4875-B565-8ED55C594769} (000D87009D28) Версия программы Windows 7 Professional Домен рабочей станции Mydomain Домен входа Mydomain Интервал ожидания открытия COM-порта (с) 0 Отсчет передачи COM-порта (байт) 16 Таймаут передачи COM-порта (мс) 250 Команда выполнена успешно.

    Как видим, строка Версия программы . . . тоже может быть использована для определения версии Windows, в среде которой выполняется командный файл. Кроме того, в результатах выполнения команды NET CONFIG WORKSTATION для серверных версий Windows всегда присутствует слово Server.

    @echo off set curr_OS= REM net config workstation | find /i "Windows 2000" if %errorlevel% == 0 set curr_OS=Windows 2000 REM net config workstation | find /i "Windows 2002" if %errorlevel% == 0 set curr_OS=Windows XP REM net config workstation | find /i "Server 2003" if %errorlevel% == 0 set curr_OS=Windows Server 2003 REM net config workstation|find /i "Windows Vista" if %errorlevel% == 0 set curr_OS=Windows Vista REM net config workstation | find /i "Windows 7">nul if %errorlevel% == 0 set curr_OS=Windows 7 REM Плюс поиск по "Professional" net config workstation | find /i "Версия программы" | find "Professional" if errorlevel 0 if not errorlevel 1 set curr_OS=Windows 7 PRO REM Если версия неизвестна: if "%curr_OS%"=="" set curr_OS=Unknown echo %curr_OS%

    Поиск компьютеров с запущенным приложением

       Для реализации этого скрипта используются утилиты из пакета PSTools(краткое описание).

    Создадим командный файл, выполняющий поиск в локальной сети компьютеров с выполняющейся программой, имя которой (начальная часть имени) задается в качестве параметра при запуске,например, game . При обнаружении будет послано сообщение на компьютер ADMINCOMP и обнаруженное приложение будет принудительно завершено. Для поиска будем использовать утилиту Pslist.exe и анализировать ее код возврата. Значение переменной ERRORLEVEL равное нулю означает, что утилита обнаружила на удаленном компьютере процесс, удовлетворяющий условиям поиска. Имя процесса для поиска будем задавать в качестве параметра при запуске командного файла. Присвоим нашему командному файлу имя psl.bat. Запуск с параметром будет выглядеть следующим образом:

    psl.bat game

       Для начала, нужно проверить, задан ли параметр в командной строке при запуске, и, если не задан, выдадим сообщение пользователю и завершим выполнение. Если же параметр задан - перейдем на метку " PARMOK ":

    @echo off

    if "%1" NEQ "" GOTO PARMOK

    ECHO Нужно задать имя процесса для поиска

    exit

    :PARMOK

       Теперь нужно обеспечить последовательное формирование IP-адресов компьютеров для командной строки PSlist. Проще всего, это можно сделать с помощью присвоения временной переменной окружения (действительной только на время выполнения командного файла), значения постоянной составляющей адреса (например - 192.168.0.) и вычисляемого значения младшей части (например, в диапазоне 1-254).

    Например, будем считать, что нам необходимо просканировать компьютеры в диапазоне адресов:

    192.168.0.1   -   192.168.0.30:

    set IPTMP=192.168.0. - старшая часть адреса

    set /A IPLAST=1 - младшая часть. Ключ /A означает вычисляемое числовое выражение

    set IPFULL=%IPTMP%%IPLAST% - значение полного IP-адреса.

       Командная строка для PSlist будет выглядеть cледующим образом:

    pslist \\%IPFULL% %1

       Теперь осталось только циклически запускать PSlist, прибавляя в каждом цикле единицу к младшей части адреса, пока ее значение не достигнет 30 и анализировать значение ERRORLEVEL после выполнения. Для анализа результата будем выполнять переход командой:

    GOTO REZULT%ERRORLEVEL%

    обеспечивающей переход на метку REZULT0 при обнаружении процесса и на REZULT1 - при его отсутствии.

       Окончательное содержимое командного файла:

    @echo off

    if "%1" NEQ "" GOTO PARMOK

    ECHO Нужно задать имя процесса для поиска

    exit

    :PARMOK

    set IPTMP=192.168.0.

    rem Зададим начальное значение " хвоста " IP- адреса

    set /A IPLAST=1

    rem M0 - метка для организации цикла

    :M0

    rem Переменная IPFULL - полное значение текущего IP-адреса

    set IPFULL=%IPTMP%%IPLAST%

    rem Если " хвост "больше 30 - на выход

    IF %IPLAST% GTR 30 GOTO ENDJOB

    pslist \\%IPFULL% %1

    GOTO REZULT%ERRORLEVEL%

    :REZULT0

    rem Если найдено приложение- отправим сообщение на ADMINCOMP

    net send ADMINCOMP Запущено %1 - %IPFULL%

    rem И завершим приложение с помощью PSkill

    pskill \\%IPFULL% %1

    :REZULT1

    rem Сформируем следующий IP-адрес

    set /A IPLAST=%IPLAST% + 1

    rem Перейдем на выполнение следующего шага

    GOTO M0

    rem Завершение работы

    :endjob

    exit

       В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях поиска исполняемых файлов, например в каталоге WINDOWS\SYSTEM32. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам. И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, з

    uzverss.livejournal.com

    Командные файлы Windows часть 3

    03:35 pm - Командные файлы Windows часть 3

    Поиск в локальной сети включенных компьютеров.

       В данном примере речь идет о создании командного файла, позволяющего "собрать" список IP-адресов узлов локальной сети, включенных на данный момент времени. Ничего принципиально нового в плане создания командных файлов здесь нет, но тем не менее, задача поиска включенных узлов в локальной сети встречается довольно часто, и решить ее описанными выше способами, с использованием ping.exe и net view удается далеко не всегда, поскольку в современных версиях операционных систем семейства Windows настройки брандмауэров по умолчанию, задают довольно жесткие правила, блокирующие сетевые соединения извне, и ответы на эхо-запрос. Другими словами, включенный в локальную сеть компьютер ( или другое сетевое устройство ) может не отображаться в сетевом окружении Windows и не отвечать на эхо-запросы ( “пинги” ).

    Прием, используемый для получения списка включенных сетевых устройств при решении данной задачи остается прежним – необходимо определить характерные отличия в выходных сообщениях стандартных сетевых утилит в случае, когда устройство выключено, и когда – защищено параноидальными настройками брандмауэра. Для этого можно воспользоваться стандартной командой arp позволяющей просматривать содержимое таблиц разрешения IP-адресов в физические ( MAC ) адреса.

    При любой передаче пакетов IP-протокола с данного компьютера на IP-адрес другого сетевого устройства в локальной сети, программные средства сетевых протоколов выполняют процедуру определения физического адреса сетевого адаптера получателя ( MAC-адрес получателя). Всем сетевым устройствам отправляется специальный широковещательный запрос ( запрос который будет принят всеми компьютерами данной подсети), означающий “чей MAC – адрес соответствует такому-то IP-адресу”. Если какое-либо сетевое устройство опознало свой собственный IP-адрес, оно отправит ARP-ответ, содержащий соответствующий MAC-адрес, который будет сохранен в специальной таблице соответствия адресов IP и MAC, хранящейся в оперативной памяти компьютера, отправившего ARP-запрос. Запись информации в данную таблицу выполняется только при необходимости передачи любых данных по протоколу IP, что можно инициировать, например, пингованием опрашиваемого устройства. Даже если настройками брандмауэра полностью закрыты все соединения извне и блокируется протокол ICMP ( устройство не «пингуется» ) , в буферной памяти сервиса ARP будет присутствовать запись соответствия IP и MAC, если устройство было подключено к локальной сети и участвовало в процедуре разрешения адреса . Таким образом, отсутствие ответа на пинг и наличие записи для пингуемого IP-адреса в ARP-кэш является признаком того, что устройство включено и присутствует в локальной сети.

    Для просмотра содержимого ARP-кэш можно воспользоваться командой

    arp –a - отобразить все записи в таблице ARP

    Пример отображения таблицы ARP:

    Интерфейс: 192.168.0.29 --- 0xa адрес в Интернете Физический адрес Тип 192.168.0.1 00-1e-13-d6-80-00 динамический 192.168.0.3 60-eb-69-08-18-d2 динамический . . . Интерфейс: 192.168.234.1 --- 0xf адрес в Интернете Физический адрес Тип 192.168.234.255 ff-ff-ff-ff-ff-ff статический 224.0.0.22 01-00-5e-00-00-16 статический 224.0.0.252 01-00-5e-00-00-fc статический 239.255.255.250 01-00-5e-7f-ff-fa статический Как видно из приведенной таблицы, например IP – адресу 192.168.0.1 соответствует физический адрес сетевого адаптера, равный 00-1e-13-d6-80-00 . Если же сетевой адаптер с данным адресом будет недоступен, то такой записи в таблице не будет.

    Для понимания алгоритма опроса сети необходимо учесть следующее:

    Разрешение адресов ARP используется только при передаче данных по IP-протоколу в пределах сегмента локальной сети, задаваемого маской. Так, например, для примера с IP адресом 192.168.0.1 и маски 255.255.255.0 это будет диапазон IP от 192.168.0.1 до 192.168.0.254. Обращение же к любому другому адресу будет выполняться через устройства маршрутизации. Т.е. при выполнении команды

    ping yandex.ru

    В таблице ARP будет не MAC-адрес сетевого адаптера, соответствующего IP-адресу узла с именем “yandex.ru”, а MAC-адрес шлюза, через который выполнилась отправка IP-пакета для доставки получателю в “чужой” сети.

    Ниже приводится простой пример командного файла, определяющего список включенных сетевых устройств локальной сети по результатам выполнения команд PING и ARP.

    @ECHO OFF REM Устанавливаем значение переменной IPTMP - постоянной части IP-адреса set IPTMP=192.168.213. REM Переменная N задает количество опрашиваемых IP-адресов set N=128 rem Переменная IPMIN задает начальный IP-адрес. ( полный адрес состоит из IPTMP IPMIN ) set /A IPMIN=1 REM результаты будут записаны в файл oprosipplus.txt ECHO %DATE% Опрос ARP %N% адресов начиная с %IPTMP%%IPMIN% >> oprosipplus.txt rem M0 - метка для организации цикла :M0 rem Переменная IPFULL - полное значение текущего IP-адреса, состоящего из IPTMP И IPMIN set IPFULL=%IPTMP%%IPMIN% rem Если " хвост "больше N - на завершение работы IF %IPMIN% GTR %N% GOTO ENDJOB REM если « хвост » меньше N – продолжим опрос REM выполним пинг и проверим наличие записи в ARP-кэш ping -n 1 %IPFULL% arp -a | find /I "%IPFULL%" REM Если запись есть — запишем это событие в журнал oprosipplus.txt if %ERRORLEVEL%==0 Echo %IPFULL% >> OPROSipPLUS.txt rem Сформируем следующий IP-адрес set /A IPMIN=%IPMIN% + 1 rem Перейдем на выполнение следующего шага GOTO M0 rem Завершение работы :endjob exit

    Работа с дисками, файлами и каталогами.

       Задача - определить буквы дисков, присутствующих в системе и записать результат в файл с именем tstdsk.txt текущего каталога. Можно воспользоваться выполнением команды IF EXIST в цикле FOR для набора из букв латинского алфавита, т.е для каждой буквы диска проверить наличие корневого каталога командой

    IF EXIST буква диска:\

    Сначала создаем пустой файл:

    copy nul tstdsk.txt

    Это действие необязательно, если файла не существует, но в противном случае, результаты будут дописываться в конец файла, и если в нем уже был список дисков от предыдущего исполнения командного файла, то он удвоится. Команда copy nul tstdsk.txt для существующего файла установит нулевой размер данных, т.е. сделает его пустым.

    Окончательно, командный файл будет выглядеть следующим образом:

    copy nul tstdsk.txt

    for %%i in (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) DO (

    if exist %%i:\ echo Disk %%i: exist >> tstdsk.lst

    )

    Для обработки файлов определенного типа, например любых с расширением .tmp используется маска - *.tmp . Так, для удаления всех файлов *.tmp из каталога C:\TEMP можно воспользоваться командой ERASE (или DEL )

    ERASE C:\TEMP\*.TMP

    DEL /Q C:\TEMP\*.TMP

    В масках файлов и каталогов возможно использование частичных имен

    ERASE C:\TEMP\A*.TMP - удалить все файлы с расширением .TMP , имя которых начинается с символа "A"

    DIR *u*.* - выдать список всех файлов и подкаталогов текущего каталога, в имени которых содержится символ "u"

    DIR C:\*t.* - выдать список всех файлов и каталогов в корне диска C: , имя которых заканчивается символом "t"

    Задача - получить список всех каталогов с подкаталогами на логическом диске и записать результат в текстовый файл. Для рекурсивной обработки каталогов диска будем использовать команду FOR /R

    FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]

    Ключ /R означает выполнение команды для каталога [диск:]путь. Если в команде путь не задан, то обработка выполняется для текущего каталога.

    Простой пример удаления файлов с расширением .tmp из каталога C:\TEMP:

    FOR /R C:\temp\ %%i IN (*.tmp) DO del %%i

    При выполнении команды возможно использование подстановочных значений переменной цикла для получения имен дисков, папок, файлов и их характеристик. Полный список возможных значений в случае использования переменной с именем i

    %%~i - из переменной %i удаляются обрамляющие кавычки (")

    %%~fi - переменная %i расширяется до полного имени файла

    %%~di - из переменной %i выделяется только имя диска

    %%~pi - из переменной %i выделяется только путь к файлу

    %%~ni - из переменной %i выделяется только имя файла

    %%~xi - из переменной %i выделяется расширение имени файла

    %%~si - полученный путь содержит только короткие имена

    %%~ai - переменная %i принимает значение атрибутов файла

    %%~ti - переменная %i принимает значение даты /времени файла

    %%~zi - переменная %i принимает значение размера файла

    Возможно объединение нескольких операторов :

    %%~dpi - переменная %i заменяется только на имя диска и путь

    %%~nxi - переменная %i заменяется только на имя файла и его расширение

    %%~fsIi - переменная %i заменяется только на полный путь с краткими именами

    %%~ftzai - переменная %I заменяется на строку, выдаваемуюкомандой DIR

    Значение переменной %%pi внутри цикла команды FOR /R будет последовательно принимать значения путей папок, начиная с заданного набора [диск:]путь.

    Так же, как и в предыдущем примере, желательно обнулить файл с результатами возможного предыдущего запуска данного командного файла:

    REM Обнулить / создать файл для хранения списка каталогов C:\dirlist.txt

    copy nul C:\dirlist.txt

    REM Занесем первой строкой в пустой файл что-то вроде заголовка списка

    Echo *** Список папок на диске C: *** >> C:\dirlist.txt

    REM Сделать текущим каталогом корневой каталог диска C:

    cd c:\

    REM Выполнить для корневого каталога и всех вложенных каталогов, команду ECHO с выдачей значения переменной %%~pi

    for /R %%i in (C) DO (

    ECHO Папка "%%~pi" >> C:\dirlist.txt

    )

    В результате выполнения этого командного файла в корне диска C: будет создан файл dirlist.txt, содержащий список каталогов диска.

    Если в цикле команды FOR /R используются подстановочные значения переменной %%I, то в качестве набора (in) не стоит использовать символ точки.

    Задача - найти на диске файлы с расширением .log и скопировать их в каталог на другом логическом диске - D:\MUSOR

    Желательно проверить наличие каталога D:\MUSOR и при необходимости, создать его командой md, а также удалить из него все файлы, если они существуют, командой del . Затем выполнить переход в корневой каталог диска C: и выполнить в цикле команды FOR поиск файлов по маске *.log во всех подкаталогах.

    REM подготовить каталог D:\MUSOR

    if not exist D:\MUSOR md D:\MUSOR

    REM удалить без подтверждения ( /Q) все файлы из каталога

    del /Q D:\MUSOR\*.*

    REM перейти в корень диска C:

    cd c:\

    REM Выполнить проверку наличия файлов с расширением *.log и скопировать их в

    REM D:\MUSOR

    for /R %%i in (c) DO (

    if exist "%%~dpi*.log" copy "%%~dpi*.log" "D:\MUSOR\*.*"

    )

    Практика использования FOR /R показала, что не стоит использовать в качестве набора для обработки символ "точка" ( конструкция in (.) ), поскольку при использовании подстановочных значений, можно получить возврат из текущего каталога на уровень выше. В данном примере в качестве набора in используется любой не служебный символ. Команду копирования ( copy ) можно заменить на команду перемещения файлов (MOVE), что приведет к удалению файлов источников после копирования в каталог D:\MUSOR.

    Пример с копированием файлов с расширением .log рассмотренный выше имеет некоторые существенные недостатки - не обрабатываются скрытые файлы и папки, и в конечном каталоге, куда копируются файлы ( D:\MUSOR ) не создаются подкаталоги с теми же именами, которые принадлежат путям исходных копируемых файлов. Для устранения этих недостатком можно использовать немного другой скрипт :

    @echo off

    REM подготовить каталог D:\MUSOR - удалить его и его подкаталоги командой RD

    RD /S /Q D:\MUSOR

    REM Создадим каталог заново

    MD D:\MUSOR

    REM Задаем начальную папку для обработки в команде FOR - C:\

    for /R C:\ %%i in (C) DO (

    xcopy "%%~dpi*.log" "D:\MUSOR%%~pi*.*" /H /R /Q /Y

    )

    Для копирования используется команда xcopy с ключами:

    /H - копировать скрытые файлы.

    /R - разрешение на замену файлов с атрибутом "Только чтение"

    /Q - не отображать имена копируемых файлов

    /Y - разрешать перезаписывать существующие файлы.

    Подсказку по использованию команды XCOPY можно получить при вводе:

    help xcopy

    xcopy /?

    При обработке строки xcopy "%%~dpi*.log" "D:\MUSOR%%~pi*.*" /H /R /Q /Y в цикле FOR, в качестве источника копирования будет выбираться C:\текущий путь\*.log а в качестве приемника - D:\MUSOR\текущий путь\имя копируемого файла

    Похожий подход можно использовать для обнаружения и копирования исполняемых файлов (*.exe) из каталога временных файлов, задаваемого переменной TEMP. Бывает полезно для поиска вредоносных программ.

    rem @echo off

    REM подготовить каталог D:\MUSOR - удалить командой RD

    RD /S /Q D:\MUSOR

    REM Создадим каталог заново

    MD D:\MUSOR

    REM Задаем начальную папку для обработки (%TEMP%) и выполняем FOR

    for /R "%TEMP%" %%i in (C) DO (

    xcopy "%%~dpi*.exe" "D:\MUSOR%%~pi*.*" /H /R /Q

    )

       При работе с содержимым каталогов удобно использовать команды запоминания текущего каталога и перехода в новый PUSHD и команды восстановления ранее запомненного текущего каталога POPD

    PUSHD "%TEMP%"

    Echo Работаем в каталоге временных файлов

    REM новый каталог стал текущим и можно использовать относительные пути

    REM Выдать список exe-файлов текущего каталога (%TEMP%) командой DIR

    DIR *.exe

    REM Восстановить путь, запомненный командой PUSHD

    POPD

    )

    Echo Вернулись в исходный каталог

    Работа с графическими приложениями Windows.

       Допустим, вам нужно из одного и того же командного файла запустить notepad.exe и cmd.exe. Если просто вставить строки

    notepad.exe

    cmd.exe

    то после запуска notepad.exe выполнение командного файла приостановится и пока не будет завершен notepad, cmd.exe не запустится. Самый простой способ обойти эту проблему - использовать стандартную команду Windows start. Полную справку по использованию можно получить по:

    start /?

    Попробуйте создать командный файл следующего содержания:

    start /MAX notepad.exe

    start "This is CMD.EXE" /MIN cmd.exe

    net send %COMPUTERNAME% NOTEPAD and CMD running.

    После выполнения этого командного файла вы увидите стартовавшие, в развернутом окне (ключ /MAX) блокнот, в свернутом окне (ключ /MIN) командный процессор CMD.EXE и окно с сообщением net.exe. Стандартный заголовок окна cmd.exe заменен на текст "This is CMD.EXE". Обратите внимание на то что заголовок окна можно опускать, но особенность обработки входных параметров командой start может привести к неожиданным результатам при попытке запуска программы, имя или путь которой содержит пробел(ы). Например при попытке выполнить следующую команду:

    start "C:\Program Files\FAR\FAR.EXE"

    Из-за наличия пробела в пути к исполняемому файлу, строка для запуска FAR.EXE должна быть заключена в двойные кавычки, однако формат входных параметров для start предполагает наличие заголовка окна, также заключаемого в двойные кавычки, в результате чего "C:\Program Files\FAR\FAR.EXE" интерпретируется не как исполняемая программа, а как заголовок окна. Для того, чтобы подобного не случилось нужно использовать любой, пусть даже пустой, заголовок:

    start "" "C:\Program Files\FAR\FAR.EXE"

       

    Если вам все же потребуется расширенное управление окнами приложений, придется воспользоваться сторонним программным обеспечением, например,

    CMDOW Скачать ~15кб

    Сайт разработчика

    Из-за специфического поведения эта утилита большинством антивирусов определяется как вирус, поэтому для нормальной работы нужно занести ее в исключения антивируса.

    Cmdow.exe - крошечная утилита, работающая в Windows NT4/2000/XP/2003 без установки. Позволяет получить список окон, перемещать, изменять размеры, переименовывать, сворачивать/разворачивать, активировать/деактивировать, закрывать, скрывать окна приложений и многое другое. Справку можно получить по команде:

    cmdow /?

    Используется около 30 ключей. Описание на русском языке найдете здесь.Некоторые примеры:

  • Получение информации об окнах:
  • cmdow.exe или cmdow.exe > wins.txt - выдать информацию обо всех окнах на экран или в файл wins.txt

    cmdow /T - выдать информацию об окнах, отображаемых на панели задач рабочего стола.

    Информация содержит колонки:

    Handle - дескриптор окна - шестнадцатеричное число, связанное с данным окном.

    Lev - уровень окна. Приложение может быть многооконным с несколькими уровнями окон.

    Pid - идентификатор процесса, породившего окно.

    -Window status- - состояние окна (видимое - Vis, скрытое - Hid, активное - Act, свернутое - Min и т.п.

    Image - программа вызвавшая окно.

    Caption - название окна

    Манипулировать окнами можно используя название окна, или его дескриптор. Если название окна содержит пробелы, то оно заключается в двойные кавычки. Если имеются русские буквы, то должна использоваться DOS-кодировка. Символ @ используется для указания текущего окна. Иногда проще использовать дескриптор окна, а не его название. Полезным может быть и использование команды поиска по строке find.exe, выполняемой в цепочке с cmdow:

    cmdow.exe | find.exe /I "hid" > wins.txt - в файл wins.txt попадут только строки содержащие шаблон "hid" и мы получим список скрытых окон.

    cmdow.exe | find.exe /I "MyIE" > wins.txt - список окон приложения MyIE

  • Манипулирование окнами.
  • Если вы хотите, чтобы ваш командный файл выполнялся скрытно, добавьте в него строку:

    cmdow @ /HID - скрыть текущее окно

    Ниже командный файл с комментариями, демонстрирующий возможности работы cmdow:

    @ECHO OFF

    REM Свернуть все окна - /MA

    cmdow /MA

    REM запустить cmd.exe с заголовком окна MyCMD

    start "MyCMD" cmd.exe

    REM ждать 5 секунд

    call :wait5s

    REM

    :M1

    REM Скрыть окно MyCMD

    cmdow MyCMD /hid

    call :wait5s

    REM Сделать видимым

    cmdow MyCMD /vis

    call :wait5s

    REM Переместить в верхний левый угол экрана и развернуть окно

    cmdow MyCMD /MOV 0 0

    cmdow Mycmd /max

    call :wait5s

    REM Изменить размер на 320 х 240 и переместить вправо на 320 точек

    cmdow MyCMD /MOV 320 0 /SIZ 320 240

    call :wait5s

    REM Переместить окно в точку с координатами 320 x 240 и изменить размер на 350x50

    cmdow MYCMD /MOV 320 240 /SIZ 350 50

    call :wait5s

    REM Восстановить окно

    cmdow MYCMD /RES

    call :wait5s

    REM Восстановить и сделать активным окно этого командного файла

    cmdow @ /RES /ACT

    ECHO Для завершения нажмите CTRL-C (CTRL-Break)

    call :wait5s

    call :wait5s

    REM Зацикливание - переход к метке :M1

    GOTO M1

    REM Подпрограмма задержки на 5секунд

    :wait5s

    @ping -n 5 localhost > nul

        Пример командного файла, закрывающего окна Проводника Интернет (IEXPLORE.EXE):

    @echo off

    :M1

    for /f "tokens=1-2,8" %%a in ('cmdow') do (

    if /i "%%c"=="IEXPLORE" if "%%b"=="1" cmdow %%a /END > nul

    )

    goto M1

    Работает это следующим образом. Из выходных данных CMDOW берется первое, второе и 8-е поля. Первое - дескриптор окна (Handle), второе - уровень (Lev), третье - имя программы (Image). В цикле выполняется cmdow и если в ее выводе имеется строка, где имя программы IEXPLORE и уровень окна 1 выполняется cmdow <дескриптор> /END.Пока этот командный файл выполняется, запустить "Обозреватель интернета" не получится. А если в начало командного файла добавить "cmdow @ /hid" - то будет скрыто и его окно.

    Перекодировка текстовых файлов.

       В рассматриваемом примере нужно преобразовать исходный текстовый файл в DOS-кодировке в новый текстовый файл в Windows-кодировке. В качестве механизма перекодировки используется смена кодовой страницы командой CHCP и построчная выдача содержимого исходного файла командой ECHO с перенаправлением вывода в новый файл. Для DOS-кодировки используется кодовая страница 866, для Windows-кодировки - 1251. В примере исходный файл называется 866.txt, а файл с перекодированными данными - 1251.txt

    @echo off

    chcp 866 >nul

    for /f "tokens=*" %%i in (866.txt) do call:to1251 "%%i"

    exit

    :to1251

    chcp 1251 >nul

    echo %~1 >>1251.txt

    chcp 866 >nul

    exit /b

    Аналогичный подход можно использовать и для преобразования текста из Windows - кодировки ( кодовая страница 1251) в DOS-кодировку (кодовая страница 866). Естественно, такая перекодировка не может учитывать пустые строки и форматирование текста с помощью спецсимволов, поскольку команда ECHO не позволяет работать с такими форматами данных.

    Своеобразным современным стандартом программы для перекодировки файлов считается, портированная из Unix утилита iconv (в составе библиотеки libiconv).

    iconv [-c] [-s] [-f encoding] [-t encoding] [inputfile ...]

    Входная кодировка задаётся ключом -f, а выходная - ключом -t . Если ключи не заданы, используется кодировка для языка системы по умолчанию. Все входные файлы читаются по очереди, если не задан параметр входного файла, то используется стандартный ввод, а конвертируемый текст выводится на стандартный вывод.

    Когда задана опция -c, символы, которые не могут быть преобразованы просто выбрасываются. В противном случае при появлении подобной ошибки программа аварийно завершается.

    Когда задана опция -s, сообщения об ошибках не выводятся.

    Ключ -l позволяет получить список доступных кодировок. Утилита позволяет перекодировать текст, практически, из любой кодировки в любую.

    Скачать последнюю версию iconv для Windows (в составе пакета libiconv) можно здесь

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

    • Командный файл вручную выполняется успешно, но запущенный с помощью планировщика не работает.

       Обычно, это вызвано тем, что вы не учитываете тот факт, что на момент выполнения вашего командного файла переменные среды могут быть совсем другими, чем на момент его написания и запуска из командной строки. Например, в командном файле используется запуск приложения myprog.exe, находящегося в каталоге SCRIPTS на диске D: . Если в командном файле используется имя модуля без полного пути

    MYPROG.EXE

    и если каталог D:\SCRIPTS не прописан в путях поиска (переменная PATH ) то модуль MYPROG.EXE может быть найден и выполнен только если текущим каталогом является D:\SCRIPTS. Но если вы укажете полный путь к myprog.exe:

    D:\SCRIPTS\myprog.exe

    то программа будет найдена и выполнена в любом случае.

    Кроме того, нередко программа, указанная в командном файле использует для поиска своих компонент (dll, ini и т.п. ) собственный каталог. Но на момент ее выполнения текущим каталогом может быть любой (чаще всего - системный каталог Windows). Естественно, компоненты не находятся и программа не выполняется. Для устранения проблемы добавьте в командный файл команды, обеспечивающие переход в нужный каталог. Например, программа myprog.exe должна выполняться в каталоге D:\SCRIPTS:

    Rem Сменим текущий диск

    D:

    Rem перейдем в каталог SCRIPTS

    CD D:\SCRIPTS

    myprog.exe

  • Неправильно отображаются русские имена файлов, служб и т.п.
  • Причина в том, что при создании командных файлов вы использовали текстовый редактор, в котором русские символы представлены не в DOS-кодировке. Если в приведенном выше примере перезапуска службы "DNS-клиент" вы используете неверную кодировку, то русская часть имени службы не будет опознана из-за неверной кодировки и будет выдано сообщение, что указанная служба не установлена. Чтобы избежать проблем с русскими символами в командных файлах, используйте редактор с поддержкой DOS-кодировки, например, встроенный редактор файлового менеджера FAR.

    Переключение между кодировками в редакторе осуществляется нажатием F8 .С помощью FAR можно легко осуществлять перекодировку, скопировав (вырезав) текст в буфер обмена, затем нажав F8 и вставив текст из буфера.

  • Командный файл выполняется на одном компьютере успешно, но на другом - не работает.
  •     Обычно это вызвано применением в командных файлах абсолютных значений вместо переменных среды окружения. Вместо C:\WINDOWS правильнее использовать %SYSTEMROOT%, потому, что на другом компьютере система может быть установлена в другой каталог или на другой диск. Старайтесь вместо имени командного файла использовать переменную %0 и ее подстановочные варианты (%~d0 - диск с которого запущен сценарий, %~dp0 - полный путь и т.д.).

        Строки с переменными, принимающими значения имен файлов и каталогов лучше заключать в кавычки. Командная строка

    DIR %ProgramFiles%

    не выдаст вам содержимого каталога C:\Program Files , поскольку из-за наличия пробела будет интерпретирована как

    DIR C:\Program

    Командная строка

    DIR "%ProgramFiles%"

    выполнится верно.

        Старайтесь использовать команды Setlocal и Endlocal, чтобы не оставлять мусор из переменных, созданных или модифицированных командным файлом.

    Использование командных файлов в сценариях регистрациипользователей .

        Командные файлыудобно использовать для выполнения каких-либодействий при регистрации пользователя вдомене. Делается это с помощью вкладки Profile свойств пользователя домена.

    <

    Сами командные файлы должнынаходиться в сетевой папке Netlogon (WINDOWS\SYSVOL\ DOMAIN\SCRIPTS) контроллера домена.

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

    Дополнительные материалы по командной строке Windows:

    Список команд, используемых в командной строке Windows. Имена большинства команд представляют собой ссылку на страницы с их описанием и примерами.

    Настройка окна командной строки Windows. Малоизвестные возможности изменения свойств консоли Windows.

    Работа с сетью в командной строке Windows - Описание и примеры использования утилит командной строки для работы с сетью.

    http://ab57.ru/cmd.html

    uzverss.livejournal.com

    Командные файлы

    МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

    МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ

    КАФЕДРА ЭЛЕКТРОННО-ВЫЧИСЛИТЕЛЬНОЙ АППАРАТУРЫ

    ОТЧЕТ

    по лабораторной работе “Командные файлы”

    Дисциплина “Системное ПО ЭВМ”

    Выполнили студенты группы С-45.

    Преподаватель проф. Зарудный Д. И.

    Москва 1998

    Оглавление

    1. Введение

    2. Рабочее задание

    3. Краткие сведения о командных файлах

    4. Практическая часть

    1. Тексты программ

    2. Протокол работы программ

    5. Заключение

    1. Введение

    Командные файлы - средство MS-DOS, позволяющее автоматизировать часто выполняемые действия пользователя. Командные файлы могут выполнять довольно сложную последовательность действий. Основой командных файлов служат команды MS-DOS.

    2. Рабочее задание

    1. Создать командный файл BATCh2.BAT, выполняющий действия:

    1. Отключение режима отображения на экране выполняемой команды

    2. Вывод на экран: "Копирование и удаление файла"

    3. Создание на диске A: каталога DIR1, и в нем создание каталога DIR2

    4. Копирование файла с именем TEXT1.TXT из каталога C:\ALPHA\BETTA\GAMMA в файл с именем TEXTNEW.TXT в каталоге A:\DIR1\DIR2

    5. Удаление исходного файла

    6. Вывод на экран: “Файл скопирован и удален”

    7. Пауза до нажатия клавиши

    2. Создать командный файл с именем SUMMA.BAT, выполняющий действия:

    1. Вывод на экран “Объединение и переименование файлов”

    2. Объединение содержимого файлов ANEW.PAS и BNEW.PAS, находящихся в каталоге C:\D1, в файл CNEW.PAS в каталоге C:\D2

    3. Вывод содержимого файла CNEW.PAS на экран

    4. Ожидание нажатия клавиши

    5. Переименование файлов ANEW.PAS и BNEW.PAS в AOLD.PAS и BOLD.PAS соответственно.

    6. Вывод на экран: "Задание выполнено"

    3. Создать командный файл с именем _EXIST.BAT, выполняющий действия:

    1. Вывод на экран “Копирование файла в случае его отсутствия на дискете”

    2. В случае отсутствия файла SIMP.FOR на диске A: скопировать его туда из каталога C:\FOR и вывести на экран: "Файл simp.for скопирован на диск A:"

    3. Если файл SIMP.FOR уже есть на диске, вывести на экран: "Файл simp.for уже есть на дискете"

    4. Создать командный файл с именем BATCh5.BAT, выполняющий различные действия в зависимости от переданного параметра в строке вызова:

    1. Создание каталога A:\MYDIR и копирование в него всех .com и .exe файлов с диска C:

    2. Создание в каталоге A:\MYDIR каталога \NEWDIR и копирование в него всех .com файлов с диска C:

    3. Вывод на экран содержимого каталога A:\MYDIR

    4. Удаление каталога A:\MYDIR\NEWDIR

    5. Удаление каталога A:\MYDIR

    3. Краткие сведения о командных файлах

    Командный файл состоит из последовательности строк, в каждой из которых может находиться либо вызов программы, либо вспомогательные команды. Большинство строк командного файла обрабатываются DOS так же, как если бы они вводились пользователем в командной строке. Вспомогательные команды служат для управления ходом работы командного файла. Наиболее распространенные вспомогательные команды:

    ЕСНО

    При формате вызова ECHO OFF отменяет вывод строк командного файла на экран при выполнении. Команда ECHO ON возобновляет их вывод на экран. Большинство командных файлов начинаются со строки @ECHO OFF . Символ "@ " служит для отмены вывода на экран строки, следующей непосредственно за ним.

    В остальных случаях команда ЕСНО выводит на экран текст, следующий за ней в строке.

    GOTO

    Применяется для перехода к определенной строке командного файла. При выполнении команды GOTO LABEL происходит переход к строке, начинающейся с текста :LABEL .

    IF

    Служит для проверки условия во время выполнения командного файла.

    Формат команды: IF УСЛОВИЕ КОМАНДА .

    Команда будет выполнена в том случае, если условие будет истинно. Однако, допуст м формат IF NOT УСЛОВИЕ КОМАНДА . При этом команда выполнится, если условие ложно. В качестве команды часто используется GOTO .

    В качестве условия могут быть использованы выражения:

    EXIST ФАЙЛ - истинно в том случае, если указанный файл существует.

    СТРОКА1 = = СТРОКА2 - истинно, если строки совпадают. Обычно в одну из строк входят параметры командного файла .

    PAUSE

    Приостанавливает выполнение командного файла до нажатия клавиши any. Если нажать клавиши Ctrl+Break, выполнение командного файла будет прервано.

    REM

    Строки, начинающиеся с REM , при выполнении командного файла игнорируются. В них можно записывать комментарии.

    FOR

    Формат команды: FOR %%x IN (СПИСОК ) DO КОМАНДА

    При выполнении КОМАНДА будет выполнена для каждого файла из списка. Эту команду можно использовать, если программа, которую нужно вызвать, не поддерживает "джокеров" - символов "*" и "?" в именах файлов.

    Пример: FOR %%A IN (*.TXT) DO MORE<%%A

    Эту команду можно использовать и в командной строке, но при этом вместо %%х нужно писать %х .

    Параметры командного файла - слова, идущие при его вызове в командной строке вслед за именем самого файла.

    Пример - compare.bat example.txt. example2.txt

    В командном файле параметры указываются с помощью выражений %х , где х - цифра от 1 до 9. %0 означает имя самого командного файла. Так, если в приведенном выше примере файл compare.bat содержит строку type %1 , то во время выполнения она заменится на type example.txt .

    Некоторые команды MS-DOS, необходимые в написании командных файлов:

    Смена текущего каталога осуществляется командой

    CD имя_каталога

    Создание каталога осуществляется командой

    MD имя_каталога .

    Копирование файла - командой

    COPY имя_файла1 имя_файла2 .

    Удаление файла - командой

    DEL имя_файла .

    Удаление каталога – командой

    DELTREE имя_каталога

    Файлы объединяются командой

    COPY файл1 + файл2 файл3

    после выполнения которой файл3 содержит данные, находившиеся в файлах файл1 и файл2 .

    4. Практическая часть

    4.1 Тексты программ

    1. Файл BATCh2.BAT

    @echo offecho Копирование и удаление файла a:mkdir a:\dir1mkdir a:\dir1\dir2copy c:\alpha\beta\gamma\text1.txt a:\dir1\dir2\textnew.txt

    del c:\alpha\beta\gamma\text1.txt

    echo Файл скопирован и удален

    pause

    2. Файл SUMMA.BAT

    @echo offecho Объединение и переименование файлов copy c:\d1\anew.pas + c:\d1\bnew.pas c:\d2\cnew.pastype c:\d2\cnew.paspause

    rename c:\d1\anew.pas aold.pas

    rename c:\d1\bnew.pas bold.pas

    echo Задание выполнено

    3. Файл _EXIST.BAT

    @echo offecho Копирование файла в случае его отсутствия на дискете if not exist a:\simp.for goto met1echo Файл simp.for уже есть на дискете

    goto met2

    :met1

    copy c:\for\simp.for a:\simp.for

    echo Файл simp.for скопирован на диск A:

    :met2

    4. Файл BATCh5.BAT

    @echo offgoto m%1goto qend:m1a:mkdir a:\mydircopy c:\*.com a:\mydircopy c:\*.exe a:\mydir

    goto qend

    :m2

    a:

    cd a:\mydir

    mkdir a:\mydir\newdir

    copy c:\*.com a:\mydir\newdir

    goto qend

    :m3

    dir a:\mydir

    goto qend

    :m4

    deltree a:\mydir\newdir

    goto qend

    :met5

    deltree a:\mydir

    :qend

    2. Протокол работы программ

    1. Файл BATCh2.BAT

    Копирование и удаление файла

    1 файл(а,ов) скопировано

    Файл скопирован и удален

    Нажмите любую клавишу . . .

    2. Файл SUMMA.BAT

    Объединение и переименование файлов

    c:\d1\anew.pas

    c:\d1\bnew.pas

    1 файл(а,ов) скопировано

    { Содержимое файла anew.pas }

    { Содержимое файла bnew.pas }

    Нажмите любую клавишу . . .Задание выполнено

    3. Файл _EXIST.BAT

    а) файл отсутствует на дискете:Копирование файла в случае его отсутствия на дискете

    1 файл(а,ов) скопировано

    Файл simp.for скопирован на диск A:

    б) файл есть на дискете:Копирование файла в случае его отсутствия на дискете

    Файл simp.for уже есть на дискете

    4. Файл BATCh5.BAT

    а) запуск с параметром 1

    { список из 10 .com файлов }

    10 файл(а,ов) скопировано

    { список из 8 .exe файлов }

    8 файл(а,ов) скопировано

    б) запуск с параметром 2

    { список из 10 .com файлов }

    10 файл(а,ов) скопировано

    в) запуск с параметром 3

    { вывод содержимого каталога A:\MYDIR }

    г) запуск с параметром 4

    Удалить каталог “a:\mydir\newdir” вместе со всеми подкаталогами? [Y(да)/N(нет)] y

    Удаление a:\mydir\newdir...

    д) запуск с параметром 5

    Удалить каталог “a:\mydir” вместе со всеми подкаталогами? [Y(да)/N(нет)] y

    Удаление a:\mydir...

    3. Заключение

    Выполненные задания позволяют сделать вывод о целесообразности применения командных файлов в случае необходимости использования часто повторяющихся действий. Командные файлы являются наиболее удачным решением для реализации простых алгоритмов, связанных с операциями над файлами. Однако для реализации сложных алгоритмов язык командных файлов может оказаться недостаточным.

    mirznanii.com

    Использование пакетных файлов для Windows

    Большинство пользователей периодически выполняют повторяющиеся задачи, многие из которых можно заменить одной командой или запуском одного файла. Из статьи вы узнаете, как автоматически решать часто возникающие задачи, не используя при этом никакого дополнительного ПО. Речь идет о пакетных файлах, позволяющих осуществлять несколько действий автоматически, без участия пользователя. Необходимо лишь составить пакетный файл с перечнем команд и запускать его в случае надобности.

    Технология пакетных файлов

    Пакетные файлы (их также называют командными или bat-файлами) – текстовые документы с расширениями .bat или .cmd, содержащие последовательность команд, которые можно запустить подобно любому приложению Windows. Такая технология позволяет пользователю создавать программы пакетной обработки, выполняющие несколько последовательно записанных команд. Это очень удобно, если периодически приходится совершать повторяющиеся действия. Пакетные файлы предоставляют гибкие возможности создания сценариев, с их помощью возможно написание и маленьких линейных последовательностей команд, и сложных сценариев с условными ветвлениями и циклами. Технология файлов пакетной обработки используется во многих ОС и оболочках, среди которых Windows, OS/2, Mac OS и Linux-подобные системы.

    Создание и использование

    Запуск и результаты работы пакетного файла
    Получение детальной справки по инструкции if
    Получение списка команд

    Начиная работу, нужно тщательно продумать последовательность команд, которые будут выполняться. Для написания пакетного файла необходимо создать текстовый документ с расширением .bat или .cmd, ввести в него нужные команды (каждую с новой строки) и сохранить. Это можно проделать в любом текстовом редакторе, скажем, в Блокноте, но если вы используете в командах пути к файлам с русскими символами или выдачу сообщений на русском языке, необходимо задействовать редакторы, которые поддерживают DOS-кодировку, например стандартный редактор менеджера FAR. В любое время доступно редактирование содержимого командных файлов. Рекомендуется также в целях безопасности просматривать их содержимое перед запуском, если они созданы не вами и получены из сомнительных источников.

    Для выполнения такого файла необходимо запустить его, как и всякое приложение Windows. Каждая строка bat-файла представляет собой действие (команду). Это могут быть команды для работы с файлами и папками, запуск приложения или другого пакетного файла, работа с реестром, вывод на экран сообщений и т. д., можно выполнять любые действия, поддерживаемые интерпретатором командной строки. Для получения списка этих команд следует нажать <Windows+R> (или Пуск→Выполнить…), ввести в поле запуска cmd (command – для Windows ниже версии NT) и нажать ОК, после чего в открывшемся окне командной строки набрать help и нажать Enter. Детальную справку по конкретной команде можно получить, введя ее имя, пробел и /?, например copy /?Enter. Кроме команд командной строки, в пакетных файлах можно вызывать другие bat-файлы, внешние утилиты (и, допустим, defrag), а также любые приложения и сервисы (только для NT-систем).

    Рассмотрим такой пример. Вы постоянно работаете с тремя файлами, которые находятся в разных каталогах жесткого диска, и часто создаете их резервные копии на USB-flash-drive. Для этого потребуется заходить в каждый каталог и копировать файлы по отдельности на флэшку. Если написать простенький пакетный файл, то перечисленные действия сведутся к его запуску. Предположим, что полные пути и имена файлов таковы: D:WorkProfits.xls, D:HomeHome.doc и C:MyDocsOplata.doc, а G: – съемный флэш-диск для резервной копии. Тогда нужный пакетный файл будет выглядеть так:

    copy D:WorkProfits.xls G:Backup

    copy D:HomeHome.doc G:Backup

    copy C:MyDocsOplata.doc G:Backup

    pause

    Первые три строки непосредственно копируют файлы в каталог Backup на USB-накопитель. В последней – команда ожидания нажатия любой клавиши. Она используется для того, чтобы после выполнения предыдущих команд не закрылось окно командной строки и можно было увидеть результаты выполнения bat-файла. Данный пакетный файл будет исполнен независимо от своего названия и местоположения на компьютере. Теперь для резервного копирования нужно только запустить созданный файл.

    Пакетные файлы поддерживают передачу параметров командам. Это очень удобно, если необходимо создавать гибкие bat-файлы для автоматизации целого ряда типовых задач. Для передачи параметров надо при вызове после имени файла поставить пробел и указать один или несколько параметров. Запускать пакетный файл с параметрами можно либо из командной строки, либо с помощью созданного для него ярлыка. Однако в последнем случае теряется принцип универсальности, так как ярлык будет содержать вызов файла с заранее введенными параметрами. Можно также создать несколько ярлыков для запуска одного bat-файла с разными параметрами. В тексте пакетного файла параметры представляются с помощью знака % и номера параметра при вызове, начиная с 1.

    Вернемся к описанному выше примеру резервного копирования. Если кроме флэш-накопителя необходимо также периодически копировать указанные файлы на переносной винчестер или на компьютер в локальной сети, то можно модифицировать bat-файл следующим образом:

    copy D:WorkProfits.xls %1

    copy D:HomeHome.doc %1

    copy C:MyDocsOplata.doc %1

    pause

    Теперь путь назначения файла будет указываться при запуске. Для резервного копирования на флэшку необходимо набрать в командной строке D:Mybatsbackup.bat G:Backup и нажать Enter. D:Mybatsbackup.bat – полный путь и имя исполняемого файла (если он находится в текущей папке – путь не обязателен), а G:Backup – первый параметр, определяющий местоположение резервных копий. При выполнении команды копирования вместо %1 будет подставлен первый параметр G:Backup. Используя переносной винчестер (H:) с папкой Copydir пакетный файл необходимо вызывать так: D:Mybatsbackup.bat H:Copydir. Если данный bat-файл был запущен без параметров, то указанные файлы скопируются в папку, где расположен пакетный файл. В данном случае файлы при копировании будут заменены без подтверждения, для выдачи же запроса подтверждения замены необходимо добавить ключ /-Y, тогда каждую команду копирования нужно записать так: copy /-Y D:WorkProfits.xls %1. При создании пакетных файлов для резервного копирования рекомендуется изучить команду xcopy, которая представляет собой расширенную версию copy.

    При написании bat-файлов можно использовать ветвления, условные и безусловные переходы, циклы, а также вызов внешних программ и других пакетных файлов. Для рассмотренного примера желательно перед копированием проверять существование каталога назначения, введенного в качестве параметра. Для этого необходимо добавить в начало файла, перед операциями копирования, следующую строку:

    if not exist %1 mkdir %1.

    Эта запись означает: если путь или конечный каталог, введенный в качестве параметра, не существует, то во избежание ошибок необходимо его создать перед резервным копированием. Если введенный путь не существует и такая обработка отсутствует, то файлы будут скопированы некорректно.

    Пакетные файлы, как и командная строка, предоставляют возможность работы с переменными окружения, которые хранят различные системные параметры. Перечень переменных окружения можно получить в разделе «Общие сведения о командной оболочке» справки Windows. Например %WINDIR% – размещение каталога ОС Windows, а %TEMP% и %TMP% содержат пути к системной и пользовательской папкам для временных файлов соответственно.

    Рассмотрим следующий пример. Многие пользователи иногда очищают содержимое временных каталогов. Для этого необходимо перейти в соответствующую папку (их может быть и две), выделить содержимое и удалить. После написания простенького bat-файла очистка временных каталогов выполняется запуском файла с Рабочего стола. К тому же саму папку удалить нельзя, а при выделении ее содержимого мышкой без использования специальной команды (Выделить все или Ctrl+A) все скрытые файлы и папки останутся нетронутыми. Итак, содержимое файла:

    del /F /S /Q %temp%

    del /F /S /Q %tmp%

    pause

    Первые две строки выполняют удаление содержимого системной и пользовательской папок для временных файлов. Для команды del использованы специальные модификаторы (ключи): /F – удаление файлов, помеченных «только для чтения», /S – удаление из всех подкаталогов, а /Q избавляет пользователя от подтверждения. Справку по этой и другим командам интерпретатора со всеми возможными модификаторами можно получить, набрав имя команды /?Enter. Последняя команда pause необходима, если вам интересен отчет об удалении файлов.

    .bat или .cmd

    Термин «пакетный файл» является устоявшимся и может подразумевать пакетный либо командный файл. Несмотря на внешнее сходство процедур создания и применения, пакетные и командные файлы имеют множество различий.

    Пакетные файлы (.bat) использовались еще в ранних версиях MS-DOS как средство выполнения нескольких команд. Эти файлы выполнялись командным интерпретатором command.com и были основным средством автоматизации.

    Начиная с Windows NT, используются командные файлы (.cmd), но пакетные также поддерживаются. Командные файлы являются усовершенствованной технологией пакетных и выполняются интерпретатором cmd.exe.

    Пакетные файлы поддерживаются вплоть до Win-dows Vista, но обладают ограниченным набором команд по сравнению с командными файлами и выполняются медленнее.

    Для Windows NT и выше рекомендуется использование командных файлов, для более старых версий – файлов пакетной обработки, так как ничего другого не пред-усмотрено.

    Варианты запуска

    Ярлык для запуска пакетного файла с параметром

    Есть несколько способов запуска пакетных файлов вручную: набрать полный путь, имя файла (и параметры) в командной строке или в диалоговом окне Выполнить и нажать Enter, создать ярлык для файла и поместить его на Рабочий стол или в меню Пуск, а также непосредственно запустить bat-файл из файлового менеджера.

    С помощью Планировщика заданий возможно планирование запуска bat-файлов по расписанию в выбранное время в определенные дни недели автоматически, один раз или периодически. Для этого в Панели управления следует запустить апплет Назначенные задания и с помощью Мастера планирования заданий создать необходимое расписание.

    Существует также возможность автозапуска пакетных файлов без использования Планировщика при загрузке ОС, для чего есть несколько способов, простейшим из которых является создание ярлыка к нужному файлу и помещение его в папку Пуск→Программы→Автозагрузка. Для автоматического запуска пакетных файлов можно также использовать дополнительное ПО.

    Полезное применение

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

    Автозапуск по расписанию удобен для резервного копирования или архивации файлов, копирования некоторых веток или всего реестра, начала антивирусного сканирования, очистки временных каталогов и корзины, выключения компьютера в заданное время и т. д.

    Bat-файлы и Windows Vista

    Как и ее предшественники, Windows Vista поддерживает технологию пакетных и командных файлов. По сравнению с XP увеличилось количество выполняемых интерпретатором команд, а также расширилась функциональность некоторых ранее существующих команд. Сохраняется восходящая совместимость: bat-файлы, созданные в предыдущих версиях Windows, будут корректно работать под управлением Windows Vista. Полный перечень команд может быть получен из справки командной строки описанным выше способом. Возможен запуск созданных файлов вручную или автоматически. Для выполнения пакетным файлом некоторых системных действий необходимо запускать его с правами администратора.

    itc.ua

    Тема: Командные файлы Windows - Документ

    Лабораторная работа № 1

    Тема: Командные файлы Windows.

    Оборудование и программное обеспечение: персональный компьютер с установленной ОС Windows XP/Vista/7, локальная сеть.

    Общая характеристика командных файлов

    Командные файлы (скрипты, сценарии, батники) - это обычные текстовые файлы с расширением .bat или .cmd, строки которых представляют собой специальные команды или имена исполняемых файлов. Строки командных файлов обрабатываются специальной программой - командным процессором операционной системы, часто называемым интерпретатором команд. Для операционных систем DOS и Windows9X в качестве интерпретатора команд используется , для Windows NT и старше - cmd.exe.

    Строки командных файлов могут содержать специфические команды самого процессора команд (FOR, ECHO, REM и т.п.) или имена исполняемых модулей (net.exe, regedit.exe, sc.exe) Командный процессор может быть запущен в интерактивном режиме через Пуск - Выполнить - CMD.EXE. В данном режиме, вы увидите окно консоли с приглашением к вводу команд. Возможный список большинства консольных команд можно получить введя:

    HELP

    Справочную информацию по конкретной команде можно получить, указав ее название в качестве параметра команды HELP:

    HELP Имя команды.

    Если вы работаете в русифицированной версии Windows, то учтите, что в среде командного процессора символы национального алфавита используются в DOS-кодировке. Для переключения между кодовыми страницами Windows и DOS используется команда

    CHCP номер страницы

    CHCP 866 - использовать кодовую страницу 866 (DOS)

    CHCP 1251 - использовать кодовую страницу 1251 (WINDOWS)

    Для просмотра и редактирования командных файлов, содержащих символы русского алфавита нужно использовать редактор с поддержкой DOS-кодировки. Если вы используете стандартное приложение "Блокнот" (notepad.exe), то для правильного отображения символов русского алфавита нужно выбрать шрифт Terminal, с помощью меню Правка - Шрифт...

    Внешний вид окна CMD.EXE (консоли Windows) можно изменить с помощью команды

    COLOR

    В качестве аргументов для команды используются 2 шестнадцатеричные цифры, задающие цвет фона и цвет символа.

    COLOR F0 - черные символы на белом фоне.

    COLOR 0E - светло-желтые символы на черном фоне.

    HELP COLOR - подсказка для команды COLOR.

    Работа с командным процессором предполагает использование двух устройств - устройства ввода (клавиатуры) и устройства вывода (дисплей). Однако, имеется возможность изменить стандартно используемые устройства ввода-вывода с помощью специальных символов - символов перенаправления

    > - перенаправление вывода

    - перенаправление ввода

    Для вывода справки не на экран а, например, в файл с именем help.txt, можно использовать следующую команду:

    HELP > help.txt.

    При выполнении данной команды, в текущем каталоге будет создан файл с именем help.txt, содержимым которого будет результат вывода команды HELP. Если файл help.txt существовал на момент выполнения команды, его содержимое будет перезаписано. Для того чтобы дописать данные в конец существующего файла, используют удвоение символа перенаправления вывода - ">>"

    Пример:

    HELP GOTO > myhelp.txt - в файл myhelp.txt будет выдана справка по использованию команду GOTO,

    HELP COLOR >> myhelp.txt - в конец файла myhelp.txt будет дописана справка по использованию команды COLOR.

    Простейший пример перенаправления ввода:

    cmd.exe - командный процессор не будет ожидать ввода команд с клавиатуры, а считает их из файла commands.txt.

    При запуске командного процессора можно указать конкретную команду в качестве аргумента командной строки:

    cmd.exe /C HELP FOR - выполнить команду HELP FOR и завершиться (ключ /C)

    cmd.exe /K HELP FOR - выполнить команду HELP FOR и перейти в режим ожидания дальнейшего ввода команд (ключ /K)

    одробную справку по использованию cmd.exe можно получить, введя в качестве аргумента ключ /?

    cmd.exe /?

    Кроме символов перенаправления ввода-вывода в командной строке могут использоваться символы объединения команд - && и ||

    cmd.exe /C "HELP IF > nul" && Echo HELP Executed || Echo HELP Not Executed - выполнить команду HELP IF и при успешном результате выполнить команду Echo HELP Executed, а при неуспешном - Echo HELP Not Executed. Команды, объединяемые для выполнения с помощью конструкции &&, не нужно заключать в двойные кавычки. Выполнение строки

    cmd.exe /C "HELP IF > nul" && Echo HELP Executed || Echo HELP Not Executed

    завершится сообщением HELP Executed, а выполнение

    md.exe /C "HELP uIF > nul" && Echo HELP Executed || Echo HELP Not Executed,

    где неверно задан аргумент команды HELP ( uIF ), завершится сообщением HELP Not Executed.

    Файлы с расширением .bat или .cmd в среде Windows стандартно открываются командным процессором аналогично примеру, где список команд считывается не с устройства ввода, а из текстового файла.

    Использование переменных в командных файлах

    Существует такое понятие, как переменные окружения (environments) - это переменные, значения которых характеризуют среду, в которой выполняются команда или пакетный файл. Иногда их называют переменными среды. Принимаемые значения этих переменных формируются при загрузке, регистрации пользователя в системе, старте или завершении некоторых приложений, и, кроме того, могут быть заданы с помощью специальной команды SET

    SET переменная = строка

    переменная - имя переменной среды,строка - строка символов, присваиваемая указанной переменной.

    Например, командная строка

    SET myname=Vasya

    создает переменную myname, принимающую значение Vasya.

    Значение, присвоенное какой-либо переменной, доступно для обработки в командных файлах, при использовании ее имени, заключенного в знаки процента - %. Например команда выдачи текста на дисплей ECHO в виде:

    ECHO date - выведет на экран слово "date", а команда

    ECHO %date% выведет на экран значение переменной date - текущую дату в формате операционной системы.

    С помощью команды SET обычно задается и модифицируется путь поиска исполняемых программ - переменная окружения PATH.

    SET PATH=C:\Windows;C:\windows\system32

    После выполнения данной команды, поиск исполняемых файлов будет выполняться в каталоге C:\Windows, и, если результат неуспешен, в C:\windows\system32

    Допустим Вам необходимо выполнить программу myedit.exe, размещенную в каталоге C:\NewProgs. Если в командной строке не задан полный путь, а только имя исполняемого файла - myedit.exe то сначала будет выполняться поиск файла myedit.exe в текущем каталоге, и если он не будет найден - в каталогах, список которых задается значением переменной PATH. Символ ; является разделителем элементов в списке путей поиска. Если в приведенном примере, текущим каталогом не является C:\NewProgs, и в остальных каталогах, заданных значением переменной PATH. нет исполняемого файла myedit.exe, то запуск приложения myedit.exe завершится ошибкой. Однако, если есть необходимость его запуска без указания полного пути и при любом значении текущего каталога, можно модифицировать значение переменной PATH.

    Команда

    SET PATH=C:\NewProgs;%path%

    изменит текущее значение PATH, добавив каталог C:\NewProgs в начало списка. Выполнение команды SET без параметров позволяет получить текущие значения переменных окружения:

    NUMBER_OF_PROCESSORS=1 - количество процессоров

    OS=Windows_NT- тип ОС

    Path=C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Far - путь поиска исполняемых файлов.

    ;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH - расширения для исполняемых файлов.

    PROCESSOR_ARCHITECTURE=x86 - архитектура процессора.

    PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD - идентификатор процессора.

    PROCESSOR_LEVEL=6 - уровень (номер модели) процессора.

    PROCESSOR_REVISION=0801 - версия процессора.

    ProgramFiles=C:\Program Files - путь к папке "Program Files"

    PROMPT=$P$G - формат приглашения командной строки $P - путь для текущего каталога $G - знак ">".

    SystemDrive=C: - буква системного диска.

    SystemRoot=C:\WINDOWS - каталог ОС Windows.

    Значение некоторых переменных по команде SET не выдаются. В основном, это переменные, принимаемые значения которых динамически изменяются:

    %CD% - Принимает значение строки текущего каталога.

    %DATE% - Принимает значение текущей даты.

    %TIME% - Принимает значение текущего времени.

    %RANDOM% - Принимает значение случайного десятичного числа в диапазоне 1 -32767.

    %ERRORLEVEL% - Принимает текущее значение кода завершения задачи ERRORLEVEL

    %CMDEXTVERSION% - Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд.

    %CMDCMDLINE% - Принимает значение строки, которая вызвала командный процессор.

    Для просмотра действующего значения какой-либо переменной обычно используется команда:

    ECHO %переменная%,

    ECHO %CD% - отобразить имя текущего каталога,

    ECHO %TIME% - отобразить текущее время,

    ECHO %ERRORLEVEL% - отобразить результат выполнения предыдущей команды.

    Значения, принимаемые переменными окружения, могут быть расширены с помощью специального признака - символа " ~ ", что получить частичное значение (расширение переменной), или изменить его заменой какой-либо части. Примеры использования расширений переменных рассмотрены ниже.

    Передача параметров командному файлу

    Очень полезной особенностью работы с командными файлами является возможность передавать параметры командной строки и использовать их значения в операциях внутри самого командного файла

    BAT-файл параметр1 параметр2 ... параметрN.

    В самом командном файле первый параметр будет доступен как переменная %1, второй - %2 и т.п. Путь и имя самого командного файла доступно как переменная %0. Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных при его запуске параметров командной строки. Для вывода текста на экран используется команда ECHO текст , однако если "текст" заменить на %0, - то будет выдано имя командного файла, %1 - первый аргумент, заданный в строке запуска, %2 - второй и т.д.

    Создаем, например, командный файл params.bat следующего содержания:

    echo off echo Это командный файл %0

    echo Первый параметр=%1

    echo Второй параметр=%2

    echo Третий параметр = %3.

    Запускаем его на выполнение следующей командой:

    params.bat FIRST second "two words"

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

    В первой строке командного файла используется команда "echo off" для того, чтобы обрабатываемые командным процессором строки не выдавались на экран.

    Для проверки наличия каких-либо входных параметров, передаваемых командному файлу, можно проверить, является ли значение переменной %1 пустым:

    if "%1" EQU "" goto error

    ....

    ...

    :error

    Echo Должен быть задан хотя бы один входной параметр

    exit

    В командных файлах большого размера трудно обойтись без справочной информации в виде комментариев, для чего используется конструкция

    REM пробел текст.

    Строки, начинающиеся с REM пробел, командным процессором игнорируются.

    rem ECHO OFF выключает режим вывода содержания строк командного файла на экран

    REM будет выводиться только результат их выполнения.

    ECHO OFF

    echo Первый параметр=%1

    echo Второй параметр=%2

    echo Третий параметр = %3

    Если к имени команды первым символом добавляется @, то независимо от режима ECHO (ON или OFF), вывод обрабатываемой строки не выполняется. Попробуйте в данном примере "ECHO OFF" заменить на "@ECHO OFF" - результат говорит сам за себя. Строка, которая выключает режим вывода, не будет выдаваться на экран. Вывод эха на экран устанавливается по команде ECHO ON и, обычно, используется в целях диагностики.

    rem ECHO ON включает режим вывода содержания строк командного файла на экран

    REM будет сама командная строка и результат ее выполнения,

    REM но строки, начинающиеся символом @ выводиться не будут ECHO ON,

    @echo Первый параметр=%1,

    @echo Второй параметр=%2,

    @echo Третий параметр = %3.

    Переходы и метки.

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

    Для решения задачи, создаем командный файл, например setletter.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 перед подключением. Попробуйте изменить командный файл setletter.bat с использованием команды перехода GOTO, осуществляющей передачу управления строке пакетного файла на указанную метку

    GOTO метка.

    В качестве метки используется строка символов, начинающаяся с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало сообщений об ошибке:

    @ECHO OFF

    REM если не существует X: - то перейдем на метку SETX

    IF NOT EXIST X:\ GOTO SETX

    REM если существует X: - перейдем на проверку наличия Y:

    GOTO TESTY

    :SETXIF EXIST G:\flashd1.let SUBST X: G:\

    IF EXIST F:\flashd1.let SUBST X: F:\

    :TESTYREM если 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 равно нулю, если программа завершилась без ошибок и единице - при возникновении ошибки. Могут быть и другие значения, если они предусмотрены в выполняемой программе.

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

    @ECHO OFF

    ECHO Вызов 1.bat

    CALL 1.bat

    ECHO Получено из файла %MYFILE% значение MYNUMBER=%MYNUMBER%,

    а в файле 1.bat на следующее

    @ECHO OFF

    SET MYFILE="Very good 1.bat"

    SET MYNUMBER=99.

    Кстати, используя передачу управления командному файлу, можно организовать его зацикливание. Попробуйте добавить в конец файла test.bat строку:

    CALL test.bat

    Выйти из зацикливания командного файла можно по нажатию комбинации CTRL-Break.

    Возможно использование команды CALL для вызова процедуры внутри командного файла. В этом случае в качестве аргумента используется не имя внешнего файла, а метка:

    call :proc1

    ....

    :proc1

    ....

    exit

    ....

    gigabaza.ru

    Что такое командный файл?

    Часто многим приходилось слышать о командном файле. С его помощью многие «продвинутые» пользователи выполняют всевозможные автоматические задачи на компьютере. Что же такое командный файл и где его взять?

    Командный файл - это некий файл последовательных команд, которые Windows будет выполнять при его запуске. Командный файл, как правило, имеет расширение *.bat. Рассмотрим возможности командных файлов на простом примере – создадим командный файл, который будет очищать папку Temp от временных файлов в корне диска C.

    Все команды, которые можно использовать в командном файле должны соответствовать синтаксису командной строки. Справка Windows содержит подробное описание синтаксиса всех этих команд. Создать BAT файл можно с помощью обычного текстового редактора, такого как Блокнот. Открыв блокнот в нём нужно написать такую строку:

    DEL C:Temp /S /Q

    После чего следует сохранить этот файл в любом удобном месте и изменить расширение с txt на bat.

    Эта команда будет производить удаление всех файлов в папке Temp.

    Ключ /S необходим для удаления файлов в подпапках, а ключ /Q – для отключения вывода подтверждения на удаление файлов.

    Запуская простой командный файл, можно легко очистить временную папку от накопившихся файлов.

    Что такое командный файл из приведённой заметки должно быть понятно. Командные файлы предоставляют большие возможности для автоматизации повторяющихся процессов и однотипных действий. Однако для более эффективного их использования следует подробнее изучить параметры командной строки.

    procomputer.su