Совершенствуйте свои сценарии Сценарии для командной строки — это файлы с простым текстом, которые интерпретируются командным процессором как наборы команд, подлежащие последовательному исполнению. История сценариев для командной строки началась на заре
Совершенствуйте свои сценарии
Сценарии для командной строки — это файлы с простым текстом, которые интерпретируются командным процессором как наборы команд, подлежащие последовательному исполнению. История сценариев для командной строки началась на заре 80-х — именно с этого времени и по сей день оболочка Command.com в MSDOS поддерживает исполнение сценариев посредством простых пакетных файлов. Выпущенный в 1993 году вместе с Windows NT другой командный процессор, Cmd.exe, также поддерживает язык макропрограммирования, подобный языку пакетных файлов Command.com. Несмотря на солидный возраст технологии, макропрограммирование в оболочке Cmd.exe все еще широко используется специалистами по ИT. Например, простой сценарий с командой For может превратить команду, которая сама по себе работает одновременно только с одним компьютером или пользователем в командной строке, в команду, которая пошагово проходит другой текстовый файл и исполняется для каждой строки в этом файле. Благодаря тому что сценарии для командной строки являются файлами с простым текстом, который представляет собой набор команд, их легко создавать и менять и они удобны для восприятия. Но простота макропрограммирования обманчива. Небрежно написанный сценарий для командного процессора может вызывать проблемы. Мне приходилось наблюдать, как сценарии для командного процессора при неправильных допущениях относительно вычислительной среды и операционной системы в лучшем случае работали некорректно, а в худшем — внезапно выполняли разрушительные действия на системах. Чтобы читатели могли избежать подобных проблем, я подготовил 10 советов для создания более надежных сценариев, которые могут работать во многих вычислительных средах.
1.
По возможности используйте переменные среды
Используя переменную в сценарии, мы заключаем имя переменной между знаками процента (%), а когда сценарий исполняется, знаки процента и текст между ними заменяется значением этой переменной. Применение переменных делает код сценария более универсальным, поэтому у него больше шансов успешно работать на разных компьютерах. Например, в сценарии для командного процессора не стоит жестко прописывать установочный каталог Windows. Вместо этого следует использовать переменную SystemRoot, которая всегда будет указывать на конкретный установочный каталог Windows. Так, команда
Echo %SystemRoot%
будет отображать содержимое SystemRoot (т. е. установочного каталога Windows). Я неоднократно видел сценарии, в которых для того, чтобы указать на установочный каталог Windows, использовали запись C:WINDOWS. Если Windows установлена не в C:WINDOWS (например, Windows 2000 и более ранние версии устанавливаются в WINNT), сценарий не будет работать корректно. Чтобы увидеть список переменных среды, следует ввести в командной строке команду Set. Некоторые переменные не появляются в списке, генерируемом командой Set, потому что они динамически генерируются Cmd.exe. В табл. 1 показан список этих переменных. Как и в случае с другими переменными среды, эти переменные заключаются в знаки процента. Например, следующая строка сценария будет отображать текущие время и дату:
Echo %DATE% %TIME%
2.
Не следует ожидать, что обычные пакетные файлы для Command.com будут так же хорошо работать в Cmd.exe
Те, кто привык писать пакетные файлы для платформ MS-DOS или Windows 9x/Me, должны иметь в виду, что в новейших версиях Windows некоторых команд не существует. Два самых распространенных примера — команды Choice и Deltree. Просмотрите свои старые пакетные файлы, чтобы убедиться, что они корректно работают в оболочке Cmd.exe. В табл. 2 приведено несколько возможных замен для Choice и Deltree. Большинство замен имеют синтаксис, отличный от синтаксиса команд, на место которых они предлагаются, поэтому придется соответствующим образом изменить сценарии.
3.
В оболочке Cmd.exe используйте расширение .cmd
Пакетным файлам Command.com необходимо расширение .bat. Оболочка Cmd.exe тоже может использовать расширение .bat, но в более мощном языке макропрограммирования Cmd.exe многие команды несовместимы с Command.com. Таким образом, .bat файл, написанный для Cmd.exe, может сбоить, если пользователь попытается исполнить его в Command.com (например, в Windows 98). Один из способов избежать этой проблемы состоит в использовании расширения .cmd для сценариев. Поскольку Command.com не распознает расширение .cmd, он просто не будет исполнять пакетный файл, если его имя оканчивается на .cmd.
4.
Убедитесь в том, что нужные исполняемые файлы доступны
Если ваш сценарий задействует программы, которые не являются частью стандартной установки операционной системы, необходимо позаботиться о том, чтобы все такие программы были доступны. Следует также задокументировать эти зависимости в сценариях. Я предлагаю для обеспечения доступности исполняемых файлов помещать их в один каталог со сценарием. Тогда для их запуска используется синтаксис
«% ~dp0exename» …
где exename — это имя исполняемого модуля, который требуется запустить. Синтаксис %~dp0 возвращает диск, путь и имя файла текущего сценария без кавычек. Заключение всей строки в кавычки гарантирует работоспособность сценария, даже если имя файла или каталога, в котором находится сценарий, содержат кавычки.
5.
Правильно используйте двойные кавычки
Похоже, двойные кавычки («) являются общим источником путаницы для тех, кто пишет сценарии. Двойные кавычки — это всего лишь способ идентифицировать содержащие пробелы аргументы командной строки. Например, правильная на первый взгляд командная строка
dir C:Program Files
на самом деле дает команде Dir два аргумента: C:Program и Files. Чтобы воплотить свое намерение передать команде один аргумент C:Program Files (включая пробел), мы должны заключить его в двойные кавычки:
dir «C:Program Files»
Символы кавычек не являются частью имени папки. Они сообщают команде Dir, что текст между ними является одним аргументом.
Сценарии для командного процессора также поддерживают параметры командной строки. Чтобы воспользоваться параметрами командной строки сценария, нужно задействовать запись %n (где n — число от 0 до 9). Эта запись называется заменяющим параметром (или просто параметром). Например, сценарий будет заменять параметр %1 первым аргументом командной строки, %2 — вторым аргументом и т. д. Помимо параметров от %1 до %9, %0 заменяется именем сценария, %* заменяется целой командной строкой сценария (исключая имя сценария). Я упоминаю здесь параметры командной строки потому, что, когда Cmd.exe заменяет параметры от %1 до %9 соответствующими аргументами командной строки, он оставляет двойные кавычки, если они есть в аргументе. Напрашивается очевидный вывод: параметр сценария всегда будет заключен в кавычки, если он содержит пробелы. На этом наблюдении основано несколько простых правил, аккуратно следуя которым можно практически полностью устранить проблемы кавычек.
- Не используйте кавычки внутри параметров сценария (от %1 до %9), поскольку они уже могут содержать кавычки. Если необходимо задействовать параметр с командой If, используйте символы, отличные от кавычек (например, фигурные скобки), чтобы избежать синтаксической ошибки. Следующая строка будет работать правильно, даже если первый параметр (%1) содержит кавычки:
If {%1}=={} Goto :HELP
Исключение из этого правила составляет случай, когда мы используем синтаксис %~n, чтобы удалить кавычки параметра (см. следующее правило).
- Не помещайте кавычки внутрь переменной среды. Наличие пробелов в переменных среды допускается, и кавычки при этом не нужны. Если нужно скопировать параметр в переменную, используйте синтаксис %~n (где n — число от 1 до 9), который возвращает параметр без кавычек. Например, строка
Set DATAFILE=% ~1
будет копировать первый параметр сценария (без кавычек) в переменную DATAFILE. Исключение составляет случай, когда вы создаете текст в кавычках, который будет передан в другую команду. - Не забывайте, когда это необходимо, помещать переменные среды в кавычки. Например, рассмотрите следующие строки сценария:
Set TARGET=% ~2
Copy %1 «%TARGET%»
Первая из этих строк копирует второй аргумент сценария в переменную TARGET, удаляя кавычки. Вторая строка синтаксически верна, потому что параметр %1 уже заключен в кавычки, если он содержит пробелы, а переменная TARGET должна иметь кавычки, потому что она может содержать пробелы.
6.
Применяйте команды Setlocal и Endlocal
Команда Setlocal копирует все переменные среды, а команда Endlocal восстанавливает все переменные со значениями, которые они имели перед запуском сценария. Endlocal также удаляет любые переменные, созданные сценарием. Использование обеих команд делает сценарий более самостоятельным и гарантирует, что сценарий «убирает за собой мусор» путем восстановления переменных среды в их оригинальные значения и удаления переменных, созданных сценарием.
Также можно использовать команду Setlocal Enableextensions, чтобы точно знать, что расширения команд включены. Расширения команд — это усовершенствования для группы внутренних команд Cmd.exe (например, If, For, Call), которые предоставляют дополнительные возможности по сравнению с командами Command.com, имеющими такие же имена. Расширения команд включены по умолчанию, но в тех редких случаях, когда они отключены, команда Setlocal Enableextensions гарантирует включение расширений команд. Чтобы получить более подробную информацию о расширениях команд, следует ввести в командной строке Cmd /?.
7.
Используйте при необходимости символ Escape
Cmd.exe использует символ каретки (^) как признак отмены специального значения зарезервированных символов командной оболочки. Например, амперсанд (&) является разделителем команд — он позволяет поместить несколько команд в одной строке. Если вы намерены использовать амперсанд в обычном, литературном смысле, то должны «аннулировать» его специальное значение, поместив перед ним символ каретки ^. Так, в строке
Echo The ^& character is
the command separator
символ ^ вынуждает командный процессор отменить обычную интерпретацию следующего за ним символа. Специальными символами являются символы ( ) < > ^ & |. Нет необходимости использовать признак отмены, если эти символы встречаются внутри строки, заключенной в кавычки.
8.
Не используйте команду Exit без ключа /b
Без ключа /b команда Exit закрывает текущую командную оболочку. Если кто-то запускает Cmd.exe и исполняет сценарий, который содержит команду Exit, текущая сессия командного процессора резко закроется. Команда Exit /b закрывает текущий сценарий, не закрывая текущую сессию командного процессора. Чтобы больше узнать о команде Exit, наберите в командной строке Exit /?.
9.
Используйте команду If Errorlevel с осторожностью
Команда If Errorlevel проверяет код завершения последней команды, исполнение которой окончено. Поведение сценария зависит от результата проверки кода завершения программы. Рассмотрите, например, следующий сценарий:
Myprogram
If Errorlevel 1 Goto :ERROR
Команда Goto в этих строках будет выполнена, только если Myprogram.exe возвращает код завершения больше или равный 1. Другими словами, «If Errorlevel n» не означает «если последний код завершения программы в точности равен n»; на самом деле это условие означает «если последний код завершения программы не меньше n». Учитывая такое поведение, следует проверять код завершения программы в порядке убывания (от самого большого к самому маленькому). Чтобы проверить конкретное значение кода завершения программы, используйте динамическую переменную ERRORLEVEL вместо команды If Errorlevel. Нужно иметь в виду, что команда If Errorlevel отличается от переменной ERRORLEVEL, стоящей в списке в табл. 1. Команда If Errorlevel обратно совместима с командой If Errorlevel из Command.com; переменная ERRORLEVEL доступна только в Cmd.exe.
10.
Учитывайте особенности команды Start
Команда Start запускает программу или команду в окне новой консоли. Однако, если попытаться запустить программу из папки, которая содержит пробелы (или если имя программы содержит пробелы), поведение команды Start может не соответствовать вашим ожиданиям. Например, следующая команда:
Start «C:Program FilesMicrosoft
OfficeOffice11Winword.exe»
не запускает Microsoft Word вопреки ожиданию. Вместо этого команда Start откроет новую сессию Cmd.exe, заголовком окна консоли которой будет заключенная в кавычки строка. Такое поведение объясняется тем, что команда Start использует первую строку в кавычках в ее командной строке как заголовок окна консоли.
Чтобы обойти эту странность, используйте пару кавычек для указания пустого заголовка, затем вводите строку программы, которую хотите запустить. Корректная программа Start выглядит примерно так:
Start «» «C:Program FilesMicrosoft
OfficeOffice11Winword.exe»
Всего не предусмотришь
Сценарии командного процессора Cmd.exe применяются весьма широко. Освоив приведенные в этой статье рекомендации, вы сможете создавать более надежные сценарии и избегать распространенных проблем.
Дополнительные материалы по написанию сценариев в online-доступе на сайте Windows IT Pro/RE
OneNote — полнофункциональная система хранения сценариев
http://www.osp.ru/text/302/3546232.html
Рекурсивная загрузка Web-узла целиком
http://www.osp.ru/text/302/3207223/
Программный доступ к информации о дисковых квотах
http://www.osp.ru/text/302/3177796.html
Организация печати данных из сценариев
http://www.osp.ru/text/302/3177769.html
Как написать сценарий, выдающий заметные предупреждения
http://www.osp.ru/text/302/3137821.html
Получение списка членов вложенных групп
http://www.osp.ru/text/302/3137821.html
Самодельный инструмент для инвентаризации аппаратных средств
http://www.osp.ru/text/302/2876185.html
Перенос и активация учетных записей пользователей
http://www.osp.ru/text/302/2863575.html
Получение функциональности с использованием управляющих компонентов
http://www.osp.ru/text/302/2863520.html
Извлечение информации из Web-страницы
http://www.osp.ru/text/302/2740759.html
Системные утилиты одной строкой
http://www.osp.ru/text/302/2740725.html
Таблица 1. Таблица 2.
Время на прочтение4 мин
Количество просмотров12K
Тестирование систем на проникновение требует от пентестера знания большого количества различного инструментария: от банальных текстовых редакторов до штатных систем обнаружения вторжений. Одним из важных этапов пентеста является запуск команд на стороне тестируемого хоста для выполнения собственных нужд. Так как способов это сделать существует довольно большое количество, статья расскажет о нескольких методах запуска команд в инфраструктуре, где работает операционная система Windows. Будут приведены несколько инструментов и методы их использования. Также будут рассмотрены несколько особенностей, которые должны быть учтены при использовании каждого способа запуска команд.
Как запустить команду в системе
Windows — одна из самых популярных платформ, которая используется по всему миру, причем для многих пользователей она является единственным понятным интерфейсом для работы с компьютером. Как известно, данная система имеет довольно сложную структуру, которую можно изобразить с помощью абстрактного представления основных элементов.
Картинка взята отсюда.
Из-за такой сложной структуры пользователям может быть нелегко обнаруживать оптимальный функционал, который предоставляет операционная система для выполнения текущих задач. Допустим, нам необходимо запустить команду для конфигурации или для сбора данных о системе. Какими интерфейсами можно воспользоваться?
По умолчанию в операционной системе Windows существует ряд уже готовых оболочек для выполнения команд. Все они выполнены в виде отдельных исполняемых файлов. Небольшой список приведен ниже:
-
cmd.exe
— интерпретатор командной строки -
powershell.exe
— инструмент для раширения возможностей командной строки. Используется для автоматизации задач администратора. Предоставляет доступ к платформе .Net и позволяет выполнять команды на одноименном языке программирования -
at.exe
— инструмент для запуска команд по расписанию. Становится доступен, если запущен сервис расписаний. -
wmic.exe
— утилита для сбора данных из инструментария управления и диагностики операционной системой -
psexec.exe
— утилита для запуска приложений и процессов на удаленной или локальной системе -
wscript.exe
— сервер для выполнения скриптовых сценариев в ОС (vbscript, js) -
cscript.exe
— запускает сценарий для командной строки
Все перечисленные выше файлы действительно находятся в любой Windows системе, начиная, как минимум, с Windows 7. Но psexec.exe к таким не относится. Это инструмент, который изначально можно было только найти среди Sysinternals tools. На сегодняшний день psexeс имеет большое количество вариаций, переписанных на различные языки программирования.
Помимо готовых команд и интерпретаторов в ОС Windows существуют также наборы функций, которые могут предоставляться различными подсистемами, например WinRM
, WMI
, Windows Service Control Manager API
.
Особенности запуска команд
Все команды, которые выполняются ОС Windows, могут быть разделены на несколько групп по различным признакам. Определим для нашего исследования следующие группы:
-
локальный запуск команд
-
удаленный запуск команд
-
запуск команд с теми же привилегиями
-
запуск команд с использованием чужих привилегий
Распределим все уже описанные методы запуска команд в ОС:
-
Запуск с теми же привилегиями локально и удаленно:
-
*script.exe
-
wmic.exe
-
cmd.exe
-
powershell.exe
-
-
Запуск с повышенными привилегиями локально и удаленно:
-
at.exe
-
psexec.exe
-
Практическая проверка
Все данные о командах были собраны по документации ОС Windows. Для теста будем использовать следующий стенд:
-
Vbox в качестве виртуальной среды
-
Windows Server 2019 Evaluation в качестве системы для развертывания сервисов AD
-
Kali Linux в качестве атакующей системы
-
набор скриптов Impaсket для доступа к подсистемам выполнения команд
-
IOXIDResolver.py — инструмент для получения NetBIOS имени системы и перечня сетевых интерфейсов
Все машины подключены в host-only сеть. На машине Windows Server отключены механизмы защиты (FireWall, Defender).
Для первичного доступа в систему будем использовать уязвимость Zerologon. Описание и инструменты для эксплуатации уязвимости можно найти в сети. Оставим это в качестве домашнего задания для читателя.
Шаг 1 — получение данных о сетевых интерфейсах и netBIOS имени сервера:
Шаг 2 и 3 — запуск эксплойта Zerologon, получение hash пользователя:
Шаг 4 — для выполнения команд в системе будем использовать Administrator и его хэш. Для остальных пользователей можно будет выполнять те же самые операции. Предлагаем читателю выполнить их самостоятельно.
Теперь можно использовать полученные хэш и логин пользователя для запуска команд в системе. Для запуска команды будем пользоваться скриптами Impacket. Эти скрипты специально созданы для того, чтобы иметь возможность запускать команды в целевой системе с помощью проприетарных для Windows протоколов.
Нас интересуют следующие скрипты:
-
psexec.py
-
smbexec.py
-
wmiexec.py
-
atexec.py
Для проверки привилегий каждый запущенный скрипт будет работать в интерактивном или полуинтерактивном режиме. Тестовая команда будет — whoami
. Она как раз будет показывать, чьи привилегии сейчас использует скрипт для запуска команд.
Запуск psexec.py — скрипт повторяет работу одноименного инструмента. Особенностью запуска является задействование механизма имперсонализации. Для того, чтобы метод сработал, у пользователя должен быть доступ к расшаренным директориям системы. Скрипт за счет этого сможет создать сервис, который будет запускать cmd.exe от имени пользователя System:
Запуск smbexec.py — по сути использует тот же метод, что и psexec.py, только при запуске каждой команды, стартует новый сервис на целевой системе.
Запуск wmiexec.py — работает от имени тоже пользователя, чьи учетные данные были использованы. Обрабатываются запросы асинхронно, может занять длительное время.
Запуск atexec.py сопряжен с конфигурацией целевой системы. Если зависимый сервис не запущен в целевой системе, то выполнение команд невозможно.
Таким образом, можно запускать команды в ОС Windows удаленно. Рассмотренные методы наиболее эффективно позволяют производить сбор данных и проведения тестирования на проникновение.
На этом всё. В преддверии старта курса «Пентест. Практика тестирования на проникновение», приглашаем всех желающих на бесплатный демоурок, в рамках которого познакомимся с инструментами для исследования AD. Полученные данные будем использовать для повышения привилегий и продвижения в сети.
-
Записаться на демоурок
ср, 05/31/2006 — 08:42 — admin
Запуск сценариев в среде Windows
Сценарий в среде Windows можно запустить тремя способами:
|
Двойным щелчком мыши на файле сценария или на соответствующем значке в окнах Мой компьютер, Проводник или Поиск (Find). |
|
В окне Выполнить (Run) введите с клавиатуры полное имя выполняемого
сценария и нажмите кнопку ОК. |
|
В окне Выполнить введите wscript.exe с указанием имени сценария и
необходимых параметров сервера и сценария. |
При запуске сценария с помощью WSH можно указать, какое приложение следует использовать — CSCRIPT.EXE или WSCRIPT.EXE. Приложение сервера, выбираемое по умолчанию, может быть установлено с помощью
Команды cscript //Н: Имя_сервера_сценариев.
Например, если вы устанавливаете в качестве приложения, выбираемого по умолчанию, WSCRIPT.EXE и выполняете сценарий с именем CHART.VBS, то WSCRIPT.EXE будет выбираться по умолчанию для всех файлов сценариев, имеющих расширение vbs.
Страница свойств сервера сценариев Windows позволяет устанавливать параметры, приведенные в табл. 11.5.
Таблица 11.5. Свойства сервера сценариев
- Версия для печати
Рассмотрим мощный инструмент автоматизации рутинных задач в семействе операционных систем Windows.
Что такое bat-файлы?
BAT-файл — это последовательность команд для интерпретатора командной строки в виде текстового файла с расширением .bat или .cmd. Основное предназначение пакетных файлов — автоматизация рутинных действий пользователя компьютера.
Название BAT появилось от английского batch — пакетная обработка. В истории продуктов Microsoft пакетные файлы существовали с первой версии MS-DOS в 80-х годах и позже успешно интегрировались в Microsoft Windows. В MS-DOS командным интерпретатором выступает COMMAND.COM, а начиная с Windows NT и до сих пор используется CMD.EXE.
Интерпретатор COMMAND.COM принимает файлы с расширением .BAT. Расширение .CMD создано для интерпретатора CMD.EXE с целью различать файлы для «старого» и «нового» интерпретаторов. CMD.EXE корректно обрабатывает оба расширения.
Интерпретатор CMD.EXE является частью современных операционных систем семейства Microsoft Windows, несмотря на отсутствие развития с начала 2000-х.
Основы взаимодействия с bat-файлами
Пакетный файл bat — это текстовый документ со специальным расширением. Для создания своего первого bat-файла достаточно «Блокнота», который доступен в операционной системе. Для повышения удобства написания и поддержки bat-файлов рекомендуем использовать Notepad++ или любой другой текстовый редактор с подсветкой синтаксиса.
Создание bat-файлов
Для создания пакетных файлов необходимо открыть текстовый редактор и в меню Файл выбрать Сохранить как….
В появившемся окне выбрать Тип файла → Все файлы и задать имя с расширением .bat, как продемонстрировано на изображении выше. По умолчанию Windows скрывает расширения файлов, и пакетный файл можно отличить от текстового по пиктограмме окна с шестеренками.
Если вы ошиблись при сохранении и пакетный файл сохранился с расширением txt, то не обязательно совершать повторное сохранение. Можно включить отображение расширения имен файлов и переименовать файл.
Запуск bat-файлов
Запуск пакетных файлов производится двойным кликом по иконке. Дополнительно можно использовать команду Открыть из контекстного меню, которое доступно при нажатии правой клавиши мыши (ПКМ) по файлу. Если для выполнения команд требуются права администратора, то в том же контекстном меню есть пункт Запуск от имени администратора.
Исполняемые bat-файлы не могут запрашивать права администратора, если командам нужны расширенные права.
Запуск через контекстное меню откроет командный интерпретатор, в котором выполнятся команды bat-файла. По завершении команд окно закроется. Такое поведение неприемлемо, если от пакетного файла требуется какая-то обратная связь — например, сообщение об ошибке или результат вычислений. В таком случае интерпретатор следует запустить вручную и передать ему пакетный файл.
Для запуска интерпретатора командной строки необходимо открыть меню Выполнить сочетанием клавиш Win + R, вписать cmd и нажать ОК.
Для запуска пакетного файла его необходимо перенести мышкой в открывшееся окно и нажать Enter. Команды bat-файла будут выполнены, а его вывод вы увидите на экране.
Вне зависимости от способа запуска откроется окно, которое может привлекать внимание и раздражать. Для запуска в «скрытом» режиме необходимо использовать другой скриптовой язык Microsoft Windows — VBScript.
По аналогии создаем файл с расширением .vbs и заполняем его следующими командами:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "С:\путь\до\вашего\скрипта.bat" & Chr(34), 0
Set WshShell = Nothing
Для скрытого запуска следует запускать созданный файл, а не bat-файл. Скрытый запуск bat-файла актуален для автоматизации действий по расписанию, например, создание резервной копии.
Запуск по расписанию
За выполнение действий по расписанию отвечает Планировщик заданий. Открываем меню Выполнить и запускаем программу taskschd.msc.
Выбираем пункт Создать простую задач и заполняем параметры задания:
- имя для простой идентификации,
- периодичность и время запуска,
- действие — Запустить программу,
- программа или сценарий — путь до вашего .bat-файла или .vbs-файла, который запускает .bat-файл скрытно.
Обратите внимание, что планировщик позволяет не только выполнять действие по времени, но и при наступлении события — например, при загрузке компьютера. Такой подход является альтернативой автозагрузке.
В случае разработки собственного bat-файла следует ознакомиться с основами командного интерпретатора.
Команды и синтаксис пакетных файлов
Командный интерпретатор выполняет команды из файла последовательно — строка за строкой. Исключение составляет только оператор GOTO, который «отправляет» к указанной строке. Командный интерпретатор выполняет два вида команд: встроенные команды и внешние исполняемые файлы.
Внешние исполняемые файлы — это любой исполняемый файл, то есть с расширением EXE, CMD или BAT, который доступен в операционной системе. Например, «Блокнот» — это исполняемый файл notepad.exe. Следующая команда приведет к запуску этого приложения с открытым файлом C:\1.txt:
notepad.exe C:\1.txt
Аргументом может быть не только путь, но и ключ — специальный аргумент, который начинается с символа слэш (/). У каждой программы свой «реестр» ключей и их значений.
Обратите внимание, что не все внешние команды «понимают» аргументы, переданные из интерпретатора командной строки. Например, исполняемый файл приложения калькулятор, calc.exe, игнорирует все аргументы командной строки. Внешним исполняемым файлом может быть в том числе другой bat-файл.
Встроенные команды — это команды, которые являются частью интерпретатора командной строки. Полный список команд доступен по команде HELP. Данные команды не имеют отдельного исполняемого файла.
Иногда в имени файла или каталога встречаются пробелы. Наиболее очевидный пример — каталог Program Files на диске C. В этом случае помогают кавычки. Их можно расставить различными способами. Например:
cd "C:\Program Files\123"
cd C:\”Program Files”\123
Операционная система Windows запрещает использование множества специальных символов в именах файлов, в том числе кавычки, поэтому проблем с указанием файлов не возникнет.
Оставлять комментарии при разработке — хороший тон. Так можно объяснить выполняемые действия и потенциальные ошибки. В пакетных файлах можно оставлять комментарии несколькими способами.
Официальный способ — команда rem или два двоеточия.
rem Это первый комментарий
:: Это тоже комментарий
Перечисленные команды позволяют оставлять однострочные комментарии. Если хочется оставить развернутый многострочный комментарий, то прибегают к хитрости с командной GOTO.
goto start
===
Здесь можно оставить большой комментарий,
лицензию или даже ASCII-арт
===
:start
В конце комментария задаем имя метки, а в начале комментария выполняем команду GOTO c именем метки. Этот способ требует внимания, так как для каждого комментария должна быть своя метка, иначе выполнение bat-файла может отличаться от ожидания разработчика.
Совместимость с MS-DOS
В старых ОС, таких как MS-DOS, было ограничение на отображение имени файлов. На экран выводилось восемь символов имени, точка и три символа расширения. Если имя файла превышало по длине восемь символов, то имя файла отображалось по следующей схеме:
<первые шесть символов имени>~<порядковый номер>
Например, каталог Program Files выглядит следующим образом:
Progra~1
В современных операционных системах такое отображение не применяется, но CMD.EXE до сих пор поддерживает такие запросы к файлам и каталогам.
Выберите подходящий из более 100 готовых конфигураций.
Примеры bat-файлов
Рассмотрим несколько примеров bat-файлов. Начнем с базовых команд.
Обновление IP-адреса
Представим простой пример: необходимо обновить аренду IP-адресов на всех сетевых интерфейсах. В командной строке это делается одной командой:
ipconfig /renew
Данная команда генерирует много текстового вывода, который может испугать неподготовленного пользователя. Сама команда также может быть непривлекательной. Поэтому отключим отображение команды и перенаправим вывод выполнения в «никуда». Вместо слова NUL может быть любое имя или путь. Тогда вывод будет перенаправлен в указанный файл.
rem Отключаем отображение команд. Символ @ отключает отображение текущей команды
@echo off
rem Переводим вывод выполнения в устройство NUL, вывод исчезнет
ipconfig /renew > NUL
При запуске такого скрипта появляется черное окно, которое быстро исчезает. Можно оставить простые и понятные пользователю сообщения и не дать окну закрыться.
@echo off
echo Выполняется настройка, пожалуйста, подождите...
ipconfig /renew > NUL
echo Все хорошо.
rem Эта команда остановит выполнение до тех пор, пока пользователь не нажмет любую клавишу
pause
Скорее всего данный скрипт выведет набор непонятных символов вместо сообщения. Дело в том, что в русскоязычных ОС Windows по умолчанию в CMD.EXE используется кодировка CP866. Блокнот сохраняет в CP1251 (Windows-1251), а Notepad++ — в UTF-8. Для решения проблемы необходимо сменить кодировку интерпретатора командой chcp или сохранить bat-файл в кодировке интерпретатора.
rem Смена кодировки на Windows-1251
chcp 1251 > NUL
rem Смена кодировки на UTF-8
chcp 65001 > NUL
Я сохранил файл в кодировке UTF-8 и итоговый скрипт получился таким:
@echo off
chcp 65001 > NUL
echo Выполняется настройка, пожалуйста, подождите...
ipconfig /renew > NUL
echo Все хорошо.
pause
Создание резервной копии каталога
Перейдем к более жизненной ситуации — создание резервной копии (backup) каталога. Предположим, что каждый архив должен иметь в названии дату создания копии. Создадим каталог, имя которого — текущая дата. Текущая дата хранится в переменной DATE. Для обращения к переменным название переменной помещается между знаками процента.
mkdir %DATE%
cd %DATE%
Копирование файлов в текущий каталог производится командой COPY.
rem файлы 1.txt и 2.txt будут скопированы в текущую папку
COPY C:\1.txt C:\2.txt .
rem файл 3.txt будет сохранен в текущую папку как example.txt
COPY C:\1.txt .\example.txt
Возможно, в резервную копию необходимо дополнить служебную информацию — например, список файлов в корне копии и имя компьютера.
rem Имя компьютера записывается в файл computer.txt
hostname > computer.txt
rem Список файлов в текущем каталоге записывается в files.txt
dir . > files.txt
Обычно резервные копии хранят в zip- или rar-архивах. Из командной строки отлично управляется архиватор 7z.
cd ..
7z -tzip a backup.zip %DATE%
Переименование файлов
Переименование файлов в Windows производится командой RENAME. Однако эта команда имеет свои особенности.
Во-первых, переименование возможно только в рамках одного диска и одного каталога. Между каталогами одного диска допустимо перемещение, а между разными дисками — только копирование.
rename abc.txt cba.txt
Во-вторых, возможно переименование по маске. Допустим, есть список фотографий photo000.jpeg, photo001.jpeg и так далее. Нужно сменить префикс с photo на mobile.
rename photo* mobile*
Если в текущем каталоге есть другие файлы с префиксом photo, а переименовать надо только изображения с расширением jpeg, то команда модифицируется:
rename photo*.jpeg mobile*.jpeg
Удаление файлов
Программы и пользователи оставляют следы работы в виде файлов, которые не удаляются автоматически. К счастью, процесс очистки поддается автоматизации.
Предположим, что в процессе работы пользователя генерируется большое количество файлов с расширением jpeg, которые нужно удалять. На помощь приходит оператор цикла FOR.
rem Ищем все файлы с расширением jpeg в каталоге work
rem Ключ /r включает в поиск все подкаталоги в каталоге work
for /r work %%file in (*.jpeg) do (
rem Выводим имя файла
echo %%file
delete %%i
)
Заключение
Командный интерпретатор CMD.EXE существует долгое время, но, даже несмотря на отсутствия развития, остается востребованным инструментом для автоматизации рутинных действий в операционной системе Microsoft Windows.