Batch Windows PDF

Скачать как pdf или txt
Скачать как pdf или txt
Вы находитесь на странице: 1из 30

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ВОЛЖСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ)


ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО ОБРАЗОВАТЕЛЬ-
НОГО УЧРЕЖДЕНИЯ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
КАФЕДРА «ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ»

Д.Н. Лясин, С.Г. Саньков

Командные файлы ОС MS Windows

Методические указания

Волгоград
2012
УДК 004.056

Рецензент:

канд. тех. наук доцент В. И. Капля

Издается по решению редакционно-издательского совета


Волгоградского государственного технического университета

Лясин, Д.Н. Саньков С.Г. Командные файлы операционной системы MS


Windows
[Электронный ресурс]: методические указания / Д.Н. Лясин, С.Г.
Саньков//Сборник «Методические указания» Выпуск.-Электрон. текстовые
дан.(1файл:207 Kb) – Волжский: ВПИ (филиал) ВолгГТУ,2012.-
Систем.требования:Windows 95 и выше; ПК с процессором 486+; CD-
ROM.

Содержатся сведения, необходимые для изучения средств автоматизации админи-


стрирования операционных систем семейства Windows в текстовом режиме с использо-
ванием командного интерпретатора. Рассмотрены принципы работы командного ин-
терпретатора, приведены описания основных команд ОС Windows, дано описание ко-
мандных файлов и основных структурных средств их программирования. Приведен по-
рядок выполнения и варианты заданий к лабораторным работам.
Предназначены для студентов, обучающихся по направлению 230100 "Инфор-
матика и вычислительная техника" и направлению 231000 "Программная инженерия"
всех форм обучения в рамках курсов «Системное программное обеспечение», «Основы
системного программного обеспечения» и «Операционные системы» .CD-ROM

Волгоградский государственный техниче-


ский университет, 2012
 Волжский политехнический
институт, 2012
1 Лабораторная работа № 1. Командные файлы ОС Windows

Цель работы: изучить интерфейс командной строки ОС Windows, приобре-


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

1.1 Теоретические основы

Командный интерпретатор
Интерфейс командной строки является мощным и гибким инструментом ре-
шения широкого круга административных задач. Несмотря на то, что графиче-
ский интерфейс ОС 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), в котором можно запускать команды и ви-
деть результат их выполнения.

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


vol.

3
Команды
Все команды, которые оператор может выполнить в окне интерпретатора
Cmd.exe, делятся на внутренние и внешние. Внутренние команды распознаются
самим интерпретатором. К ним относятся, например, cls – очистка экрана, time –
просмотр и изменение текущего времени, dir – просмотр содержимого папки.
Внешние команды оформлены как отдельные программы, которые по умолчанию
находятся в той же папке, что и сам интерпретатор cmd.exe. Внешними являются,
например, команды: xcopy – копирование файлов и каталогов, at – запуск про-
грамм и команд в заданное время, cacls – просмотр и изменение прав доступа к
файлам и папкам.
Рассмотрим общие принципы работы с командной строкой. В ответ на
стандартное приглашение вида
полный_ путь_к_ текущей_ папке>_
можно ввести имя команды с параметрами и ключами. Справку по конкретной
команде можно получить в окне оболочки, если запустить команду с ключом /?
(рис.2).

Рисунок 2. Вывод справки о работе команды копирования файлов copy

Детальное описание каждой команды не входит в объем настоящих методи-


