Циклы для командной строки windows

Содержание
  1. Урок 7 по CMD — цикл for, работа с файлами и значениями
  2. Командная строка for – перебор значений
  3. Командная строка for – работа с файлами
  4. Урок 8 по CMD — цикл for, работа с папками и подпапками
  5. Cmd цикл for – обработка корневых и вложенных папок
  6. Cmd цикл for – обработка полной структуры
  7. Организация циклов — Интерпретатор командной строки операционной системы MS Windows
  8. Cmd цикл for – обработка корневых и вложенных папок
  9. Cmd цикл for – обработка полной структуры
  10. Вложенные циклы
  11. Инициализация цикла списком, полученным из результатов работы команды
  12. Команда break
  13. Команда continue
  14. Обработка содержимого файла
  15. Обход файлов, содержащихся в директории
  16. Организация циклов
  17. Перебор простых значений
  18. Перебор сложных значений
  19. Пример: поиск исполняемых файлов
  20. Разделители полей
  21. Управление циклами
  22. Цикл while
  23. Цикл в командной строке for /l
  24. Циклы for
  25. Циклы for в стиле c
  26. Обработка вывода, выполняемого в цикле
  27. Итоги

Урок 7 по CMD — цикл for, работа с файлами и значениями

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

Лично я, сперва добавляю в переменную окружения PATH путь к каталогу, в котором находится сценарий:

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

Командная строка for – перебор значений

Для перебора значений используется следующий синтаксис:

for /L %%переменная in (начало, шаг, конец) do (оператор)

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

  • начало – начальное значение
  • шаг – тут мы указывает, насколько нужно увеличивать или уменьшать начальное значение при каждой итерации. То есть, если параметр содержит отрицательное число, то будет происходить уменьшение, иначе – увеличение параметра “начало”.
  • конец – тут нужно указать конечное значение, именно оно и будет определять, завершать цикл или нет. То есть, при каждой итерации происходит сравнивание начального и конечного параметра.

Давайте рассмотрим такой пример:

В данном сценарии используются два цикла for командной строки, первый задает диапазон цифр от 0 до 5 с шагом 1, второй – диапазон цифр от 5 до 0 с шагом -1. То есть, прямой и обратный порядок. Функция ЭХО будет в виде списка выводить содержимое переменной B. Команда “echo.” вставляем между списками пустую строку.

Теперь попробуем найти сумму чисел от 0 до 100:

Сначала мы отключаем вывод эхо-отображений. Потом мы объявляем переменную summ с помощью ключевого слова set и присваиваем ей ноль. Далее в цикле for задаем начальное значение в 0, шаг в 1 и конечное значение в 100. Суммирование происходит в строке set/A summ+=%%B, тут к содержимому переменной summ будет добавляться содержимое переменной %%B. В конце мы выводим конечный результат и удаляем из окружения summ.

Теперь давайте посмотрим, как будет выглядеть код для нахождения факториала числа 5:

Тут практически тот же самый синтаксис, за исключением того, что мы задали отрицательный шаг и использовали оператор *=.

Хорошо, теперь усложним задачу: найдем сумму чисел от 0 до 10, исключив из расчета числа 5, 7 и 9:

Как видим, для проверки условия мы использовали условный оператор if. К сожалению, в командной строке нет логических операторов тип “ИЛИ” и “И”, как например, в языках vbscript и jscript, поэтому нам пришлось создавать вложенные операторы if. В результате, мы получили число 34. Также обратите внимание на оператор “neq” – проверка условия типа “НЕ РАВНО”.

Командная строка for – работа с файлами

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

for %переменная in (набор_файлов) do (оператор)

Базовый параметр тут переменная набор_файлов, которая может содержать:

  • отдельный файл, например, my_file.txt
  • групповой набор документов, заданный через шаблон, например, *.txt
  • список файлов, который разделяется пробелами, причем каждый элемент списка тоже может содержать шаблон, например, my_file.txt *.doc my*.avi

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

В следующем примере происходит вывод всех файлов из каталога d:\work\ с расширением .txt:

Тут B является переменной инициализации, при каждой итерации ей будет присвоено путь, имя и расширение найденного текстового документа, а функция ЭХО сразу выведет информацию на экран. Потом снова, переменной B будет присвоено новое имя и снова произойдет вывод данных. Сам цикл работает до тех пор, пока не будут найдены все значения, заданные в условии.

Естественно, можно задать условие для вывода всех файлов с расширениями, например, .txt, .avi и .pdf.

В данном случае переменная work_dir содержит путь к папке d:\work, в цикле командной строки for мы добавляем к переменной нужные расширения. В конце сценария происходит удаление переменной work_dir.

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

Можно попробовать получить список имен файлов и их размер:

z позволяет получить размер файла в байтах.

Что бы использовать сразу цикл в командной строке, стоит вместо двух символов % прописывать один, например:

Спасибо за внимание. Автор блога Владимир Баталий

Урок 8 по CMD — цикл for, работа с папками и подпапками

