Batch Windows PDF
Batch Windows PDF
Batch Windows PDF
Методические указания
Волгоград
2012
УДК 004.056
Рецензент:
Командный интерпретатор
Интерфейс командной строки является мощным и гибким инструментом ре-
шения широкого круга административных задач. Несмотря на то, что графиче-
ский интерфейс ОС Windows кажется более удобным и эффективным для управ-
ления ресурсами компьютера, использование командной строки выглядит пред-
почтительнее при необходимости автоматизации или масштабирования задач ад-
министрирования. При этом использование встроенных в операционную систему
средств поддержки выполнения скриптов, таких как внутренние и внешние ко-
манды, операторы, переменные, позволяет не прибегать к сторонним компилято-
рам высокоуровневых языков для решения даже очень сложных задач – стандарт-
ная поставка операционной системы содержит все необходимые инструменты.
Операционная система Windows поддерживает командный диалог с пользо-
вателем с использованием командного интерпретатора или, иначе, оболочки ко-
мандной строки (command shell). Его назначение – находясь в оперативной памя-
ти принимать от оператора и выполнять команды. В Windows 9x, как и в MS-DOS,
командный интерпретатор по умолчанию был представлен исполняемым файлом
command.com. Начиная с версии Windows NT операционная система предоставля-
ет пользователю альтернативный и более функциональный интерпретатор ко-
манд Cmd.exe.
Файл командного интерпретатора Cmd.exe в ОС Windows
NT/2000/XP/Vista/7 находятся в каталоге %SystemRoot%\SYSTEM32, где пере-
менной среды %SystemRoot% соответствует путь к системному каталогу
Windows). Запустить командный интерпретатор можно, послав на исполнение
файл Cmd.exe любым доступным способом: из Проводника, файлового менедже-
ра, пункта главного меню Выполнить… (Run). В результате откроется новое ок-
но командного интерпретатора (рис.1), в котором можно запускать команды и ви-
деть результат их выполнения.
3
Команды
Все команды, которые оператор может выполнить в окне интерпретатора
Cmd.exe, делятся на внутренние и внешние. Внутренние команды распознаются
самим интерпретатором. К ним относятся, например, cls – очистка экрана, time –
просмотр и изменение текущего времени, dir – просмотр содержимого папки.
Внешние команды оформлены как отдельные программы, которые по умолчанию
находятся в той же папке, что и сам интерпретатор cmd.exe. Внешними являются,
например, команды: xcopy – копирование файлов и каталогов, at – запуск про-
грамм и команд в заданное время, cacls – просмотр и изменение прав доступа к
файлам и папкам.
Рассмотрим общие принципы работы с командной строкой. В ответ на
стандартное приглашение вида
полный_ путь_к_ текущей_ папке>_
можно ввести имя команды с параметрами и ключами. Справку по конкретной
команде можно получить в окне оболочки, если запустить команду с ключом /?
(рис.2).
5
в существующие дескрипторы используется амперсанд (&), затем номер требуе-
мого дескриптора (например, &номер_дескриптора). Например, для перенаправ-
ления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите: 1>&2.
Например, чтобы сообщения об ошибках и результаты работы скрипта вы-
водились в файл, подаем команду:
myScript.bat >res.txt 2>&1
Здесь сначала стандартный вывод перенаправляется в файл, а затем деск-
риптор потока STDERR перенаправляется туда же, куда перенаправлен STDOUT.
Если же поменять местами операции перенаправления:
myScript.bat 2>&1 1>res.txt
то STDERR будет сначала перенаправлен на поток STDOUT (консоль), а уже за-
тем STDOUT перенаправляется в файл. В результате полезный вывод будет на-
правлен в файл, а ошибки – на экран.
В операторах перенаправления вместо имени файла можно указывать стан-
дартные обозначения устройств компьютера. В Windows поддерживаются сле-
дующие имена устройств: PRN (принтер),LPT1–LPT3 (соответствующие парал-
лельные порты), AUX (устройство, присоединяемое к последовательному порту
1), COM1–COM3 (соответствующие последовательные порты), CON (терминал:
при вводе это клавиатура, при выводе - монитор), NUL (пустое устройство, все
операции ввода/вывода для него игнорируются).
Примеры.
Вывод в файл папки.txt списка всех папок из текущей папки
dir /A:D /B >папки.txt
Вывод справки по команде tasklist в файл tasklist _hlp.txt
tasklist /? > tasklist_hlp.txt
Дописать в файл check_connect.txt результат проверки IP-соединения с уз-
лом www.volpi.ru
ping www.volpi.ru >>check_connect.txt
Перенаправить сообщения об ошибках работы команды в файл error.txt
taskkill /s comp1 /pid 1022 2>error.txt
Сменить дату на 1.1.2013
echo 1.1.2013 | date
В последнем примере использован оператор конвейеризации |. С его помо-
щью можно сообщения, выводимые первой командой, передавать в качестве
входных данных для второй команды. В данном случае в качестве входных дан-
ных для команды date, ожидающей на входе значение новой даты в формате
дд.мм.гггг, использован вывод первой команды (echo), которая выводит на экран
заданную строку-параметр. Если заранее записать новую дату в файл date.txt, то
изменение даты возможно и такой командой:
date < date.txt
Оператор конвейера наиболее эффективен в комбинации с фильтрующими
командами. Команды-фильтры дают возможность сортировать, просматривать и
отбирать часть выходной информации других команд. Фильтры делят, переупо-
рядочивают или выделяют отдельные части из проходящей через них информа-
ции. В приведенной ниже таблице перечислены команды-фильтры, доступные в
6
ОС Windows.
Таблица 3. Команды-фильтры
Команда Описание
Отображает содержимое файла или вывода команды в одном окне
more
командной строки за раз.
find Поиск указанных символов в файлах или выводе команды.
Поиск образцов текста в файлах с использованием регулярных
findstr
выражений
sort Сортировка файлов или вывода команды по алфавиту.
Для направления данных из файла на вход фильтра используется символ
«меньше» (<). Для направления на вход фильтра выхода другой команды исполь-
зуется канал (|).
Команда more выводит содержимое файла или выхода команды в одном
окне командной строки за раз. Например, чтобы отобразить содержимое файла
List.txt в одном окне командной строки за раз, введите следующую команду: more
list.txt (или more < list.txt). Отображается одно окно командной строки со сведе-
ниями, а затем в нижней части окна командной строки отображается строка --
More --. Для перехода к следующему окну командной строки, нажмите любую
клавишу Пробел, для вывода следующей строки нажмите Enter, для остановки
просмотра следует нажать клавишу q (полный список доступных клавиш см. в
справке). Команда more полезна при работе с командами, создающими выход бо-
лее одного окна командной строки. Например, при выводе дерева каталогов жест-
кого диска. Если на диске содержится больше каталогов, чем может быть одно-
временно выведено в окне командной строки, можно использовать команду tree с
каналом (|) и команду more. tree c:\ | more На экран будет выведен первое окно
командной строки с выходом команды tree, а затем отобразится строка
-- More --.
Команда find проводит поиск заданной строки или текста в файлах. Ко-
манда Cmd.exe отображает каждую строку, которая совпадает со строкой или тек-
стом, указанным в окне командной строки. Чтобы использовать команду find в
качестве команды-фильтра, необходимо включить символ «меньше» (<) и строку
или текст, которые надо искать либо использовать команду ”канал”. Например,
команда dir | find ”.2012” отфильтрует в выводе команды dir все файлы и папки,
в строках описания которых встречается строка .2012 (созданные в 2012 году).
Необходимо также помнить, что по умолчанию при поиске команда find учитыва-
ет регистр.
Команда sort выполняет сортировку по алфавиту текстового файла или
вывода команды. Например, следующая команда сортирует содержимое файла
List.txt и отображает результаты в окне командной строки: sort < list.txt В этом
примере команда sort сортирует строки файла List.txt в алфавитном порядке и вы-
водит результат на экран без изменения файла. Для сортировки вывода команды
следует ввести команду, затем символ канала (|) и команду sort (команда | sort).
Например, следующая команда сортирует в алфавитном порядке все запущенные
7
процессы tasklist | sort. Команда sort имеет ряд параметров. Например, в таком
варианте:
dir | sort /+6
сортировка будет осуществляться начиная с 7-го символа (+6 – пропустить пер-
вые 6). В выводе команды dir с 7-й позиции начинается год создания файлов и па-
пок, следовательно, команда выведет содержимое текущей папки, отсортирован-
ной по годам.
Зачастую решение некоторой практической задачи предполагает выполне-
ние нескольких команд. В этом случае их объединяют в специальные командные
файлы, но о них речь пойдет позже. Windows предоставляет возможность объеди-
нять несколько команд в одной строке, допуская их последовательное выполне-
ние, а также разрешая обуславливать выполнение одних команд результатами вы-
полнения других.
Примеры.
Вывести на экран содержимое корневой папки диска C:, дождаться нажа-
тия клавиши (команда pause), вывести на экран содержимое корневой папки диска
D:.
dir c:\ & pause & dir d:\
8
Проверить IP-соединение с узлом www.volpi.ru и если соединения нет вы-
вести на экран текущие параметры сети TCP/IP.
ping www.volpi.ru || ipconfig /all
Если в корне диска d: есть файлы с расширением txt, скопировать их в папку
tmp, а сами файлы удалить
dir d:\*.txt && (xcopy d:\*.txt d:\tmp & del d:\*.txt)
В последнем примере использована группировка команд и в случае ус-
пешного выполнения команды dir (файлы с заданной маской найдены), выпол-
нятся сразу две команды – копирования файлов xcopy и удаления файлов del.
Командные файлы
Представленные в последней таблице операторы являются средствами
группировки команд с элементами программирования. Но гораздо эффективнее с
задачей компоновки последовательности команд в алгоритмически упорядочен-
ную программу-скрипт можно справиться, создав командный файл.
Командный файл представляет собой обычный текстовый файл с расшире-
нием bat (или cmd), в который можно поместить последовательность команд опе-
рационной системы, а также ряд инструкций для формирования основных алго-
ритмических структур последовательного выполнения, ветвления и циклического
повторения. Таким образом, командный файл имеет сходство с программами на
интерпретируемых алгоритмических языках программирования, но для его ис-
полнения не требуется установки среды программирования или дополнительного
интерпретатора, достаточно интерпретатора cmd.exe.
В простейшем случае в командный файл можно записать несколько ко-
манд, и они будут выполнены последовательно, друг за другом. Пусть, например,
файл arc.bat содержит следующий набор инструкций.
d:
cd d:\tmp
d:\winrar\rar a arc.rar *.txt
del *.txt
Если запустить на выполнение файл arc.bat, то он поместит в архив arc.rar
все текстовые файлы из папки tmp, а затем удалит эти файлы. Теперь можно на-
строить (например, с помощью команды at) ежедневный или еженедельный за-
пуск этого командного файла в определенное время, и папка d:\tmp не будет пере-
полняться текстовыми файлами. Так можно выполнять командный файл arc.bat
каждую субботу в 6:00:
at 6:00 /every:s arc.bat
Таким образом, командные файлы являются удобным средством автомати-
зации выполнения рутинных задач администрирования. Как уже говорилось, воз-
можности командных файлов шире, чем простое перечисление последовательно
выполняемых команд. Об основных возможностях командных файлов речь пой-
дет ниже, здесь же отметим возможность добавлять комментарии в тексты скрип-
тов командных файлов. Строки-комментарии должны начинаться с ключевого
слова rem и позволяют на естественном языке внести пояснения в текст скрипта.
Пример:
REM Добавим в архив arc.bat все текстовые файлы из текущей папки
9
d:\winrar\rar a arc.rar *.txt
Переменные среды
В командном файле имеется возможность работать с переменными среды,
которые можно назвать отдаленными аналогами обычных переменных алгорит-
мических языков программирования. Переменные среды хранятся в памяти, име-
ют уникальные идентификаторы, с помощью которых к ним можно обращаться, и
хранят информацию в строковом виде. Принимаемые значения этих переменных
10
формируются при загрузке, регистрации пользователя в системе, старте или завер-
шении некоторых приложений, а также в сеансе работы с окном командной оболоч-
ки.
В Windows различаются два вида переменных среды: переменные среды
операционной системы (системные переменные) и переменные среды текущего
пользователя.
Системные переменные среды определяются операционной системой и
имеют одни и те же значения, для всех пользователей. Например: переменные
comspec (полный путь к командному интерпретатору, comspec=C:
\WINDOWS\system32\cmd.exe), os (название операционной системы,
os=windows_NT), SystemRoot (системный каталог операционной системы), Path
(определяет пути, которые система проверяет при поиске запущенных программ и
команд). Добавлять новые системные переменные или изменять значения сущест-
вующих могут члены группы администраторов.
Переменные среды текущего пользователя могут иметь разные значения
для каждого пользователя на конкретном компьютере. В число таких переменных
входят переменные, определяемые в приложениях (например, путь к каталогу, в
котором сохраняются файлы приложений).
Переменные среды операционной системы и конкретного пользователя
можно увидеть и изменить в диалоговом окне «Переменные среды» из вкладки
«Дополнительно» окна свойств для значка «Мой компьютер» (рис. 3).
Из командной строки с переменными среды можно работать с использо-
ванием команды set.
Когда открывается новое окно командного интерпретатора, переменные
среды обоих типов копируются в переменные среды этого командного окна. При
этом копирование происходит в следующем порядке:
1- Переменные среды операционной системы.
2- Переменные среды пользователя.
3- Переменные из файла %systemRoot%\SYSTEM32\autoexec.nt.
В сеансе работы с окном командной оболочки оператор может добавлять
новые переменные среды с использованием команды set. При этом все добавлен-
ные в сеансе переменные среды действительно лишь для этого сеанса и теряются
после закрытия окна.
11
Рисунок 3. Графический интерфейс доступа к переменным среды
Если запустить команду set без параметров, то в окне отобразятся значения
всех переменных среды для текущего сеанса командного окна.
Для определения новой переменной среды команду set необходимо ис-
пользовать в виде:
SET переменная=строка
где переменная - имя новой (или переопределяемой) переменной среды, а стро-
ка задает строку символов, присваиваемую указанной переменной.
Например, командная строка
SET FileName=tmp.dat
создает переменную FileName, принимающую значение tmp.dat.
Значение, присвоенное какой-либо переменной, доступно для обработки в ко-
мандных файлах, при использовании ее имени, заключенного в знаки процента - %.
Например команда выдачи текста на дисплей ECHO в виде:
rem Выведет строку FileName
echo FileName
rem Выведет значение переменной FileName - tmp.dat
echo %filename%
Чтобы удалить переменную среды, команду set необходимо вызвать в виде:
set имя_переменной=
Например:
rem удаляем переменную среды FileName
set FileName=
Если имя переменной не найдено в текущей среде, то при возврате команда
set имя_переменной установит значение специальной переменной среды
errorlevel равным 1. Это свойство можно использовать в командных файлах для
определения наличия определенной переменной. Из последнего примера видно,
что имена переменных для Cmd.exe регистронезависимы.
Значение некоторых полезных на практике переменных среды по команде set
не выдаются. В основном, это переменные, принимаемые значения которых динами-
чески изменяются, их перечень приведен в таблице 5:
Таблица 5. Динамически изменяемые переменные среды
Имя переменной Описание
среды
%CD% Принимает значение строки текущего каталога
%DATE% Принимает значение текущей даты
%TIME% Принимает значение текущего времени
%RANDOM% Принимает значение случайного десятичного числа в
диапазоне 1-32767.
%ERRORLEVEL% Принимает текущее значение кода завершения команды
или скрипта ERRORLEVEL
%CMDEXTVERSION% Принимает значение версии командного процессора
CMD.EXE для расширенной обработки команд.
%CMDCMDLINE% Принимает значение строки, которая вызвала командный
процессор
В связи с тем, что переменные среды хранят преимущественно строковую
информацию, для работы с подобными переменными характерны специфичные
операции поиска, замены, удаления подстрок. Командный интерпретатор предос-
12
тавляет встроенные средства поддержки подобных операций в команде set. На-
пример, следующая команда:
set переменная1=%переменная2:строка1=строка2%
присвоит переменной1 измененное значение переменной2. Команда найдет в пе-
ременной2 все вхождения строки1, заменит их на содержимое строки2 и преоб-
разованное таким образом значение переменной2 будет присвоено переменной1.
Рассмотрим пример
@echo off
set s1=one two three one two three
set s2=%s1:one=four%
set s3=%s1:two=%
echo %s2%
echo %s3%
В результате получим на экране
four two three four two three
one three one three
Если значение строки должно формироваться как конкатенация (объеди-
нение) двух и более других строк, то их достаточно записать последовательно
друг за другом:
@echo off
set s1=one
set s2=two
set s3=%s1% %s2%
echo %s3%
В результате получим на экране
one two
Еще одна интересная возможность – копирование подстроки. Для этого
команду set необходимо вызывать в виде:
set переменная1=%переменная2:~m,n%
Эта команда возьмет значение второй указанной переменной (переменная2),
вырежет из него подстроку длиной n символов начиная с (m+1)-гo и запишет ре-
зультат в первую переменную (переменная1).
@echo off
set d=12.12.2012
set month=%d:~3,2%
set year=%d:~6,4%
set hour=%time:~0,2%
echo %month%
echo %year%
echo %hour%
Значением переменной month будет значение месяца, а year - года из даты,
хранящейся в переменной d в формате dd.mm.yyyy. Значение переменной hour
выделяем из переменной окружения %time%.
Зачастую информация, подлежащая хранению и обработке, должна быть
представлена в числовом виде. Например, если потребуется подсчитать суммар-
13
ный размер, занимаемый файлами в папке, или для подсчета количества запущен-
ных процессов. В этом случае команду set необходимо использовать с ключом /A.
set /А переменная=выражение
Использование ключа /A означает, что стоящая справа от знака равенства
строка является числовым выражением, значение которого необходимо вычис-
лить. Численные значения для команды set — это десятичные числа, кроме чисел
с префиксами 0x для шестнадцатеричных чисел и 0 для восьмеричных чисел. Та-
ким образом число 20 можно представить как 0x14 и 024.
Например, если задать команду
SET /А Sum=5+6
то значение переменной Sum будет равно одиннадцати.
Все операторы, поддерживаемые командой set, приведены в таблице 6.
Строки таблицы отсортированы в порядке убывания приоритета.
Таблица 6. Операторы, поддерживаемые при арифметических вычислени-
ях командой set.
Оператор Выполнение оператора
() Группировка
*/%+- Арифметические действия
<< >> Логический перенос
& Поразрядное И
^ Поразрядное исключающее ИЛИ
| Поразрядное ИЛИ
= *= /= %= += -= &= ^= |= <<= >>= Операторы присваивания
, Разделитель выражения
В связи с тем, что такие знаки как % >> << & | функционально ”перегру-
жены” (используются для обозначения нескольких операций в разных контекстах
использования), то при их использовании необходимо заключить строку выраже-
ния в кавычки.
Если в выражении встречается строка, не являющаяся числовой лексемой,
то оно будет интерпретирована как имя переменной среды, команда set преобра-
зует ее значение в числовую форму и использует в выражении для формирования
результата. Если в выражении используется переменная с именем, не определен-
ным в текущем сеансе командной строки или это значение не может быть преоб-
разовано в числовую форму, то вместо нее подставляется нулевое значение. Это
позволяет использовать переменные среды в арифметических выражениях без об-
рамления их имен знаками %. Следующий пример иллюстрирует выполнения
арифметических операций с переменными среды.
@echo off
set a=5
set b=25
set /a c=b/a+tmpVar
set c
В результате выполнения новой переменной среды c будет присвоено зна-
чение 5, и на экран будет выведено ее значение (а также всех переменных среды,
14
начинающихся с символа с). Переменная tmpVar не была определена, поэтому ее
значение при вычислении значения выражения будет принято за 0.
Значение переменной можно задать и как результат работы команды. Так
можно получить серийный номер тома текущего диска:
@echo off
vol | find “:” >out.tmp
set /p var= <out.tmp
set serial=%var:~22,9%
del out.tmp
echo %serial%
15
качестве значения пустую строку. Необходимо помнить, что не существует ко-
манды, обратной shift. Таким образом, не удастся восстановить параметр (%0)
после выполнения команды shift.
Команда shift поддерживает ключ /n, который указывает команде начинать
сдвиг с n-го аргумента, где n — число от нуля до восьми. Например:
shift /3
сдвинет %4 на %3, %5 на %4 и т. д. %0, %1 и %2 останутся неизменными.
Если в командной строке задано больше десяти параметров, то команду
shift можно использовать несколько раз.
Для практических случаев использования командных файлов нередки слу-
чаи, когда в качестве параметров им передаются имена файлов и папок. В этом
случае в командном файле может встать проблема выделения из этого имени со-
ставляющих частей – названия диска, пути, непосредственно имени или расшире-
ния файла. Для автоматического выделения подобных объектов можно использо-
вать операторы, перечисленные в таблице 7.
Таблица 7 - Операторы для заменяемых параметров
Операторы Описание
%~Fn Переменная %n расширяется до полного имени файла
%~Dn Из переменной %n выделяется только имя диска
%~Pn Из переменной %n выделяется только путь к файлу
%~Nn Из переменной %n выделяется только имя файла
%~Xn Из переменной %n выделяется расширение имени файла
%~Sn Значение операторов N и X для переменной %n изменяется так, что
они работают с кратким именем файла
%~Tn Дата и время создания файла
%~Zn Размер файла
%~An Атрибуты файла
%~$PATH:n Проводится поиск по каталогам, заданным в переменной сре-
ды PATH, и переменная %n заменяется на полное имя первого най-
денного файла. Если переменная PATH не определена или в резуль-
тате поиска не найден ни один файл, эта конструкция заменяется на
пустую строку. Переменную PATH можно заменить на любое другое
допустимое значение
Например, всегда можно узнать, с какого диска был запущен командный
файл:
echo %~D0
Комбинируя операторы из таблицы 7, можно получать составные конст-
рукции:
%~DPn — из переменной %n выделяется имя диска и путь,
%~NXn — из переменной %n выделяется имя файла и расширение
Команда
16
ren %1 %~N1_old%~X1
переименует файл, имя которого передается в качестве параметра, дописав к име-
ни файла _old: file.dat переименуется в file_old.dat.
Команды перехода
Организация ветвлений алгоритмов в зависимости от выполнения или не-
18
выполнения того или иного условия является одной из популярнейших структур-
ных конструкций при написании программ на большинстве языков программиро-
вания. Не стал исключением и язык командных файлов. Для организации перехо-
да по условию здесь может быть использована команда if. Ниже представлены все
возможные варианты вызова этой команды.
if [/i] [not] строка1==строка2 команда [else команда]
if [not] errorlevel число команда [else команда]
if [not] exist имя_файла команда [else команда]
if [/i] строка1 оп_сравнения строка2 команда [else команда]
if cmdextversion число команда [else команда]
if defined переменная команда [else команда]
Первый вариант операции сравнения позволяет выполнить команду в зави-
симости от совпадения или несовпадения двух строк (которые могут быть пред-
ставлены и переменными). Например, так мы можем предотвратить запуск ко-
мандного файла без параметров:
@echo off
if -%1 == - goto :eof
…
При сравнении с использованием переменных всегда необходимо учиты-
вать возможный вариант отсутствия переменной с указанном имени в текущем
контексте командного окна. Например, если командный файл запущен без пара-
метров, то переменная %1 будет не определена, и на этапе выполнения безобид-
ная на первый взгляд конструкция
if %1 == /h goto help
приведет к ошибке из-за отсутствия левого операнда в операторе сравнения. По-
этому рекомендуется использовать в правой и левой части операции сравнения
какой-нибудь дополнительный символ, например '-' (или заключать сравниваемые
объекты в кавычки).
Второй вариант команды if опирается на результат выполнения предыду-
щей команды. Здесь необходимо учесть, что в результате своего выполнения ко-
манды Windows выставляют переменную окружения errorlevel в значение кода
своего завершения. Общепринято, что код завершения 0 соответствует успешно-
му завершению команды, а 1 и более – неудачному завершению (например, ниче-
го не найдено командой find, команда ping не получила ответ на запрос, команда
del не смогла удалить файл и т.п.) и анализ значения переменной дает возмож-
ность выполнить различные действия, например, при успешном или неуспешном
выполнении предшествующей команды:
ping www.volpi.ru >nul
if %errorlevel% 1 (
echo %date% %time% Нет связи с сайтом www.volpi.ru>> report.txt
ipconfig /all >>report.txt
)
Приведенный выше пример иллюстрирует возможность выполнения не-
скольких команд в случае выполнения (или невыполнения) заданного условия.
Для группировки команд используются круглые скобки.
Если алгоритм работы командного файла предусматривает переход в слу-
19
чае отношений «больше», «меньше», «больше или равно», «меньше или равно»,
то можно использовать другой синтаксический вариант команды if:
if [/i] строка1 оп_сравнения строка2 команда [else команда]
Здесь для сравнения используются трехбуквенные операторы, названия и
назначение которых приведены в таблице 8. Ключ /i позволяет игнорировать ре-
гистр символов при сравнении.
Таблица 8. Операторы сравнения в команде if
Оператор Описание
EQU равно
NEQ не равно
LSS меньше
LEQ меньше или равно
GTR больше
GEQ больше или равно
20
:NoSuchFile
rem Файл не найден. Выводим сообщение и создаем пустой файл
echo Файл '%1' не найден.
copy nul %1
21
Если параметр множество содержит подстановочные знаки (* и ?), коман-
да, указанная в параметре команда, выполняется для каждого каталога, совпа-
дающего с параметром множество. Скажем, выполнив следующий командный
файл:
for /D %%f in (d:\work\h*.*) do attrib +h %%f.
мы установим атрибут «Скрытый» для всех папок, начинающихся с символа h, в
папке d:\work.
С помощью ключа /R можно задать рекурсию в команде for:
for /R [[диск:] путь] %переменная in (набор) do
команда [параметры]
Команда с ключом /R проходит по дереву каталогов с корнем в [диск:]путь,
выполняя инструкцию for для каждого каталога в дереве. Если после ключа /R не
задан каталог, предполагается текущий каталог. Если параметр множество зада-
но одной точкой (.), то команда просто перечислит каталоги в дереве.
for /R d:\ %%f in (.) do echo %%f
Для формирования списка всех файлов с расширением doc в заданном ката-
логе и всех его подкаталогах можно использовать следующую команду в пакет-
ном файле:
for /R d:\docs %%f in (*.doc) do echo %%f >> docfiles.lst
Ключ /L позволяет реализовать с помощью команды for арифметический
цикл, когда переменная цикла получает ряд целочисленных значений:
for /L {%% | %}переменная in (НачальноеЗначение#, шаг#,
КонечноеЗначение#) do команда [Параметры]
Цикл выполняет команду для каждого значения переменной цикла. Пере-
менная цикла первоначально принимает значение НачальноеЗначение# и далее на
каждом шаге изменяется на величину шаг#. Когда переменная итерации превысит
параметр КонечноеЗначение#, командная оболочка покидает цикл. Также можно
использовать отрицательный параметр для перемещения в диапазоне убывающих
значений. Например, (1,1,4) создает последовательность «1 2 3 4», а (5,-2,1) созда-
ет последовательность «5 3 1».
Например, в результате выполнения следующего фрагмента командного
файла в файл testconnect.log будет помещен результат проверки доступности ком-
пьютеров с адресами в диапазоне 192.168.0.(1-254). Цикл обеспечивает перебор
последней цифры адреса.
echo %date% %time%>>testconnect.log
FOR /L %%f IN (1,1,254) DO (ping -n 3 192.168.0.%%f
if errorlevel 1 echo Компьютер 192.168.0.%%f не отвечает >>
testconnect.log)
Числа, помещаемые в переменную цикла for /L, можно использовать в
арифметических вычислениях. Рассмотрим командный файл my.bat следующего
содержания:
@echo off
22
cls
set /A Sum=0
for /L %%f in (1,1,5) do set /a Sum=Sum+%%f
echo Sum=%Sum%
В результате выполнения этого командного файла будет вычислена сумма
чисел от 1 до 5 и на экране будет выведен результат в виде:
Sum=15
Использование команды for с ключом /f предоставляет возможности раз-
бора содержимого текстовых файлов. Обобщенный синтаксис команды в этом
случае:
for /F ["ключи"] %переменная in (набор) do команда [параметры]
Разбор файлов состоит в чтении вывода, строки или содержимого файла,
разбиении его на отдельные строки текста, разбиении каждой строки на состав-
ляющие слова по определенным маркерам и выполнении команд(ы) для каждого
выделенного слова. По умолчанию /F передает первый отделенный пробелом
элемент из каждой строки файлов заданного набора.
Разбор файлов следует использовать для обработки вывода команд, строк и
содержимого файла. Переменные итерации позволяют перебирать строки, кото-
рые требуется проверить. Параметр ключи используется для изменения порядка
разбора.
По умолчанию ключ /F выделяет из каждой строки файла первое слово,
очищенное от окружающих его пробелов, причем пустые строки в файле пропус-
каются. Ключи задаются в виде заключенной в кавычки строки, их перечень и
описание приведены в таблице 9.
23
ные имена переменных. Форма m-n задает диапазон, указывающий элементы с m-
го по n-ый. Если последним символом строки tokens= является звездочка (*), то
размещается дополнительная переменная, в которую помещается остаток строки
после разбора последнего элемента.
Разберем использование этой команды на примере пакетного файла par-
ser.bat, который производит разбор файла со списком запущенных процессов, по-
лученных командой tasklist:
@ECHO OFF
tasklist>list.txt
FOR /F "TOKENS=1,3,4-6 SKIP=3" %%i IN (list.txt) DO echo %%i %%l
24
15.08.2012 16:38 161 099 arc.rar
17.08.2012 12:32 298 700 docfiles.lst
17.08.2012 17:52 0 list.txt
11.10.2005 03:51 302 080 Rar.exe
16.08.2012 14:12 2 862 report.txt
29.05.2006 12:44 22 089 words15.08.2012.txt
11 файлов 812 090 байт
0 папок 276 914 065 408 байт свободно
Заключение
Командные файлы предоставляют администратору достаточно широкие
возможности для автоматизации действий по настройке, обслуживанию и мони-
торингу состояния компьютера под управлением ОС Windows. И хотя на сего-
дняшний день для решения существуют более мощные и гибкие средства (WSH,
PowerShell), о которых речь пойдет на следующих лабораторных, в связи с нали-
чием большого количества практических наработок, а также благодаря относи-
тельной простоте, командные файлы по прежнему используются на практике.
26
крывал все запущенные блокноты.
2.2.8. Определите собственную переменную среды в сеансе командного окна.
Убедитесь, что эта переменная уничтожается при закрытии окна и недоступна
в других командных окнах.
2.2.9. Создайте командный файл, который копирует все файлы с расширением,
заданным в качестве первого параметре из папки, заданной вторым парамет-
ром в папку, заданную третьим параметром. С помощью команды at реали-
зуйте запуск этого командного файла в заданный момент времени.
2.2.10 Выполните индивидуальное задание в соответствии с заданием. Для
командного файла обеспечьте возможность запуска с ключом /a для вывода
информацию о разработчике, а также с ключом /h для вывода справки о ко-
мандном файле (назначение, перечень ключей или параметров).
1) Подсчитать размер папки вместе с содержимым всех ее подпапок. Имя
папки брать как параметр командного файла.
2) Вывести содержимое папки, отсортированное на выбор (с использованием
команды choice) по дням, месяцам или годам создания файлов. Имя папки брать
как параметр командного файла.
3) Задать в текстовом файле список процессов, запрещенных к запуску. Соз-
дать командный файл, завершающий все запущенные процессы из списка.
4) Создать командный файл, который синхронизирует содержимое заданной
папки с эталонной папкой. После запуска командного файла в заданной папке
должен оказаться тот же набор файлов, что и в эталонной (если файла нет – он
копируется из эталонной, если найдется файл, которого нет в эталонной - уда-
ляется). Если файл с некоторым именем есть и в заданной папке и в эталонной
–удалять и перезаписывать его не допускается Имена папок передаются как па-
раметры командного файла
5) Вывести на экран все различия двух папок, имена которых передаются в
качестве параметров (отличия искать в размерах, именах и атрибутах файлов).
6) Вывести список всех подпапок в папке, имя которой передается команд-
ному файлу в качестве параметра, отсортировав их в порядке возрастания ко-
личества находящихся в них файлов (включая подпапки).
7) Создать командный файл, который создает архивы файлов некоторой пап-
ки, имя которой задано в качестве параметра, созданных в текущем году. Для
файлов каждой недели создавать отдельный архив. У уже помещенных в архив
файлов снимать атрибут a с целью предотвращения повторной архивации.
Файлы архивов копировать в отдельную папку, имя которой передается скрип-
ту вторым параметром.
8) Создать командный файл, создающий в системе нового пользователя и
помещающего его в группу “Опытные пользователи” и удалив из группы
«Пользователи» (использовать команды net user и net localgroup). Имя поль-
зователя и пароль передаются в качестве параметров, если не переданы - вво-
дятся с клавиатуры. Для пользователя создать папку в D:\work с именем
Folder_Имя_пользователя, скопировав в нее все файлы из ранее созданной эта-
лонной папки. Для созданной папки пользователя и всех ее файлов определить
права доступа Полный доступ для самого пользователя и Нет доступа для
всех остальных пользователей (использовать команду cacls).
27
9) Разложить содержимое папки, имя которой передается в качестве пара-
метра командного файла, по подпапкам в соответствии с расширением файлов
– все *.exe файлы – в папку EXE, *.txt – в TXT и т.д. Создать отдельную папку
для файлов без расширения.
10) Для заданной в качестве параметра скрипта папки найти все файлы, раз-
мер которых превышает заданный в качестве параметра и предоставить пользо-
вателю возможность выбора (команда choice) действий с этими файлами – ар-
хивация с удалением или простое удаление.
2.2.11. Представьте отчёт по лабораторной работе преподавателю и отчи-
тайте работу.
2.3. Содержание отчета
Отчет по лабораторной работе должен содержать следующие сведения:
- название и цель работы;
- протокол выполнения лабораторной работы, содержащий команды или
тексты командных файлов по каждому пункту заданий, а также резуль-
таты их выполнения.
3. Контрольные вопросы
28
4.Литература
29
Учебное издание
Методические указания
30