ческих указаний, но соответствующий справочник можно найти, например, в [5].
Список команд можно получить и в окне командной оболочки, выполнив команду
help.
По умолчанию команды выводят результаты своего исполнения на экран
монитора, и принимают входные данные с клавиатуры. Но это соглашение можно
изменить и для этого служат операторы перенаправления.
Операторы перенаправления команд используются для изменения место-
положений потоков ввода и вывода команд, заданных по умолчанию, на какие-
либо другие. Местоположение потоков ввода и вывода называется дескриптор. В
таблице 1 описаны операторы перенаправления потоков ввода и вывода команд.
С использованием операторов перенаправления можно направить вывод
результатов работы команды (скрипта) в заданный файл или использовать эти ре-
зультаты в качестве входных параметров для выполнения другой команды
4
(скрипта). Это позволяет организовывать эффективную коммуникацию между
процессами при минимальных затратах времени и ресурсов.
Таблица 1. Операторы перенаправления ввода/вывода команд
Оператор перена-
Описание
правления
Записывает данные на выходе команды вместо окна ко-
> мандной строки в файл или на устройство, например, на
принтер.
Читает поток входных данных команды из файла, а не с
<
клавиатуры.
Добавляет выходные данные команды в конец файла, не
>>
удаляя при этом существующей информации из файла.
Считывает данные на выходе одного дескриптора как
>&
входные данные для другого дескриптора.
Считывает входные данные одного дескриптора как вы-
<&
ходные данные другого дескриптора.
Считывает выходные данные одной команды и записыва-
| ет их на вход другой команды. Эта процедура известна
под названием «канал».
По умолчанию, входные данные команды (дескриптор STDIN) отсылаются
с клавиатуры интерпретатору команд Cmd.exe, далее Cmd.exe отправляет выход-
ные данные команды (дескриптор STDOUT) в окно командной строки. В сле-
дующей таблице представлены доступные дескрипторы.
Таблица 2. Дескрипторы устройств ввода/вывода ОС Windows
деск- Числовой эквива-
Описание
риптор лент дескриптора
STDI
0 Ввод с клавиатуры
N
STDO
1 Вывод в окно командной строки
UT
STDE Приемник сообщений об ошибках при
2
RR выполнении команд
Эти дескрипторы определяются индиви-
UND
3-9 дуально для каждой прикладной про-
EFINED
граммы.
Номера от 0 до 9 представляют первые 10 дескрипторов. Для запуска про-
граммы и перенаправления любого из 10 дескрипторов используется интерпрета-
тор команд Cmd.exe. Для задания требуемого дескриптора перед оператором пе-
ренаправления введите его номер. Если дескриптор не определен, то по умолча-
нию оператором перенаправления ввода «<» будет ноль (0), а оператором перена-
правления вывода «>» будет единица (1). После ввода оператора «<» или «>» не-
обходимо указать, откуда читать и куда записывать данные. Можно задать имя
файла или любой из существующих дескрипторов. Для задания перенаправления

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 предоставляет возможность объеди-
нять несколько команд в одной строке, допуская их последовательное выполне-
ние, а также разрешая обуславливать выполнение одних команд результатами вы-
полнения других.

Таблица 4. Операторы условного выполнения команд


Символ Синтаксис Определение
Используется для разделения несколь-
ких команд в одной командной строке.
& команда1 & команда2
В Cmd.exe выполняется первая коман-
да, затем вторая команда.
Запускает команду, стоящую за сим-
волом &&, только если команда,
стоящая перед этим символом была
выполнена успешно. В Cmd.exe вы-
&& команда1 && команда2
полняется первая команда. Вторая ко-
манда выполняется, только если пер-
вая была выполнена успешно (если
переменная окружения errorlevel=0).
Запускает команду, стоящую за сим-
волом ||, только если команда, стоящая
перед символом || была выполнена с
ошибкой. В Cmd.exe выполняется
|| команда1 || команда2 первая команда. Вторая команда вы-
полняется, только если первая была
выполнена c ошибкой (полученный
код ошибки errorlevel превышает
ноль).
Используется для группировки или
() (команда1 & команда2)
вложения команд.

Примеры.
Вывести на экран содержимое корневой папки диска 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

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


Команды пакетного файла выводятся на экран. Это может оказаться неже-
лательным, отвлекая оператора от результатов работы скрипта подробностями его
реализации. В этом случае с помощью команды echo off можно отключить дуб-
лирование на экране команд, идущих после нее. Например, если начать скрипт с
команды echo off, то в окно не будут выводиться исполняемые команды (кроме
самой команды echo off). Отключить дублирование самой команды echo off мож-
но, поместив в начале строки знак @. Этот знак подавляет дублирование команды
только из своей строки.
Отказ от дублирования команд на экране может быть отменен. Для этого
используется команда echo on.
Таким образом, если начать командный файл с команды
@ЕСНО OFF
то дублирование команд будет полностью подавлено.
Вывести строку сообщения на экран можно с помощью команды
ECHO сообщение
Например,
ECHO Привет!
Если командный файл исполняется в русифицированной версии Windows,
то необходимо учитывать, что в среде командного процессора символы нацио-
нального алфавита используются в DOS-кодировке. Для переключения между ко-
довыми страницами Windows и DOS используется команда
CHCP номер страницы
rem использовать кодовую страницу 866 (DOS):
CHCP 866
rem использовать кодовую страницу 1251 (WINDOWS):
CHCP 1251
Команда echo. (c точкой непосредственно за словом "echo") выводит на
экран пустую строку.
Вывод сообщений командой echo можно перенаправить в файл или другое
устройство вывода. Для этого, как нетрудно догадаться, используется описанный
в ранее механизм перенаправления ввода/вывода (символы > и >>).
Например,
@ЕСНО OFF
ECHO Содержимое папки work по состоянию на> report.txt
date /t>> report.txt
time /t>> report.txt
dir d:\work >>report.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%

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