В этой статье мы рассмотрим как используется цикл for в командной строке (cmd) для групповой работы с каталогами. Как уже упоминалось, логику работы cmd цикла можно менять с помощью ключей, так, для обработки каталогов применяется ключ /D.

Читайте также:  Файл русского языка для windows 10

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

Фактически, с помощью цикла cmd for можно получить слепок всего дерева каталогов для заданного диска, и в групповом порядке их обработать.

Cmd цикл for – обработка корневых и вложенных папок

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

for /D %%переменная in (набор_каталогов) do (оператор)

Фактически, тут логика работы аналогична той, что используется при работе с файлами. Переменная набор_каталогов содержит путь к папке, содержимое которой нужно обработать. Только помните, что в данном случае мы получаем не список файлов, а каталогов. Мы также можем указать шаблон для поиска:

В данном случае функция echo выведет список всех папок, которые есть в системном каталоге (путь к нему, хранится в переменной (%SystemRoot%). Или такой вариант:

Тут мы получим список лишь тех папок, имена которых начинаются на S.

Как и с файлами, можно указать список, используя в качестве разделителя пробел:

Тут происходит вывод всех папок из системной и временной папки (переменная окружения %TEMP%).

А вот такая запись:

выведет путь к системному каталогу, заданному в переменной окружения %SystemRoot%. Аналогичный результат можно получить прописав:

в первом случае мы используем функцию echo, а во втором ключевое слово set.

Можно совмещать различные вариации цикла cmd (командной строки), так, можно попробовать получить список всех заданных файлов, которые есть во вложенных каталогах текущей папки, например:

В данном примере вначале сценария создается переменная work_dir, который присваивается путь d:\work. Далее следует cmd цикл с ключом /d. Переменная B будет хранить пути ко всем вложенным каталога папки d:\work. При нахождении вложенной папки идет обработка нового цикла cmd, который уже отвечает за поиск текстовых файлов в найденном подкаталоге. Результат как всегда выводится с помощью функции echo. В конце сценария мы удаляем переменную work_dir из переменной среды.

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

Cmd цикл for – обработка полной структуры

Для решения этой задачи, используется следующий синтаксис:

for /R [путь] %%переменная in (набор_файлов) do (оператор)

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

В данном случае происходит поиск файлов с расширением .vbs и .js во всей структуре системного каталога, заданного переменной окружения SystemRoot.

Можно даже извлечь список всех вложенных каталогов для заданной структуры:

В данном случае, мы использовали оба ключа /R и /D, а символ звездочки указывает на то, что нужно извлечь список абсолютно всех вложенных папок.

Спасибо за внимание. Автор блога Владимир Баталий

Организация циклов — Интерпретатор командной строки операционной системы MS Windows

Cmd цикл for – обработка корневых и вложенных папок

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

for /D %%переменная in (набор_каталогов) do (оператор)

Фактически, тут логика работы аналогична той, что используется при работе с файлами. Переменная набор_каталогов содержит путь к папке, содержимое которой нужно обработать. Только помните, что в данном случае мы получаем не список файлов, а каталогов.

Cmd цикл for – обработка полной структуры

Для решения этой задачи, используется следующий синтаксис:

for /R [путь] %%переменная in (набор_файлов) do (оператор)

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

В данном случае происходит поиск файлов с расширением .vbs и .js во всей структуре системного каталога, заданного переменной окружения SystemRoot.

Можно даже извлечь список всех вложенных каталогов для заданной структуры:

В данном случае, мы использовали оба ключа /R и /D, а символ звездочки указывает на то, что нужно извлечь список абсолютно всех вложенных папок.

Вложенные циклы

В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами:

Инициализация цикла списком, полученным из результатов работы команды


Ещё один способ инициализации цикла

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

Команда break

Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов

Команда continue


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

Обработка содержимого файла

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

Обход файлов, содержащихся в директории

Один из самых распространённых вариантов использования циклов

Читайте также:  Создание нового пользователя mac os

в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.

Например, вот как можно вывести список файлов и папок:

Организация циклов

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

  • · выполнение заданной команды для всех элементов указанного множества;
  • · выполнение заданной команды для всех подходящих имен файлов;
  • · выполнение заданной команды для всех подходящих имен каталогов;
  • · выполнение заданной команды для определенного каталога, а также всех его подкаталогов;
  • · получение последовательности чисел с заданными началом, концом и шагом приращения;
  • · чтение и обработка строк из текстового файла;
  • · обработка строк вывода определенной команды.

Цикл FOR … IN … DO …

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

FOR %%переменная IN (множество)

DO команда [параметры]

Перед названием переменной должны стоять именно два знака процента (%%), а не один, как это было при использовании команды FOR непосредственно из командной строки!

Пример 5. Если в командном файле заданы строки

FOR %%i IN (Раз, Два, Три) DO ECHO %%i

то в результате его выполнения на экран будет выведено следующее:

Параметр множество в команде FOR задает одну или более текстовых строк, разделенных запятыми, которые необходимо обработать с помощью заданной команды. Скобки здесь обязательны . Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается . Если в строке, входящей во множество, используется запятая, то значение этой строки нужно заключить в кавычки. Например, в результате выполнения файла с командами

FOR %%i IN («Раз,Два»,Три) DO ECHO %%i

на экран будет выведено

Параметр %%переменная представляет подставляемую переменную (счетчик цикла), причем здесь могут использоваться только имена переменных, состоящие из одной буквы . При выполнении команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве, пока команда, стоящая после ключевого слова DO, не обработает все такие строки.

Замечание. Чтобы избежать путаницы с параметрами командного файла %0 — %9, для переменных следует использовать любые символы кроме 0 — 9.

Параметр множество в команде FOR может также представлять одну или несколько групп файлов. Например, чтобы вывести в файл список всех файлов с расширениями txt и prn, находящихся в каталоге C:TEXT, без использования команды DIR, можно использовать командный файл следующего содержания:

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 команда [параметры]

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

FOR /D %%f IN (C:*.*) DO ECHO %%f

мы получим список всех каталогов на диске C:, например:

Цикл FOR /R … IN … DO …

С помощью ключа /R можно задать рекурсию в команде FOR:

FOR /R [[диск:]путь] %переменная IN (набор)

DO команда [параметры]

В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога.

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

FOR /R %%f IN (*.txt) DO PRINT %%f

Если вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если мы находимся в каталоге C:TEXT с двумя подкаталогами BOOKS и ARTICLES, то в результате выполнения файла:

FOR /R %%f IN (.) DO ECHO %%f

на экран выведутся три строки:

Цикл 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). Например, в результате выполнения следующего командного файла:

FOR /L %%f IN (1,1,5) DO ECHO %%f

переменная цикла %%f получит значения от 1 до 5, и на экран будут выведены пять чисел:

Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях . Рассмотрим командный файл my.bat следующего содержания:

FOR /L %%f IN (1,1,5) DO CALL :2 %%f

В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку :2 (см. описание CALL в разделе «Изменения в командах перехода»). В шестой строке переменная цикла умножается на десять, и результат записывается в переменную M. Таким образом, в результате выполнения этого файла выведется следующая информация:

Цикл FOR /F … IN … DO …

Самые широкие возможности имеет команда FOR с ключом /F:

FOR /F [«ключи»] %переменная IN (набор) DO команда [параметры]

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

Читайте также:  Linux mint настройка подключения

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

Таблица 3. Ключи в команде FOR /F

Определение символа комментариев в начале строки (допускается задание только одного символа)

Число пропускаемых при обработке строк в начале файла

Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции

Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла

Перебор простых значений

Пожалуй, самый простой пример цикла

в bash-скриптах — это перебор списка простых значений:

Перебор сложных значений


В списке, использованном при инициализации цикла

, могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слов и знаков препинания. Например, всё это может выглядеть так:

Пример: поиск исполняемых файлов

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

. Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино:

Разделители полей


Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется

(Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:

  • Пробел
  • Знак табуляции
  • Знак перевода строки

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

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

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

Управление циклами

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

Цикл while

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

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

Вот схема организации циклов whilewhile команда проверки условияdoдругие командыdone

Взглянем на пример скрипта с таким циклом:

Цикл в командной строке for /l

Всем привет. Подскажите, как можно сделать цикл что бы передавал по очередно файлы для aerender.exe ? Вот тут примеры есть https://helpx.adobe.com/ru/after-effects/using/automated-rendering-network-rendering.html

Пытаюсь написать вот так

Но ничего не запускается даже. Командная строка открыта в директории c:Program FilesAdobeAdobe After Effects CC 2021Support Files и два файла проекта лежат там же 1.aep и 2.aep . Если так вообще можно сделать, позже хотел бы сделать. что бы файлы проекта искал не там же а в другой директории? И хотел бы написать батник что бы не лазить постоянно в директорию с aerender.exe, что то типо
Вот такого

Да, я понимаю, что это не правильно, подскажите как правильно написать ?

Циклы for

Оболочка bash поддерживает циклы

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


В каждой итерации цикла в переменную

будет записываться следующее значение из списка

. В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором — второе, и так далее — до тех пор, пока цикл не дойдёт до последнего элемента.

Циклы for в стиле c

Если вы знакомы с языком программирования C, синтаксис описания bash-циклов

может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:


В bash-скриптах можно использовать циклы

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

На bash это можно написать так:

А вот рабочий пример:

Обработка вывода, выполняемого в цикле


Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции

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

Итоги

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

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

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

Уважаемые читатели! В комментариях к предыдущему материалу вы рассказали нам много интересного. Уверены, всё это окажет неоценимую помощь тем, кто хочет научиться программировать для bash. Но тема эта огромна, поэтому снова просим знатоков поделиться опытом, а новичков — впечатлениями.

Оцените статью