Перейти к содержимому

Как сделать цикл в cmd

  • автор:

Как сделать бесконечный цикл в cmd?

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

Если речь идёт непосредственно о командной строке

то стоит воспользоваться циклом for :

Если же речь о bat-файле

в предыдущей команде можно удвоить знак процента:

но лучше воспользоваться меткой и goto :

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.3.43277

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Статья [CMD] Циклические операции и примеры (команда FOR)

Командой FOR задаётся список команд, которые выполняются с КАЖДЫМ элементом набора.
Набор * пишется внутри IN (. )
Список команд пишется внутри DO (. )
Командная строка выполняет эти команды раз за разом, при этом текущий элемент набора находится в переменной, заданной после %% (назовём ее переменной цикла).

выведет имена и путь ко всем файлам с расширением .txt в папке C:\Users.

* Примеры под спойлером

Для команды For без ключей набором может являться :

1) Маска файлов* (или путь + маска файлов)
— в двойных кавычках, или без них:

IN (*.txt)
Результат: список файлов с расширением .txt в текущем каталоге.

IN (*.txt *.bat)
Результат: список файлов с расширениеми .txt и .bat в текущем каталоге.

IN ("C:\Folder 1\Doc_31-12-*.txt")
Результат: тот же. Но поиск ведется в каталоге C:\Folder 1 (заметьте с пробелом в имени);
имя файла начинается на Doc_31-12-

Прим.: FOR без ключа не умеет выводить список каталогов.
* маска файлов — это набор файлов, заданный с помощью подстановочных знаков * и/или ?
где * — обозначает 0 или больше любых символов в имени файла.
а ? — означает 0 или 1 любой символ в имени файла.

2) Строка
— в двойных кавычках, или без них:

Строкой считается любая последовательность символов, если она не содержит знаков маски * или ?
Смысл цикла здесь в том, чтобы разбить такую строку по пробелам (или знакам табуляции)
и выполнить с каждой подстрокой список команд.

(тильда) при раскрытии переменной цикла %%

*О других модификаторах переменной цикла можно почитать здесь и здесь.

3) еще есть смешанный тип. Это когда в наборе стоит маска (1-й описанный тип), а через пробел Строка (2 тип). ведет себя вполне ожидаемо, но вряд ли найдет себе применение.

О наборах для FOR с ключем /F далее в нижнем спойлере.

выведет все строки файла 1.txt, который находится в корне диска C.

UseBackQ (Use back quotes) означает, что набор с двойными кавычками * подразумевает передачу в цикл имени файла.
delims= означает, что в переменную %%a будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).
В такой вариации:
tokens=* приводит к тому же результату, что и delims= . Означает прекратить разбивку по разделителю после "0-го" токена, т.е. сразу же.

* Этот вариант необходим для работы с файлом, путь или имя которого содержит пробелы.
Можно было не использовать UseBackQ , тогда команда приняла бы вид:

но такая конструкция восприняла бы пробел в имени как определение нового файла, поэтому UseBackQ более приемлем.

** Примеры под спойлером

В цикле FOR /F вид задаваемого набора зависит от формы кавычек в IN (. ) , а также наличия ключевого слова UseBackQ

Виды наборов для FOR /F:
1) Набор файлов (задание маски недопустимо!)

без UseBackQ — задается без кавычек IN (. )
__ с UseBackQ — может задаваться как в кавычках так и без них. IN (. ) IN (". ")

Функционал: чтение содержимого файла(ов) построчно в переменную цикла!

Принцип работы: источником для разбиения по разделителю (delims) является содержимое файла, заданного внутри IN (. ) или файлов, если они заданы через пробел.

Исключение: принятый по-умолчанию разделитель (пробел и знак табуляции) для этой конструкции цикла не применяется.

А что получится, если установить delims= (возле равно — знак пробела) ?

2) Строка (допускаются практически любые символы)

без UseBackQ — задается с двойными кавычками IN (". ")
__ с UseBackQ — задается с одиночными прямыми кавычками IN (‘. ‘)

3) Команда (сначала выполняется она, а уже ее результаты обрабатываются циклом как строка(-и))

без UseBackQ — задается с одиночными прямыми кавычками IN (‘. ‘)
__ с UseBackQ — задается с одиночными обратными кавычками IN (`. `)

1.1. Чтение файла — Набор файлов