Вызов командных файлов можно параметризовать. Под этим подразумева-
ется вызов командного файла с передачей ему от одного до нескольких парамет-
ров. В таком случае скрипт, помещенный в командный файл, может обрабатывать
различную информацию при разных параметрах вызова, делая его гибче и адап-
тированнее нуждам оператора. Например, командный файл архивирования фай-
лов в некоторой папке может получать имя обрабатываемой папки из параметров
вызова и тогда его можно применять к различным папкам, а не к одной, имя кото-
рой жестко прописано в коде командного скрипта.
Для доступа к параметрам командной строки в командном файле приме-
няются символы %0, %1,…,%9. При этом вместо %0 всегда подставляется имя
выполняемого пакетного файла, а вместо %1, %2,…, %9 — значения первых де-
вяти параметров командной строки соответственно Если в командной строке при
вызове пакетного файла задано меньше девяти параметров, то "лишние" перемен-
ные из %1 - %9 являются пустыми строками. Модифицируем ранее рассмотрен-
ный пример архивирования и удаления файлов arc.bat.
rem Вызов arc.bat имя_папки маска_файлов имя_архива
@echo off
d:\winrar\rar a %1\%3 %1\%2
del %1\%2
Теперь этот командный файл необходимо вызывать с тремя параметрами:
в первом передается полный путь к папке с файлами, второй параметр определяет
маску файлов, подлежащих архивации и удалению, а третий параметр задает имя
архива, в который будут помещены заархивированные файлы.
Обратиться к командному файлу можно так:
arc.bat d:\tmp *.txt arc.rar
А для другой папки, возможно, потребуется архивация файлов с расшире-
нием log и вызов командного файла примет вид:
arc.bat d:\work\logs *.log log.rar
Если в командный файл передается более 9 параметров, на помощь прихо-
дит команда shift, которая сдвигает значения параметров с %0 по %9, копируя
каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение
%2 — в %1 и т. д. Замещаемому параметру %9 присваивается десятое значение
параметра вызова. Если же такой параметр не задан, то переменная %9 получит в

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.

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


Для взаимодействия пользователя с командным файлом предусмотрен го-
раздо меньший выбор средств по сравнению с традиционными алгоритмически-
ми языками.
Для того чтобы вручную прервать выполнение запущенного командно-
го файла, необходимо нажать клавиши <Ctrl>+<C> или <Ctrl>+<Break>. Если
надо лишь приостановить работу командного файла до момента нажатия клавиши
на клавиатуре, можно воспользоваться командой pause. Хорошим стилем счита-
ется выдача предупреждения пользователя о потенциально опасных для данных
командах и приостановкой выполнения. Тогда у пользователя будет возможность
продолжить выполнения командного скрипта при нажатии клавиши или его за-
вершения по <Ctrl>+<C> / <Ctrl>+<Break>:
ECHO Сейчас будут удалены все файлы в d:\work
ECHO Для отмены нажмите Ctrl-C
PAUSE
DEL d:\work\*.*
Для того, чтобы пользователь мог задать значение переменной с клавиату-
ры используется команда set с ключом /p:
SET /P имя переменной = текст
Пользователю будет выведен текст-приглашение и командный файл пе-
рейдет в режим ожидания ввода с клавиатуры. Введенная строка заносится в пе-
ременную среды.
set /p Folder=Введите имя папки
Еще одну интересную возможность – делать выбор одного из альтернатив-
ных вариантов, предоставляет команда choice.

Команды передачи управления


