CMD - rulezzz FORever!

Спецвыпуск Xakep, номер #022, стр. 022-068-1


c:\WINNT\system32\cmd.exe

Андрей "Дронич" Михайлюк (dronich@real.xakep.ru)

Ох, уж эти женские циклы!

(с) by Хрюндель сотоварищи

Если кто-то еще не воткнул, сообщаю: сегодня мы мучаем святую святых CMD - циклы FOR. Прошлый раз я уже применил навороченную конструкцию FOR'a, теперь же мы будем разбирать его и его родственников гораздо подробнее. Зачем? Циклами делается большинство операций с файлами, ведь перебирать их руками - сущий кошмар. А работа с файлом - основное назначение батников. Убедил? Будем считать, что да :).

Итак, основная конструкция выглядит следующим образом:

FOR %%i IN (*.txt) DO command %%i

%%i - это переменная цикла, в нее по очереди подставляются значения из набора, указанного после IN. В наборе простого цикла содержится маска или список имен файлов, для каждого из которых выполняется некоторая команда. Чтобы команда взаимодействовала с файлом, необходимо прописать переменную на место параметра команды, отвечающего за файл (в основном этот параметр первый). Простенький пример: откроем все CMD-файлы в текущей директории для правки в новом окне.

FOR %%i IN (.\*.cmd) DO start edit.com %%i

Таким простейшим циклом уже можно выполнять тучу полезных вещей, но мы пойдем дальше - в MS для нас придумали циклы с параметрами. Поглядим на них по порядку.

FOR /D %%i IN (win*) DO command %%i

Этот цикл будет выполнять команды для директорий, а не для файлов, соответственно после IN указывается список директорий (в этом примере - все, начинающиеся с WIN).

FOR /R C:\WINNT\ %%i IN (win*) DO command %%i

Такой цикл будет искать файлы, начинающиеся с WIN во всех подкаталогах C:\WINNT\, и выполнять команду для каждого из них.

FOR /L %%i IN (6,1,10) DO command %%i

При составлении отчетов для вывода на экран или генерации файлов этот цикл незаменим. В нашем примере переменная %%i будет принимать значения от тройки до десятки с шагом в единицу (6, 7, 8, 9, 10). Шаг, кстати, легко может быть отрицательным, равно как и оба значения - начальное и конечное. Правда, пригодится вряд ли ;).

FOR /F ["параметры"] %%i IN ([список файлов] или ["строка"] или ['команда']) DO command %%i

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

Ты, видимо, уже заметил, что вместо обычной маски в IN'e этого цикла стоят аж три параметра на выбор. Список файлов - он и в Африке список файлов, а вот "строка" и 'команда' - вещи для нас новые. Если параметр IN'a указан в двойных кавычках, система не интерпретирует его как список файлов или маску, а ищет слова прямо в нем. Если же параметр стоит в одинарных кавычках - он воспринимается как команда, и слова ищутся в строках, выведенных этой командой на экран (если помнишь, прошлый раз мы использовали dir для получения имен директорий).

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

Содержание  Вперед на стр. 022-068-2