Результат: выведет подряд содержимое двух файлов — 1.txt и 2.txt из каталога c:\users
Прим.: Echo. — с точкой — это обход ошибки, чтобы можно было напечатать пустую строку, точнее строку с пробелами.

1.2. Чтение файла — Набор файлов + UseBackQ
Получаем возможность использовать пробелы.

Результат: выведет содержимое файла 1.txt из каталога c:\folder 1
(заметьте, в имени папки есть пробел).

Результат такой же.

3.1. Команда

Сначала выполняется Dir /AD-L , которая выводит информацию о папках в текущем каталоге.
Вот что попадает под разбор циклу:

Далее цикл разбирает каждую строку по пробелам и табуляции на подстроки (токены).
На примере 1-й строки:
1-й токен (%%a)=29.12.2012 . 2-й токен (%%b)=15:16 . 3-й токен (%%c)=<DIR> . 4-й токен (%%d)=Favorites
.
Результат через Echo выводится на экран:

Отличительной особенностью FOR /F является умение работать через токены * ,
а также поддержка дополнительных ключевых слов:
1) eol — знак комментария в начале строки (1-й символ). Т.е. строки с таким символом не будут обрабатываться. (по умолчанию, знак точки с запятой ; )
2) skip — пропуск определенного кол-ва обрабатываемых строк от начала файла
3) delims — задать другой разделитель(-ли) (по умолчанию, пробел и знак табуляции)
4) tokens — количество получаемых токенов (подстрок) в теле цикла и пределы разбивки по разделителю.
Также можно задать конкретный № токена, который попадет в первую переменную цикла.
5) usebackq — изменение правил использования кавычек внутри IN (. )

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

* Токены — это подстроки, которые попадают в переменные цикла %% в каждой из итераций.
Они получаются в результате разбивки строки, заданной в IN (. ), по разделителю, заданному в Delims= (по умолчанию, пробел и знак табуляции).

В отличие, от FOR без ключа, в FOR /F все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла.
Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке*, начиная с буквы, заданной после FOR /F %%

Windows CMD/Циклы/for

for — команда, организовывающая цикл в командной строке (CMD) Windows. Аналог цикла for в C-подобн. ЯП.

Содержание

Преамбула

Цикл for производит выполнение указанной команды для каждого файла набора.

Синтаксис

  • %переменная – Однобуквенный подставляемый параметр.
  • (набор) – Определяет набор, состоящий из одного или нескольких файлов. Допускается использ. подстановочных знаков.
  • команда – Команда, которую следует выполнить для каждого файла.
  • параметры – Параметры и ключи для указанной команды.

Переменные

Особенности переменных

  • Имена переменных учитывают регистр букв — напр., %i отличается от %I .
  • Переменные должны быть односимвольными, по крайней мере для числового цикла.

Расширенная обработка команд

Если включена расширенная обработка команд, поддерживаются след. доп. формы команды for :

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

Числовой цикл

Синтаксис числового цикла:

Пример числового цикла

Это числовой цикл от 1 до 10 с шагом приращения 1. На каждой итерации цикла с помощью команды echo выводится переменная шага цикла — счётчика.

Бесконечный цикл

Бесконечный цикл можно реализовать на базе числового без задания настроек счётчика, тогда цикл будет бесконечным.

Примеры бесконечного цикла

Пример бесконечного цикла 1:

Пример бесконечного цикла 2:

Перебор всех файлов в директории

Отображать только имена файлов (не полный путь) с их расширениями в текущем каталоге:

files in current dir:

subdirs in current dir:

files in current and all subdirs:

subdirs in current and all subdirs:

Документация

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

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

Набор раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) — в (5 4 3 2 1)

или, если использован параметр usebackq:

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

  • eol=c — знак начала комментария в конце строки (допускается задание только одного знака).
  • skip=n — число пропускаемых при обработке строк в начале файла.
  • delims=xxx — набор разделителей вместо используемых по умолчанию пробела и знака табуляции.
  • tokens=x,y,m-n — номера подстрок из каждой строки, передаваемые в тело цикла for для каждой итерации. При использовании этого ключа выделяются дополнительные имена переменных. Формат m-n представляет собой диапазон подстрок с номерами от m по n. Если последний знак в строке tokens= является звездочкой, создается дополнительная переменная, значением которой будет весь оставшийся текст в строке после разбора последней подстроки.
  • usebackq — применение новой семантики, при которой строка, заключенная в обратные кавычки, выполняется как команда, строка, заключенная в прямые одиночные кавычки, является строкой-литералом, а двойные кавычки могут использоваться для задания имен файлов в наборе.