Последовательное выполнение команд в командном файле можно прервать
несколькими способами. Во-первых, можно использовать команду перехода
goto метка
Эта, табуированная в языках высокого уровня, команда в условиях слабо
структурируемых командных файлов используется довольно часто. Метка, на ко-
торую осуществляется переход по этой команде, оформляется следующим обра-
зом:
:метка
Очевидно, что безусловный переход должен быть обусловлен командой if,
иначе не выполнятся команды, помещенные между командой перехода и меткой в
случае перехода вперед или произойдет зацикливание при переходе назад. В ка-
честве метки перехода можно указывать строку :eof, которая передает управление
в конец текущего пакетного файла:
17
@ЕСНО OFF
REM Если файл был запущен без параметров, выходим из него,
REM иначе печатаем первый параметр
IF -%1==- GOTO :EOF
ECHO %1
Второй способ передачи управления, причем как внутри самого пакетного
файла, так и при обращении к другим пакетным файлам – использование команды
call.
Для того, чтобы обратиться к внешнему командному файлу достаточно
указать его и его параметры в команде call:
call файл пакетные_параметры
Пример:
call test.bat par1 par2 par3
Данный вызов приведет к передаче управления командному файлу test.bat
c тремя указанными параметрами. Альтернативой подобному запуску может стать
использование имени стороннего командного файла в качестве имени команды:
test.bat par1 par2 par3
Но при последнем вызове после окончания работы командного файла
test.bat управление не будет возвращено в вызывавший командный файл, а, следо-
вательно, не будут выполнены все следующие за командой вызова инструкции.
Вызов же командой call позволяет по окончании работы вызванного командного
файла вернуться в вызвавший и продолжить его выполнение.
В качестве адресата вызова команды call допустимо использовать метки
внутри текущего командного файла:
CALL :метка аргументы
При вызове такой команды создается новый контекст текущего пакетного
файла с заданными аргументами и управление передается на инструкцию, распо-
ложенную сразу после метки. Для выхода из такого пакетного файла необходимо
два раза завершить его работу, достигнув конца командного скрипта или вызвав
команду exit /b (ключ /b позволяет завершить работу лишь командного файла, а
не сеанса оболочки). При этом первый выход будет означать возврат управления
на инструкцию, расположенную сразу после строки call, а второй выход заверша-
ет выполнение пакетного файла. Такое поведение команды call позволяет оформ-
лять фрагменты кода в виде подпрограмм:
call :proc1 par1 par2
...
:proc1
rem Здесь %0=:proc1 %1=par1 %2=par2
...
exit /b
...

Команды перехода
Организация ветвлений алгоритмов в зависимости от выполнения или не-

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 больше или равно

call test.bat par1 par2 par3


if %errorlevel% GTR 1 (
echo Ошибка выполнения стороннего скрипта
exit /b 1)

Отметим также, что сравнение проводится по общему типу данных, так
что если обе сравниваемые строки содержат только цифры, то обе строки пре-
образуются в числа, после чего выполняется сравнение этих чисел.
if %FileSize% LEQ 1000000 (…) else (…)
Если в команде if используется конструкция else, то она обязательно
должна располагаться в той же строке, что и if.
Поставить выполнение или невыполнение некоторого фрагмента кода в за-
висимость от существования некоторой переменной может команда:
if defined переменная команда [else команда]
Здесь условие defined принимает в качестве аргумента имя переменной
среды и возвращает истинное значение, если эта переменная определена:
@ECHO OFF
IF not defined FolderName set FolderName=d:\tmp
xcopy /y /c *.log %FolderName%
Аналогично для проверки существования файла на диске используется ко-
манда
if [not] exist имя_файла команда [else команда]
Пример использования команды:
if not exist %1 goto NoSuchFile
rem Вывод содержимого файла на экран
echo Содержимое файла '%1'
type %1
goto :EOF

20
:NoSuchFile
rem Файл не найден. Выводим сообщение и создаем пустой файл
echo Файл '%1' не найден.
copy nul %1

Наконец, последний вариант условной команды:


if cmdextversion число команда [else команда]
ставит выполнение команды в зависимость от внутреннего номера версии теку-
щей реализации расширенной обработки команд Номер версии будет увеличи-
ваться на единицу при каждом добавлении существенных возможностей расши-
ренной обработки команд. Таким образом можно адаптировать работу командно-
го файла к возможностям установленной на компьютере командной оболочки.
Если расширенная обработка команд отключена, условие cmdextversion не будет
истинно.

