Урок 7 по cmd

Как обработать текстовый файл?

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

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

      # Это простой файл с настройками

      # Режим сборки
buildmode=release

# Компилятор
compiler=cl.exe

# Архитектура
arch=x86

Ничего сверхъестественного – простой key=value формат с возможностью вставки Unix-style комментариев. Помочь в чтении и обработке этого файла нам сможет команда for. Ее дополнительные опции позволяют задать и разделители, и символ начала комментария, и кое-что еще. Вот командный файл, который выполняет поставленную задачу:

      @echo off

rem Читаем настройки из файла settings.txt, который должен располагаться в
rem том же каталоге, что и bat-файл. Если не удалось распарсить настройки -
rem выходим с ненулевым кодом возврата.
call :read_settings %~dp0\settings.txt || exit /b 1

rem Прочитанные настройки:
echoBuild mode  : %BUILDMODE%echoCompiler    : %COMPILER%
echoArchitecture: %ARCH%
rem Выход из сценария. Дальше - только функции.
exit /b 0

remrem Функция для чтения настроек из файла.
rem Вход:
rem       %1           - Имя файла с настройками
:read_settings

set SETTINGSFILE=%1

rem Проверка существования файла
if not exist %SETTINGSFILE% (
    echoFAIL: Файл с настройками отсутствуетexit /b 1
)

rem Обработка файла c настройками
rem Здесь:
rem     eol=# указывает на то, что содержимое строки начиная с символа #
rem     и до ее конца может быть пропущено как комментарий.
remrem     delims== указывает, что разделителем значений является символ =
remrem     tokens=1,2 приводит к тому, что в переменную %%i будет занесен первый
rem     токен, а в %%j - второй.
remfor /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (
    rem В переменной i - ключ
rem В переменной j - значение
rem Мы транслируем это в переменные окружения
set %%i=%%j
)

exit /b 0

Обильные комментарии должны помочь легко разобраться, что к чему. За подробностями, как обычно, отошлю к:

      for /?

Кстати, возможности команды for не ограничиваются чтением из файла. Возможно также чтение вывода другой команды. Например, так:

      @echo off

for /f "tokens=* usebackq" %%i in (`cmd.exe /c ver`) do (
    set VERSION=%%i
)

echo%VERSION%

Особенно меня умиляет наличие опции “usebackq”, которая делает синтаксис отдаленно похожим на юниксовый. И в стенах царства Билла есть граждане, скучающие по /bin/sh и пытающиеся хоть как-то скрасить существование свое и окружающих. Следующий совет это также косвенно подтверждает.

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

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

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

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

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

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

Для просмотра содержимого 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.

3- For /R

Цикл FOR /R используется для повторения на списках файлов. Включая файлы в подпапках,.. Называется рекурсией (Recurse).

Синтаксис:

FOR /R %%variable IN ( set_of_file_filters ) DO command

@rem Or:

FOR /R %%variable IN ( set_of_file_filters ) DO (

command )

  • : Данный параметр является корневой папкой. Если нет данного параметра“папка включает выполняющийся сценарий файла” или “текущая папка” будет считаться корневой папкой.
  • set_of_file_filters : Список фильтров файлов. Напирмер *.txt , *.bat, … Или точка ( . ) значит все.
  • variable: Является названием переменной и должна иметь 1 единственный символ.

Пример ниже распечатывает список всех файлов *.txt или *.log в папке C:/Windows/System32 (Поиск включает и в подпапках,..)

forR_example1.bat

@echo off

FOR /R “C:WindowsSystem32” %%f IN (*.txt *.log) DO (

echo %%f )

pause

Пример ниже распечатывает все файлы  C:/Windows/System32 (Влкючая файлы в подпапках,…)

forR_example2.bat

@echo off

FOR /R “C:WindowsSystem32” %%f IN ( . ) DO (

echo %%f )

pause

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

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

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

@echo off

echo Start %time%

echo Create test.txt

echo test>C:\test.txt

echo Copy Test.txt to Old_test.txt

copy C:\test.txt C:\Old_test.txt

echo Stop %time%

Необходимо подробнее разобрать, что именно выполняет указанный набор команд.

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

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

Третьей строкой указывается на то, что следующей командой будет создаваться текстовый документ test.txt.

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