разбирает файл myfile.txt, пропуская все строки, которые начинаются с символа точки с запятой, и передает вторую и третью подстроки из каждой строки в тело цикла for , причем подстроки разделяются запятыми и/или пробелами. В теле цикла переменная %i используется для второй подстроки, %j — для третьей, а %k получает все оставшиеся подстроки после третьей. Имена файлов, содержащие пробелы, необходимо заключать в двойные кавычки. Чтобы использовать двойные кавычки, необходимо использовать параметр usebackq, иначе двойные кавычки будут восприняты как определение строки-литерала для разбора.

Переменная %i явно объявлена в инструкции for , а переменные %j и %k объявляются неявно с помощью ключа tokens=. Ключ tokens= позволяет извлечь из одной строки файла до 26 подстрок, при условии, что это не приведет к попытке объявить переменную после буквы «z» или «Z». Следует помнить, что имена переменных for явл. однобуквенными, с учетом регистра, глобальными, поэтому одновременно не может быть активно более 52 переменных.

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

1.1.13. Организация циклов c помощью оператора цикла for

Для организации циклов в КФ используется оператораFOR,реализующий функции:

выполнение заданной команды для всех элементов указанного множества;

выполнение заданной команды для всех подходящих имен файлов;

выполнение заданной команды для всех подходящих имен каталогов;

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

получение последовательности чисел с заданными началом, концом и шагом приращения;

чтение и обработка строк из текстового файла;

обработка строк вывода команды cmd.exe.

Цикл for … in … do … (выполнение команды для каждого элемента множества)

Этот вариант командыFOR для КФ имеет вид:

FOR %%переменная IN (множество) DO команда [параметры]

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

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

Пример 6. Вывод нескольких строк

FOR %%i IN (one, two) DO ECHO %%i

В результате выполнения КФ примера 6 на экран будут выведены две строки:

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

FOR %%f IN (C:\TEXT\*.txt C:\TEXT\*.cmd) DO ECHO %%f >> list.txt

Цикл 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

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

Цикл 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 выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр «ключи» служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в табл. 3 ключевые слова:

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

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

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

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

При использовании ключа TOKENS=X,Y,M-N создаются дополнительные переменные. Формат M-N представляет собой диапазон подстрок с номерами от M до N. Если последний символ в строке TOKENS= является звездочкой, то создается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.

Пример 7. КФ для разбора текстового файла myfile.txt:

IF NOT EXIST myfile.txt GOTO :NoFile

FOR /F «EOL=; TOKENS=2,3* DELIMS=, » %%i IN (myfile.txt) DO @ECHO %%i %%j %%k

ECHO myfile.txt not found!

В примере 7 во второй строке производится проверка наличия файла myfile.txt и при его отсутствии выводится сообщение. Команда FOR в третьей строке обрабатывает файл myfile.txt следующим образом:

пропускаются все строки, которые начинаются с символа точки с запятой (EOL=;);

вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми (DELIMS=,);

в теле цикла переменная %%i используется для второй подстроки, %%j — для третьей, а %%k получает все оставшиеся подстроки после третьей.

В нашем примере переменная %%i явно описана в инструкции FOR, а переменные %%j и %%k описываются неявно с помощью ключа TOKENS=. Например, если в файле myfile.txt были записаны следующие три строки:

АА BBB CCCC, DDDDD

;TTTT LLLL МММММ

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

Замечание 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

при своем выполнении выведет

Цикл FOR /F … IN (‘команда’) — (обработка строк вывода команды cmd.exe).

Для обработки строки вывода команды необходимо в скобках ввести строку вызова команды в апострофах. Строка передается для выполнения интерпретатору команд cmd.exe, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующий КФ в примере 8:

ECHO Имена переменных среды:

FOR /F «DELIMS= justify»> выведет перечень имен всех переменных среды, определенных в настоящее время в системе.

В цикле FOR допускается применение тех же синтаксических конструкций (операторов), что и для заменяемых параметров — таблица 1. Использование функции

z показано в примере 9.

Пример 9. Вычисление суммарной длины всех файлов в заданном подкаталоге

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *