Cmd цикл for – обработка корневых и вложенных папок
Для работы с каталогами цикл принимает следующий вид:
for /D %%переменная in (набор_каталогов) do (оператор)
Фактически, тут логика работы аналогична той, что используется при работе с файлами. Переменная набор_каталогов содержит путь к папке, содержимое которой нужно обработать. Только помните, что в данном случае мы получаем не список файлов, а каталогов.
Cmd цикл for – обработка полной структуры
Для решения этой задачи, используется следующий синтаксис:
for /R [путь] %%переменная in (набор_файлов) do (оператор)
Видим, что тут уже фигурирует ключ R, после которого можно указать путь к папке или диску, структуру которого надо обработать. Если не указывать путь, то произойдет обработка текущей папки. Как и прежде, перед ключевым словом in нужно прописать переменную инициализации, а переменная набор_файлов может хранить имя файла или их список, заданный с помощь шаблона или через пробел:
В данном случае происходит поиск файлов с расширением .vbs и .js во всей структуре системного каталога, заданного переменной окружения SystemRoot.
Можно даже извлечь список всех вложенных каталогов для заданной структуры:
В данном случае, мы использовали оба ключа /R и /D, а символ звездочки указывает на то, что нужно извлечь список абсолютно всех вложенных папок.
Вложенные циклы
В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами:
Инициализация цикла списком, полученным из результатов работы команды
Ещё один способ инициализации цикла
for
заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.
Команда break
Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов
for
, и для циклов
while
Команда continue
Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду
continue
в цикле
for
Обработка содержимого файла
Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла
/etc/passwd
Обход файлов, содержащихся в директории
Один из самых распространённых вариантов использования циклов
for
в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.
Например, вот как можно вывести список файлов и папок:
Организация циклов
В командных файлах для организации циклов используются несколько разновидностей оператора FOR, которые обеспечивают следующие функции:
- · выполнение заданной команды для всех элементов указанного множества;
- · выполнение заданной команды для всех подходящих имен файлов;
- · выполнение заданной команды для всех подходящих имен каталогов;
- · выполнение заданной команды для определенного каталога, а также всех его подкаталогов;
- · получение последовательности чисел с заданными началом, концом и шагом приращения;
- · чтение и обработка строк из текстового файла;
- · обработка строк вывода определенной команды.
Цикл FOR … IN … DO …
Самый простой вариант синтаксиса команды FOR для командных файлов имеет следующий вид:
FOR %%переменная IN (множество)
DO команда [параметры]
Внимание!
Перед названием переменной должны стоять именно два знака процента (%%), а не один, как это было при использовании команды FOR непосредственно из командной строки!
Пример 5. Если в командном файле заданы строки
@ECHO OFF
FOR %%i IN (Раз, Два, Три) DO ECHO %%i
то в результате его выполнения на экран будет выведено следующее:
Раз
Два
Три
Параметр множество в команде FOR задает одну или более текстовых строк, разделенных запятыми, которые необходимо обработать с помощью заданной команды. Скобки здесь обязательны. Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается. Если в строке, входящей во множество, используется запятая, то значение этой строки нужно заключить в кавычки. Например, в результате выполнения файла с командами
@ECHO OFF
FOR %%i IN (“Раз,Два”,Три) DO ECHO %%i
на экран будет выведено
Раз,Два
Три
Параметр %%переменная представляет подставляемую переменную (счетчик цикла), причем здесь могут использоваться только имена переменных, состоящие из одной буквы. При выполнении команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве, пока команда, стоящая после ключевого слова DO, не обработает все такие строки.
Замечание. Чтобы избежать путаницы с параметрами командного файла %0 — %9, для переменных следует использовать любые символы кроме 0 – 9.
Параметр множество в команде FOR может также представлять одну или несколько групп файлов. Например, чтобы вывести в файл список всех файлов с расширениями txt и prn, находящихся в каталоге C:TEXT, без использования команды DIR, можно использовать командный файл следующего содержания:
@ECHO OFF
FOR %%f IN (C:TEXT*.txt C:TEXT*.prn) DO ECHO %%f >> list.txt
При таком использовании команды FOR процесс обработки продолжается, пока не обработаются все файлы (или группы файлов), указанные во множестве.
Цикл FOR /D … IN … DO …
Следующий вариант команды FOR реализуется с помощью ключа /D (directory – каталог):
FOR /D %переменная IN (набор) DO команда [параметры]
В случае, если набор содержит подстановочные знаки, то команда выполняется для всех подходящих имен каталогов, а не имен файлов. Скажем, выполнив следующий командный файл:
@ECHO OFF
CLS
FOR /D %%f IN (C:*.*) DO ECHO %%f
мы получим список всех каталогов на диске C:, например:
C:Arc
C:CYR
C:MSCAN
C:Program Files
C:TEMP
C:WINNT
Цикл FOR /R … IN … DO …
С помощью ключа /R можно задать рекурсию в команде FOR:
FOR /R [[диск:]путь] %переменная IN (набор)
DO команда [параметры]
В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога.
Пример. Для распечатки всех файлов с расширением txt в текущем каталоге и всех его подкаталогах можно использовать следующий пакетный файл:
@ECHO OFF
CLS
FOR /R %%f IN (*.txt) DO PRINT %%f
Если вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если мы находимся в каталоге C:TEXT с двумя подкаталогами BOOKS и ARTICLES, то в результате выполнения файла:
@ECHO OFF
CLS
FOR /R %%f IN (.) DO ECHO %%f
на экран выведутся три строки:
C:TEXT.
C:TEXTBOOKS.
C:TEXTARTICLES.
Цикл FOR /L … IN … DO …
Ключ /L позволяет реализовать с помощью команды FOR цикл со счетчиком, в этом случае синтаксис имеет следующий: вид:
FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]
Здесь заданная после ключевого слова IN тройка (начало, шаг, конец) задает последовательность чисел с заданными началом, концом и шагом приращения. Например, тройка (1, 1, 5) порождает последовательность (1 2 3 4 5), а тройка (5, -1, 1) – последовательность (5 4 3 2 1). Например, в результате выполнения следующего командного файла:
@ECHO OFF
CLS
FOR /L %%f IN (1,1,5) DO ECHO %%f
переменная цикла %%f получит значения от 1 до 5, и на экран будут выведены пять чисел:
Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:
@ECHO OFF
CLS
FOR /L %%f IN (1,1,5) DO CALL :2 %%f
GOTO :EOF
:2
SET /A M=10*%1
ECHO 10*%1=%M%
В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку :2 (см. описание CALL в разделе “Изменения в командах перехода”). В шестой строке переменная цикла умножается на десять, и результат записывается в переменную M. Таким образом, в результате выполнения этого файла выведется следующая информация:
- 10*1=10
- 10*2=20
- 10*3=30
- 10*4=40
- 10*5=50
Цикл FOR /F … IN … DO …
Самые широкие возможности имеет команда FOR с ключом /F:
FOR /F [“ключи”] %переменная IN (набор) DO команда [параметры]
Здесь параметр набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбиении его на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла (заданной команды).
По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр “ключи” служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в табл. 3 ключевые слова:
Таблица 3. Ключи в команде FOR /F
Ключ | Описание |
EOL=C | Определение символа комментариев в начале строки (допускается задание только одного символа) |
SKIP=N | Число пропускаемых при обработке строк в начале файла |
DELIMS=XXX | Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции |
TOKENS=X,Y,M-N | Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла |
Перебор простых значений
Пожалуй, самый простой пример цикла
for
в bash-скриптах — это перебор списка простых значений:
Перебор сложных значений
В списке, использованном при инициализации цикла
for
, могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слов и знаков препинания. Например, всё это может выглядеть так:
Пример: поиск исполняемых файлов
Давайте воспользуемся тем, что мы уже разобрали, и напишем что-нибудь полезное. Например, если надо выяснить, какие именно исполняемые файлы доступны в системе, можно просканировать все папки, записанные в переменную окружения
PATH
. Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино:
Разделители полей
Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется
IFS
(Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:
- Пробел
- Знак табуляции
- Знак перевода строки
Если bash встречает в данных любой из этих символов, он считает, что перед ним — следующее самостоятельное значение списка.
Для того, чтобы решить проблему, можно временно изменить переменную среды IFS. Вот как это сделать в bash-скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки:
IFS=$'n'После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
Управление циклами
Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла. Надо ли будет в такой ситуации дожидаться нормального завершения цикла? Нет конечно, и в подобных случаях пригодятся следующие две команды:
Цикл while
Конструкция
for —
не единственный способ организации циклов в bash-скриптах. Здесь можно пользоваться и циклами
while
. В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится.
Вот схема организации циклов whilewhile команда проверки условияdoдругие командыdone
Взглянем на пример скрипта с таким циклом:
Цикл в командной строке for /l
Всем привет. Подскажите, как можно сделать цикл что бы передавал по очередно файлы для aerender.exe ? Вот тут примеры есть https://helpx.adobe.com/ru/after-effects/using/automated-rendering-network-rendering.html
Пытаюсь написать вот так
FOR /L %i IN (1,1,n) DO aerender -project "%i.aep"Но ничего не запускается даже. Командная строка открыта в директории c:Program FilesAdobeAdobe After Effects CC 2021Support Files и два файла проекта лежат там же 1.aep и 2.aep . Если так вообще можно сделать, позже хотел бы сделать. что бы файлы проекта искал не там же а в другой директории? И хотел бы написать батник что бы не лазить постоянно в директорию с aerender.exe, что то типо
Вот такого
FOR /L %i IN (1,1,n) DO "c:Program FilesAdobeAdobe After Effects CC 2021Support Filesaerender.exe" -project d:%i.aepДа, я понимаю, что это не правильно, подскажите как правильно написать ?

Циклы for
Оболочка bash поддерживает циклы
for
, которые позволяют организовывать перебор последовательностей значений. Вот какова базовая структура таких циклов:
for var in list
do
команды
done
В каждой итерации цикла в переменную
var
будет записываться следующее значение из списка
list
. В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором — второе, и так далее — до тех пор, пока цикл не дойдёт до последнего элемента.
Циклы for в стиле c
Если вы знакомы с языком программирования C, синтаксис описания bash-циклов
for
может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:
for (i = 0; i < 10; i )
{
printf("number is %dn", i);
}
В bash-скриптах можно использовать циклы
for
, описание которых выглядит очень похожим на циклы в стиле C, правда, без некоторых отличий тут не обошлось. Схема цикла при подобном подходе выглядит так:
for (( начальное значение переменной ; условие окончания цикла; изменение переменной ))На bash это можно написать так:
for (( a = 1; a < 10; a ))А вот рабочий пример:
Обработка вывода, выполняемого в цикле
Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции
done
Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:
Итоги
Сегодня мы поговорили о циклах
for while
в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.
Если предположить, что вы — разработчик bash-скриптов, который знает о них только то, что изложено в первой части этого цикла статей, и в этой, второй, то вы уже вполне можете написать кое-что полезное. Впереди — третья часть, разобравшись с которой, вы узнаете, как передавать bash-скриптам параметры и ключи командной строки, и что с этим всем делать.
Уважаемые читатели! В комментариях к предыдущему материалу вы рассказали нам много интересного. Уверены, всё это окажет неоценимую помощь тем, кто хочет научиться программировать для bash. Но тема эта огромна, поэтому снова просим знатоков поделиться опытом, а новичков — впечатлениями.