Пятая строка проводит выдачу в лог-документ пояснение о том, что следующим этапом станет происходить копирование в иное место.

В шестой строке осуществляется непосредственное копирование C:\test.txt в файл C:\Old_test.txt. Можно говорить о том, что происходит создание копии документа, но с присвоением для него нового названия.

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

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

Теперь создадим на диске папку LOG и полный путь к ней станет иметь указанный вид: C:\LOG. Следующим этапом происходит запуск команду установленного типа:

1.bat>C:\LOG\%date~-10%.txt

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

«C:\Program Files\1.bat»>C:\LOG\%date~-10%.txt

C:\Progra~1\1.bat>C:\LOG\%date~-10%.txt

Предполагается, что сразу после начала работы 1.bat в папке C:\LOG произойдет создание документа с названием, которое включает текущую дату. Именно указанный файл и требуется установить в качестве отчета о деятельности пакетного файла 1.bat. Если запустить рассмотренный BAT файл, то предполагается предоставление указанного далее результата:

Start 19:03:27,20

Create test.txt

Copy Test.txt to Old_test.txt

Скопировано файлов: 1.

Stop 19:03:27,21

Чтобы произвести перенаправление результатов работы bat-документа в лог-документа, следует применять специальный символ (>). Написание команды будет иметь представленный ниже вид:

Путь\ИмяФайла.bat>Путь\ИмяЛогФайла.txt

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

Синтаксис

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

Параметры

Параметр Описание
not Указывает, что команда должна выполняться, только если условие имеет значение false.
ERRORLEVEL Задает истинное условие, только если предыдущая программа, выполненная Cmd.exe, вернула код выхода, который больше или равен Number.
Указывает команду, которая должна быть выполнена при выполнении предыдущего условия.
Задает истинное условие, только если строка1 и строка2 совпадают. Эти значения могут быть строками литерала или пакетными переменными (например, ). Литеральные строки не нужно заключать в кавычки.
существующие Указывает истинное условие, если указанное имя файла существует.
Задает оператор сравнения из трех букв, включая:
  • Равно — равно
  • Нек — не равно
  • ЛСС — меньше
  • LEQ -меньше или равно
  • ГТР — больше
  • Жек — больше или равно
/i Принудительное сравнение строк не учитывает регистр. Параметр /i можно использовать в формате If. Эти сравнения являются универсальными, в том случае, если и строка1 , и строка2 состоят из цифр, строки преобразуются в числа и выполняется числовое сравнение.
кмдекстверсион Задает истинное условие, только если внутренний номер версии, связанный с компонентом расширения команд Cmd.exe, равен или больше указанного числа. Первая версия — 1. Он увеличивается на единицу при добавлении значительных улучшений в расширения команд. Кмдекстверсион Conditional не имеет значения true, если расширения команд отключены (по умолчанию расширения команд включены).
defined Указывает истинное условие, если переменная определена.
Задает команду командной строки и все параметры, которые будут переданы команде в предложении else .
/? Отображение справки в командной строке.

Remarks

  • Если условие, указанное в предложении If , имеет значение true, выполняется команда, следующая за условием. Если условие имеет значение false, команда в предложении If игнорируется и команда выполняет любую команду, указанную в предложении else .

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

  • При использовании определенного значения в среду добавляются следующие три переменные: % ERRORLEVEL%, % кмдкмдлине% и % кмдекстверсион%.

    • % ERRORLEVEL%: разворачивается в строковое представление текущего значения переменной среды ERRORLEVEL. Эта переменная предполагает, что отсутствует существующая переменная среды с именем ERRORLEVEL. Если это так, вместо него будет получено значение ERRORLEVEL.

    • % кмдкмдлине%: разворачивается в исходную командную строку, которая была передана Cmd.exe до любой обработки Cmd.exe. Предполагается, что отсутствует существующая переменная среды с именем КМДКМДЛИНЕ. Если это так, вы получите вместо этого значение КМДКМДЛИНЕ.

    • % кмдекстверсион%: разворачивается в строковое представление текущего значения кмдекстверсион. Предполагается, что отсутствует существующая переменная среды с именем КМДЕКСТВЕРСИОН. Если это так, вы получите вместо этого значение КМДЕКСТВЕРСИОН.

  • Предложение else необходимо использовать в той же строке, что и команда после оператора If.

