Как сделать бесконечный цикл в 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. Вычисление суммарной длины всех файлов в заданном подкаталоге