Для организации циклов в КФ используется команда FOR, реализующая следующие функции:
– выполнение заданной команды для всех элементов указанного множества;
– выполнение заданной команды для всех подходящих имен файлов;
– выполнение заданной команды для всех подходящих имен каталогов;
– выполнение заданной команды для определенного каталога, а также всех его подкаталогов;
– получение последовательности чисел с заданными началом, концом и шагом приращения;
– чтение и обработка строк из текстового файла;
– обработка строк вывода команды cmd.
Цикл FOR … IN … DO … (выполнение команды для каждого элемента множества)
Этот вариант команды FOR для КФ имеет вид:
FOR %%переменная IN (множество) DO команда [параметры]Параметр множество в команде FOR задает одну или более текстовых строк, которые необходимо обработать с помощью заданной команды. Строки разделяются запятыми. Скобки здесь обязательны. Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается.Параметр %%переменная представляет параметр цикла, в качестве которого могут использоваться имена переменных,состоящие из одной буквы. Цифры использовать нельзя. При выполнении КФ в примере 6 команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве.
Пример 1. 6. Вывод нескольких строк
FOR %%i IN (one, two) DO ECHO %%iВ результате выполнения КФ примера 1.6 на экран будут выведены две строки:
onetwoПараметр множество в команде FOR может также представлять одну или несколько групп файлов. Например, чтобы вывести на экран список всех файлов с расширениями txt или cmd, находящихся в каталоге C:\TEXT, без использования команды DIR, можно использовать сценарий следующего содержания:
Цикл FOR /D … IN … DO … (выполнение команды для подкаталогов)
Данный вариант команды FOR реализуется с помощью ключа /D:
FOR /D %переменная IN (набор) DO команда [параметры]В случае, если набор содержит подстановочные знаки, то команда выполняется для всех подходящих имен каталогов. Например, в результате выполнения сценария
FOR /D %%d IN (C:\*.*) DO ECHO %%dбудет получен список всех каталогов на диске C:
Цикл FOR /R … IN … DO … (выполнение заданной команды для определенного каталога, а также всех его подкаталогов)
С помощью ключа /R можно задать рекурсию:
FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]Заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога. Если вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если текущим является каталог C:\TEXT с двумя подкаталогами BOOKS и ARTS, то в результате выполнения КФ
FOR /R %%f IN (.) DO ECHO %%fна экран выведутся три строки:C:\TEXT\.C:\TEXT\BOOKS\.C:\TEXT\ARTS\.Цикл FOR /L … IN … DO … (получение последовательности чисел с заданными началом, концом и шагом приращения)
Ключ /L позволяет реализовать с помощью команды FOR цикл со счетчиком, в этом случае команда имеет следующий: вид:
FOR /L % переменная IN (начало, шаг, конец) DO команда [параметры]
Тройка (начало, шаг, конец) заданная после ключевого слова IN определяет последовательность чисел с заданными началом, концом и шагом приращения, которую можно использовать в арифметических вычислениях. Например, тройка (1, 1, 3) определяет последовательность (1 2 3).Цикл FOR /F … IN … DO … (чтение и обработка строк из текстового файла)
FOR /F ["ключи"] %переменная IN (набор) DO команда [параметры]
Параметр набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в разбиении файла на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении тела цикла FOR.
По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр "ключи" служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в таблице 1.4 ключевые слова.
Таблица 1.4 – Ключи команды FOR /F
Ключ | Описание |
SKIP=N | Число пропускаемых при обработке строк в начале файла |
DELIMS=XXX | Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции |
TOKENS=X,Y,M-N | Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла |
При использовании ключа TOKENS=X,Y,M-N создаются дополнительные переменные. Формат M-N представляет собой диапазон подстрок с номерами от M до N. Если последний символ в строке TOKENS= является звездочкой, то создается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.
Пример 1.7. КФ для разбора текстового файла myfile.txt:
IF NOT EXIST myfile.txt GOTO:NoFileFOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN (myfile.txt) DO @ECHO %%i %%j %%kGOTO:EOF:NoFileECHO myfile.txt not found!В примере 1.7 в первой строке производится проверка наличия файла myfile.txt и при его отсутствии выводится сообщение. Команда FOR во второй строке обрабатывает файл myfile.txt следующим образом:
– пропускаются все строки, которые начинаются с символа точки с запятой (EOL=;);
– вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми (DELIMS=,);
– в теле цикла переменная %%i используется для второй подстроки, %%j – для третьей, а %%k получает все оставшиеся подстроки после третьей.
В нашем примере переменная %%i явно описана в команде FOR, а переменные %%j и %%k описываются неявно с помощью ключа TOKENS=. Например, если в файле myfile.txt были записаны следующие три строки:
АА BBB CCCC, DDDDDЕ, JJ KKK;TTTT LLLL МММММто в результате выполнения КФ на экран будут выведены две строки:
BBB CCCC DDDDDJJ KKKЗамечание 1. Ключ TOKENS= позволяет извлечь из одной строки файла до 26 подстрок, поэтому запрещено использовать имена переменных, начинающиеся не с букв английского алфавита (a–z).
Замечание 2. Имена переменных i, j, k должны следовать в алфавитном порядке.
Замечание 3. Имена параметров цикла FOR являются глобальными, поэтому одновременно не может быть активно более 26 переменных.
Команда FOR /F позволяет обработать отдельную строку. Для этого следует ввести данную строку в кавычках вместо набора имен файлов в скобках. Строка будет обработана так, как будто она взята из файла. Например, файл следующего содержания:
FOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN ("AA CC BB,GG DD") DO @ECHO %%i %%j %%kпри своем выполнении выведет
CC BB GG DDЦикл FOR / F … IN (‘команда’) – (обработка строк вывода команды cmd).
Для обработки строки вывода команды необходимо в скобках ввести строку вызова команды в апострофах. Строка передается для выполнения интерпретатору команд cmd, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующий КФ в примере
Пример 1.8.
ECHO Имена переменных среды:FOR /F "DELIMS==" %%i IN ('SET') DO ECHO %%iвыведет перечень имен всех переменных среды, определенных в настоящее время в системе.
В цикле FOR допускается применение функций анализа имен файлов, перечисленных в таблице 1.2. Использование функции ~Z показано в примере 1.9.
Пример 1.9. Вычисление суммарной длины всех файлов в заданном подкаталогеSETLOCAL ENABLEDELAYEDEXPANSIONSET /A Size = 0 FOR %%I IN (%1\*.*) DO SET /A Size= Size + %%~zIECHO %Size%