Примеры

Чтобы отобразить сообщение не удается найти файл данных если не удается найти файл Product. dat, введите:

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

Чтобы удалить файл Product. dat из текущего каталога или отобразить сообщение, если Product. dat не найден, введите в пакетном файле следующие строки:

Примечание

Эти строки можно объединить в одну строку следующим образом:

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

Чтобы вернуться к метке «хорошо», если значение переменной среды ERRORLEVEL меньше или равно 1, введите:

Примеры bat файлов

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

  • Как автоматизировать запуск bat-файлов
  • Как автоматически ответить на запрос о подтверждении с помощью bat-файла
  • Как выполнить цикл определенное число раз в bat-файле
  • Как добавить комментарии в bat-файл
  • Как дождаться появления определенного файла в папке с помощью bat-файла
  • Как завершить процесс (программу) с помощью bat-файла
  • Как запретить повторный запуск приложения с помощью bat-файла
  • Как зациклить выполнение команды с помощью bat-файла
  • Как из одного bat-файла запустить другой
  • Как изменить IP адрес компьютера с помощью bat-файла
  • Как изменить дату с помощью bat-файла
  • Как изменить значение параметра в реестре с помощью bat-файла
  • Как изменить название процессора в Windows с помощью bat-файла
  • Как импортировать значения переменных реестра с помощью bat-файла
  • Как использовать символ процента в bat-файле
  • Как настроить кодировку шрифтов (исправить иероглифы, кракозябры) в bat-файле
  • Как отключить вывод на экран команд при выполнении bat-файла
  • Как отправить сообщение по сети из bat-файла
  • Как переименовать файлы по маске с помощью bat-файла
  • Как перенаправить результат выполнения команд в лог-файл с помощью bat-файла
  • Как присвоить переменной значение из реестра с помощью bat-файла
  • Как проверить наличие прав администратора с помощью bat-файла
  • Как сделать автоматическое создание резервной копии данных с помощью bat-файла
  • Как сделать резервную копию файлов с сервера FTP с помощью bat-файла
  • Как сделать экспорт реестра с помощью bat-файла
  • Как сменить аудио устройство по умолчанию с помощью bat-файла
  • Как создать бекап на сервере с подстановкой даты в имя архива с помощью bat-файла
  • Как создать папку с помощью bat файла
  • Как создать папку с именем равным текущей дате с помощью bat-файла
  • Как создать паузу перед выполнением следующей команды с помощью bat-файла
  • Как создать файл с произвольным именем с помощью bat-файла
  • Как удалить файлы определенного типа с помощью bat-файла
  • Как узнать имя компьютера с помощью bat-файла
  • Как узнать разрядность версии Windows с помощью bat-файла

Что это за упомянутые ранее операторы объединения команд?

Это операторы &, && и ||. Они практически совсем не освещены в документации, но полезны в повседневности. Они позволяют объединять несколько команд в одну, т.е. примерно так:

command1 & command2
command1 && command2
command1 || command2

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

command1
command2

Оператор && гарантирует, что вторая команда будет выполнена только, если первая была выполнена успешно, т.е. с нулевым кодом возврата (он же %errorlevel%). Такие конструкции очень популярны в мире shell-сценариев Unix. Например:

      cd sources && make clean

Я был приятно удивлен, узнав, что cmd.exe тоже умеет выполнять такие конструкции. Это безопаснее и правильнее, нежели простое последовательное выполнение этих команд, и короче и проще, чем строгая проверка и обработка кодов возврата. Очень удобно при написании на скорую руку. Не менее полезен иногда и оператор ||. Суть его тоже логична – выполнить вторую команду, если первая дала сбой. Часто встречается в таких идиомах:

      cd sources || exit 1

Если перейти в каталог sources не удастся, то будет произведен выход с кодом ошибки 1. Если же первая команда отработает нормально, то вторая выполнена не будет. Например, такая простейшая защита помогла бы в случае с cd по UNC-адресу, описанному ранее.

Пример 2 – использование переменных

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

@echo off

SET a=2

SET /p b=

SET /a c=%a%*%b%

echo %c%

pause

