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

от admin

How to create an infinite loop in Windows batch file?

This is basically what I want in a batch file. I want to be able to re-run «Do Stuff» whenever I press any key to go past the «Pause».

Looks like there are only for loops available and no while loops in batch. How do I create an infinite loop then?

6 Answers 6

How about using good(?) old goto ?

See also this for a more useful example.

Unlimited loop in one-line command for use in cmd windows:

A really infinite loop, counting from 1 to 10 with increment of 0.
You need infinite or more increments to reach the 10.

This could be useful if you need a really infinite loop, as it is much faster than a goto :loop version because a for-loop is cached completely once at startup.

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

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

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

Читать:
Sharp sj p48n где находится нагнетательная трубка

выведет имена и путь ко всем файлам с расширением .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 %%

Похожие статьи