Организация циклов в командных файлах


Циклическое повторение некоторого фрагмента командного файла можно
организовать с использованием пары команд if и goto. Но гораздо эффективнее
использовать для этих целей команду for. Команда for обеспечивает выполнение
заданной команды (группы команд) для всех элементов некоторого множества
(например, для всех файлов в папке). Обобщенный синтаксис команды for:
for {%переменная|%%переменная} in (множество) do команда
[Параметры]

Чтобы скопировать содержимое всех файлов, имеющих разрешение .log или


.txt в текущем каталоге в один файл all.txt с помощью заменяемой переменной
%%f, можно использовать следующую команду:
for %%f in (*.log *.txt) do type %%f >>all.txt
В приведенном примере каждый файл с расширением .log или .txt в теку-
щем каталоге будет подставляться вместо переменной %%f, пока не будут обра-
ботаны все файлы с таким расширением. Чтобы использовать данную команду
непосредственно в командной строке, а не в командном файле, следует заменить
все вхождения %%f на %f. В противном случае переменная игнорируется, и ото-
бражается сообщение об ошибке.
В качестве элементов множества перебираемых элементов могут быть
представлены любые строки, в этом случае переменная цикла по очереди примет
значение каждой из этих строк. Например, так мы можем создать 5 папок с пре-
допределенными названиями в текущей папке:
for %%f in (help work out bin “my files”) do md %%f
Существуют дополнительные синтаксические конструкции использования
команды for. Одна из них реализуется, если указать в команде for ключ /D:
for /D %переменная in (набор) do команда [параметры]

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.

Таблица 9. Ключи разбора строк в команде for /f


Ключ Описание
EOL=C Определение символа комментариев в начале строки (допус-
кается задание только одного символа)
SKIP=N Число пропускаемых при обработке строк в начале файла
DELIMS=XXX Определение набора разделителей для замены заданных по
умолчанию пробела и знака табуляции
TOKENS=X,Y,M- Определение номеров подстрок, выделяемых из каждой
N строки файла и передаваемых для выполнения в тело цикла

Ключ EOL позволяет определить символ, наличие которого в начале строки


идентифицирует строку как комментарий, исключая ее из разбора.
Ключ SKIP позволяет исключить из разбора несколько начальных строк
файла, если по формату они содержат заголовок данных, описательную информа-
цию и др., т.е. информацию, не предназначенную для обработки.
Ключ DELIMS позволяет определить, какие символы будут воспринимать-
ся командой for в качестве разделителей логических подстрок-элементов разбора.
Ключ TOKENS задает элементы, передаваемые из каждой строки в тело
цикла for при каждой итерации. Для каждого элемента создаются дополнитель-

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

При выводе информации о запущенных процессах учитываем, что команда


tasklist без параметров выводит информацию в виде:
Имя образа PID Имя сессии № сеанса Память
========================= ====== ================ ======== ============
System 4 Console 0 248 КБ
smss.exe 1624 Console 0 436 КБ
csrss.exe 1688 Console 0 2 540 КБ
winlogon.exe 1792 Console 0 6 748 КБ
services.exe 1844 Console 0 3 832 КБ
lsass.exe 1856 Console 0 7 076 КБ
svchost.exe 196 Console 0 5 828 КБ
svchost.exe 268 Console 0 5 224 КБ
svchost.exe 1084 Console 0 25 668 КБ
svchost.exe 1252 Console 0 4 876 КБ
svchost.exe 1472 Console 0 6 744 КБ

Заносим этот список в файл list.txt, а затем обрабатываем его построчно.
Для каждой строки, кроме первых 3 (skip=3), выделяем 5 строк. В %%i заносятся
имена процессов, %%j – имя сессии, %%k, %%l, %%m – данные из 3 осталь-
ных столбцов (сразу отмечаем, что допускается всего 26 переменных для разбора
по числу символов в латинском алфавите). В рассмотренном примере просто вы-
водим на экран имена процессов и объем используемой ими памяти.
Результат вывода команды tasklist необязательно предварительно заносить
в файл. В скобках, задающих обрабатываемый набор строк, можно в апострофах
непосредственно указать команду, вывод которой будет разбирать команда for.
Еще один пример:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CLS
FOR /F "TOKENS=1,2,3,4 SKIP=5" %%i IN ('dir /a:-d') DO (
set dat=%%i
set year=!dat:~6,4!
if !year! gtr 2011 echo %%i %%j %%l
)
В этом примере осуществляется разбор команды dir, выводящей на экран
информацию о файлах из текущей директории. Формат вывода команды dir:
Том в устройстве D имеет метку DATAD
Серийный номер тома: CCE5-4ACE

Содержимое папки D:\tmp

17.08.2012 17:52 226 1.bat


16.07.2012 15:39 0 1.txt
17.05.2012 11:47 24 951 all.txt
15.08.2012 16:23 39 arc.bat

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 байт свободно

С помощью команды for осуществляется разбор каждой строки вывода


команды и в первом столбце выделяется год создания файла. После этого на экран
выводится информация только о тех файлах, которые были созданы после 2011
года. Для ключа TOKENS в последнем примере будут идентичными следующие
определения: TOKENS=1,2,3,4; TOKENS=1,2,3-4; TOKENS=1-4.
В последнем примере обращает на себя внимание не встречавшееся ранее
обращение к переменным вида !имя_переменной! Такое обращение характерно
для работы с переменными в команде цикла или внутри блока команд цикла. Оно
связано с внутренними особенностями работы командного интерпретатора с пе-
ременными в этих областях кода. Обычное обращение %имя_переменной% при-
водит к ошибкам и чтобы избежать проблем с инициализацией и работой с пере-
менными в таком контексте необходимо использовать в командном файле дирек-
тиву SETLOCAL ENABLEDELAYEDEXPANSION, и сами переменные в командах
цикла (и условных командах) обрамлять символами ‘!’.
В команде for /f можно также обработать отдельную строку. Для этого
следует ввести нужную строку в кавычках вместо набора имен файлов в скобках.
Обработка будет выполнена аналогично каждой отдельной строке файла в преды-
дущих примерах. Например, файл следующего содержания:
@ECHO OFF
for /f " TOKENS=2,3* DELIMS=, " %%i in ("Один, Два Три,
Четыре, Пять, Шесть, Семь”) do @ECHO %%i:%%j:%%k
выведет:
Два Три: Четыре: Пять, Шесть, Семь
Команда for разбирает строку по заданному разделителю (,) и выводит
значение второй (%%i), третьей(%%j) строк и хвоста строки (%%k) .
Еще одной возможностью оператора for, уже встречавшейся при изучении
параметров командных файлов, является расширение переменных цикла до пол-
ного пути, расширения, имени файла, его размера и т.п. В таблице 10 еще раз опи-
саны эти расширения для параметра %%i.
Таблица 10. Операторы для переменных команды for
Операторы Описание
%%~Fi Переменная %i расширяется до полного имени файла
%%~Di Из переменной %i выделяется только имя диска
%%~Pi Из переменной %i выделяется только путь к файлу
%%~Ni Из переменной %i выделяется только имя файла
%%~Xi Из переменной %i выделяется расширение имени файла
%%~Si Значение операторов N и X для переменной %i изменяется
так, что они работают с кратким именем файла
%%~Ti Дата и время создания файла
%%~Zi Размер файла
25
%%~Ai Атрибуты файла
Например, следующий командный файл выведет суммарный размер всех
файлов в папке, имя которой передано в качестве параметра.
@ECHO OFF
CHCP 1251
SETLOCAL ENABLEDELAYEDEXPANSION
set /a Sum=0
for %%i in (%1\*.*) do set /a Sum=!Sum!+%%~Zi
echo Размер файлов в папке %1 - %Sum%

Заключение
Командные файлы предоставляют администратору достаточно широкие
возможности для автоматизации действий по настройке, обслуживанию и мони-
торингу состояния компьютера под управлением ОС Windows. И хотя на сего-
дняшний день для решения существуют более мощные и гибкие средства (WSH,
PowerShell), о которых речь пойдет на следующих лабораторных, в связи с нали-
чием большого количества практических наработок, а также благодаря относи-
тельной простоте, командные файлы по прежнему используются на практике.

2. Порядок выполнения работы