Как вы поняли, переменные задаются с помощью команды SET. Для того чтобы использовать переменную в дальнейшем мы с обеих сторон переменной подставляем знак процента (%), для того чтобы командная строка поняла, что это именно переменная.

  • @echo off – для того чтобы наши команды не отображались на экране;
  • SET a=2 – это просто задаем переменной «a» значение;
  • SET /p b= – это мы задаем переменной «b» значение, которое мы введем в поле, для того чтобы батник понял, что мы хотим сами ввести значение переменной, используется ключ /p;
  • SET /a c=%a%*%b% — задаем переменной «c» результат нашего выражение (в нашем примере это умножение);
  • echo %c% — выводим на экран значение переменной «c»;
  • pause – это мы просто ставим на паузу выполнение нашего bat файла, чтобы просто на всего увидеть все результаты.

Кстати, для того чтобы у Вас русские буквы нормально отображались в командной строке, сохраните бат файл в кодировке DOS-866.

С переменными разобрались, теперь давайте, применим это к нашему первому примеру, допустим, мы хотим оставлять не 14 архивов, а то количество, которое сами захотим, для этого мы с Вами при запуске батника будем вводить число архивов, которое нужно сохранить. Получится примерно вот так:

@echo off

SET /p chislo=

dir D:\test\*.rar /a:-D/b/o:-D > list_of_files.txt

for /F «skip=%chislo%» %%i in (list_of_files.txt) do (del /Q «%%i»)

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

Про переменные хочу еще сказать, что есть такие системные переменные как:

%DATE% — показывает текущую дату.

%TIME% — показывает текущее время.

Для примера выполните следующий код:

echo %DATE%

echo %time:~0,-3%

pause

Переменную %TIME% я написал именно таким образом, для того чтобы результат вывелся в более читабельном виде, попробуйте написать %TIME% и % TIME:~0,-3% у Вас, во втором случае уберутся 3 последних знака.

На самом деле системных переменных больше, просто эти могут потребоваться чаще остальных.

How to Create a Batch File in Windows

Before going into the details, here is a quick summary

  1. Open a text file, such as a Notepad or WordPad document.
  2. Add your commands, starting with @echo , followed by—each in a new line—title , echo , and pause.
  3. Save your file with the file extension .bat, for example, test.bat.
  4. To run your batch file, double click the BAT file you just created.
  5. To edit your batch file, right-click the BAT file and select Edit.

Your raw file will look something like this:

And here’s the corresponding command window for the example above:

If this was too quick or if you want to learn more about commands and how to use them, read on!

Создание папки из BAT файла

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

MD FolderName

Когда такая команда будет осуществлена, предполагается образование новой папки FolderName. Она помещается туда же, где располагается файл BAT. Вовсе не обязательно обеспечивать подобную привязку. Допускается создавать папку в любом указанном пользователем месте, что и внесено в следующую команду:

MD D:\FolderName

Разрешается применять системы переменных в тех случаях, когда выполняется создание папок. Пример заключается в следующем – требуется создать папку в корне жесткого диска D с названием в виде имени текущего юзера. Задается вот так:

MD D:\%USERNAME%

Дальнейшее усложнение команды предписывает создание папки с именем юзера на системном диске устройства:

MD %SYSTEMDRIVE%\%USERNAME%

Ниже рассматривается вариант, когда в качестве названия для папки применяется дата на момент выполнения пакетного файла.

set datetemp=%date:~-10%

MD %SYSTEMDRIVE%\%datetemp%

Нужно выполнить рассмотрение того, каким именно образом происходит функционирование набора команд. Первой строкой создается специальная переменная datetemp. Когда работы завершатся, она удаляется, но до этого момента играет важную роль. Предусматривается корректировка значения переменной на протяжении всего времени её существования. В строке осуществляется присвоение значения, представляющего собой десять символов с правой части от системной переменной DATE. Используется формат представленного типа: Дн ДД.ММ.ГГГГ. Сначала слева идет указание недель и оно не представляет интереса. При создании папок открывается большое количество путей, которыми разрешается следовать. Это открывает большие возможности перед пользователями. Если Вы хотите увидеть перечень всех переменных, следует применить команду SET.

Итоги

Сегодня мы поговорили о циклах

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

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