2.1. Ознакомьтесь с теоретическими основами использования команд ОС
Windows в текстовом режиме в настоящих указаниях и конспектах лекций.
2.2. Выполните задания 2.2.1-2.2.11.
Все задания необходимо выполнить в текстовом интерфейсе команд-
ной строки Windows. Выполнение каждой команды необходимо подтвердить в
отчете снимком окна командной оболочки с самой командой и результатом ее
выполнения (фрагментом результата при большом объеме). Задания, требующие
создания командных файлов, должны сопровождаться исходными текстами
скриптов.
2.2.1. Запустите окно командной оболочки Cmd.exe и сделайте текущей корне-
вую папку диска D:
2.2.2. Откройте справочник по командной строке Windows.
2.2.3. Запишите названия как минимум 10 внешних и 10 внутренних команд
Windows.
2.2.4. Изучите справку по команде Dir. Используя эту команду выведите на эк-
ран список всех скрытых и системных файлов на диске D:
2.2.5. Изучите справку по команде Tasklist. Создайте в папке spo1 на диске D:
текстовый файл, содержащий список процессов, использовавших процессор
более 10 минут. Отсортируйте список с использованием команды sort.
2.2.6. Изучите справку по команде Taskkill. Запустите несколько экземпляров
стандартного калькулятора Windows. Закройте все калькуляторы одной ко-
мандой.
2.2.7. Создайте условную команду с использованием операторов && или ||, кото-
рая в случае, если запущен хотя бы экземпляр стандартного блокнота
Windows, дописывал бы в файл reportNP.txt дату и время обнаружения и за-

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. Контрольные вопросы

3.1. Что такое командный интерпретатор, где в ОС семейства он находится, ка-


кие функции выполняет?
3.2. Чем отличаются внешние и внутренние команды командного интерпрета-
тора?
3.3. В чем смысл операций перенаправления ввода-вывода команд? Приведите
самостоятельные примеры использования операторов перенаправления.
3.4. Откуда сеанс командной строки получает переменные среды? Как созда-
ются новые переменные среды, каковы ограничения на их использование? Дан-
ные каких типов могут хранить и обрабатывать переменные среды?
3.5. Как параметры запуска командного файла можно использовать в его коде?
Какие существуют ограничения на их использование? Для чего используется
расширение параметров командной строки? Приведите самостоятельные при-
меры.
3.6. Какие критерии сравнения можно использовать в команде условного пере-
хода if? Приведите самостоятельные примеры использования этой команды.
3.7. Как можно реализовать фрагмент кода командного файла, работающий по-
добно процедуре?
3.8. Какую роль в сеансе командной строки играет переменная errorlevel? При-
ведите самостоятельные примеры ее использования.
3.9. Поясните роль ключей в команде for /f, приведите самостоятельные приме-
ры их использования.
3.10. Какие средства предоставляет командный интерпретатор Windows для ин-
терактивного взаимодействия с пользователем? Приведите самостоятельные
примеры.

28
4.Литература

1. Б. Книттель. Windows 7. Скрипты, автоматизация и командная строка. СПб.:


Питер, 2012 г., 764с.
2. У.Р. Станек. Командная строка Microsoft Windows. Справочник админист-
ратора. СПб.: Русская редакция, 2009 г., 480с.
3. Д.Харалсон. Microsoft Windows Server 2003: администрирование из команд-
ной строки. М.: Кудиц-Образ, 2004 г., 576с.
4. А.В. Попов. Командная строка и сценарии Windows. Электронный курс на
сайте Интернет-университета информационных технологий,
http://www.intuit.ru/department/os/compromtwin.
5. Средства администрирования и создания сценариев. Библиотека MS Tech-
Net. http://technet.microsoft.com/ru-ru/library/cc739502.
6. МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНЫМ РАБОТАМ: Модель
безопасности ОС Windows/ Сост. Лясин Д.Н., Саньков С.Г.; Волгоград. гос.
техн. ун-т. - Волгоград, 2011, – 24 с.

29
Учебное издание

Дмитрий Николаевич Лясин


Сергей Геннадьевич Саньков

Командные файлы операционной системы MS Windows

Методические указания

План электронных изданий 2012 г. Поз. №


Подписано на « Выпуск в свет» . .12. Уч-изд. л. .
На магнитоносителе.
Волгоградский государственный технический университет.
400131, г. Волгоград, пр. Ленина, 28, корп. 1.

30

Вам также может понравиться