Циклы bat: Команда FOR в BAT файле. Пример числового цикла и цикла перебора файлов.
Команда FOR в BAT файле. Пример числового цикла и цикла перебора файлов.
Команда for в виде числового цикла
Команда for позволяет организовать выполнение повторяющихся однотипных действий. Можно использовать ее для того, чтобы вывести на экран числа от одного до десяти, как показано на следующем листинге.
for /l %%i in (1,1,10) do echo %%i
Переменная i называется счетчиком цикла. В силу своеобразия синтаксиса команды for, имя счетчика цикла должно состоять из одной буквы. Причем, если мы пишем командный файл, то перед именем счетчика цикла надо поставить сдвоенный знак процента, если же мы просто набираем команду в командной строке, то одиночный.
Логика работы этой команды такова. После слова in указан диапазон изменения счетчика цикла. В данном варианте команды это тройка чисел: начальное значение счетчика, шаг счета, предельное значение счетчика. При выполнении команды командный процессор сначала присвоит переменной i значение 1, а потом на каждом шаге цикла будет увеличивать его на 1, пока оно не превысит 10. Очевидно, таких шагов получится десять. Если бы в качестве шага счета мы указали число 2, то цикл выполнился бы пять раз. На каждом шаге цикла выполняется тело цикла, написанное после слова do. В приведенном примере это команда echo, которая выводит на экран текущее значение счетчика цикла.
Команда for для перебора файлов
Обычно команда for используется для перебора и обработки файлов. Надо сказать, что в достаточно простых случаях массовая обработка файлов выполняется с помощью подстановочных символов. Если, мы хотим всем файлам в текущем каталоге заменить расширение .htm на .html, мы вводим команду ren *.htm *.html. Но если то же самое надо сделать не в одном каталоге, а в дереве каталогов, то без команды for не обойтись. Приведенный ниже командный файл выполняет эту операцию для всех htm-файлов в подкаталоге website текущего каталога. Точнее, во всем дереве каталогов, которое находится внутри website.
for /r website %%i in (*.htm) do ren %%i %%~ni.html
Ключ /r указывает на необходимость обхода каталога website и всех его внутренностей. Если его не указать (но тогда и каталог указывать не разрешается), то обработаны будут только файлы в текущем каталоге. Диапазоном значений счетчика цикла в данном варианте команды является множество всех файлов с расширением .htm, находящихся внутри каталога (точнее, дерева) website. Странная на первый взгляд запись ~ni означает, что из значения переменной i требуется выделить только имя файла. В языке команд MS-DOS предусмотрено несколько таких модификаторов, например, запись ~хi обозначает расширение файла. Все модификаторы описаны в справке по команде for.
Тело цикла может состоять из нескольких команд, заключенных в скобки.
@echo off
for /r website %%i in (*.htm) do (
rem Выводим имя файла
echo %%i
rem Переименовываем файл
ren %%i %%~ni.html
)
Перебор директорий
В том виде, в котором команда for перебирает файлы в директории, она не способна перебрать директории в нужной директории (т. е. видит только файлы). Нужно пользоваться другим синтаксисом.
for /r «C:\test» /d %%i in (*) do (
echo Name of folder: %%i
copy D:\filesKLIENT\Kontragent\111.grs «%%i»
)
Или с помощью фильтрации вывода команды dir:
for /f «delims=» %%i in (dir /b /s /a:d «C:\test») do (
echo Name of folder: %%i
copy D:\filesKLIENT\Kontragent\111.grs «%%i»
)
Команда FOR задает запуск некоторой команды для каждого файла из заданного множества. Информация для данной статьи взята с сайта Microsoft.
Работу команды for можно охарактеризовать так:
Синтаксис
for {%переменная | %%переменная} in (множество) do команда [ПараметрыКоманднойСтроки]
<>Параметры
{%переменная | %%переменная} Обязательный параметр. Замещаемый параметр. Используйте %переменная для выполнения команды for из командной строки. Используйте %%переменная для выполнения команды for в пакетном файле. В переменных учитывается регистр и они могут быть представлены буквами, например %A, %B или %C. (множество) Обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстоваых строк, подлежащих обработке заданной командой. Скобки являются обязательными. команда Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога, диапазона значений или текстовой строки, включенной в указанный параметр (множество). ПараметрыКоманднойСтроки Задает параметры командной строки, которые используются с указанной командой. /? Отображение справки в командной строке.
Заметки
[Примеры]
В пакетных файлах используется следующий синтаксис для команды for: Чтобы отобразить содержимое всех файлов, имеющих разрешение DOC или TXT, в текущем каталоге с помощью заменяемой переменной %f, введите следующую команду: В предыдущем примере каждый файл с расширением .doc или .txt в текущем каталоге будет подставляться вместо переменной %f, пока не будет выведено содержимое всех файлов. Для использования этой команды в пакетном файле нужно заменить каждую команду %f на %%а. В противном случае переменная игнорируется и выводится сообщение об ошибке. Чтобы произвести разбор файла, игнорируя комментарии, можно использовать следующую команду: Данная команда производит разбор каждой строки в файле Myfile.txt, игнорируя строки, начинающиеся с точки с запятой, и передает второй и третий элементы из каждой строки в тело цикла команды FOR. Элементы разделяются запятыми или пробелами. Тело инструкции FOR использует %i для получения второго элемента, %j для получения третьего элемента и %k для получения оставшихся элементов в строке. Если имена файлов содержат пробелы, их следует заключать в кавычки (например, «ИмяФайла»). Для использования кавычек необходима команда usebackq. В противном случае кавычки рассматриваются как определение символьной строки для разбора. Переменная %i объявлена явно в инструкции FOR. Переменные %j и %k объявлены явно при использовании tokens=. С помощью tokens= можно указать до 26 элементов, если это не вызовет попытки объявить переменную с именем, большим буквы «z» или «Z». Для разбора вывода команды с помощью помещения параметра МножествоИменФайлов в скобки можно использовать следующую команду (пример выводит список имен всех переменных окружения): Ищем в директориях файлы с расширением html содержащие строку google:
FOR /L
Внутри командного файла в качестве параметра используйте %%G, а в командной строке %G (такие уж Микрософт придумал правила). (20,-5,10) будет генерить последовательность 20 15 10, а (1,1,5) последовательность 1 2 3 4 5.
Пример
Можно использовать нечисловой список, например:
[Другие команды for]
FOR — цикл по всем файлам в одной директории (исключая её подкаталоги) syntax-FOR-Files
[Связанные с for команды]
FORFILES (w2003 Server) — выборка списка файлов из директории для отображения или использования при обработке в bat-файле [Equivalent Linux BASH commands]
for — Expand words, and execute commands
[Условные обозначения форматирования]
[Ссылки]
1. Практические приемы программирования в bat-файлах. |
Как зациклить выполнение команды в bat-файле?
Windows
- Bot
- 25.01.2020
- 2 461
- 0
- 23.04.2020
- 8
- 8
- 0
- Содержание статьи
Описание
Иногда необходимо создать bat-файл, который будет запускать некую команду через определённый интервал времени. Для решения этой задачи можно воспользоваться Планировщиком и часто запускать bat-файл из него, а можно создать в bat-файле цикл с паузой.
Инструкция
Цикл организуется следующим образом:
:loop
...
Паузу можно создать несколькими способами. В операционных системах Windows Vista, и более новых, для этого существует команда timeout:
timeout /t 5
где параметр /t
— это время ожидания в секундах.
Другая команда, которую можно использовать для данной цели (например, в Windows XP, в которой еще не присутствовала команда timeout), это команда ping:
ping -n 1 -w 100000 192.168.254.254 >nul
-n 1
— выполнить один запрос-w 100000
— ждать ответа 100 секунд (значение указывается в миллисекундах), меняете это значение на то, которое нужно вам192.168.254.254
— IP адрес, который заведомо не существует в локальной сети, т.е. никогда не ответит на ping, поэтому команда будет выполняться до достижения таймаута>nul
— перенаправление всего вывода команды ping в никуда.
Кроме этого, существует утилита sleep, которая выполняет те же функции, что и команда timeout. Данная утилита не входит в стандартный состав ни одной операционной системы Windows, и устанавливается из дополнительного пакета программного обеспечения «Windows Server 2003 Resource Kit Tools» на любую операционную систему Windows. Скачать данный пакет можно с сайта Microsoft, или нашего зеркала на Яндекс.Диск.
Использование программы sleep очень простое:
sleep 5
где цифра 5 обозначает время ожидания в 5 секунд.
FOR — организация циклической обработки
Команда FOR используется для выполнения команды, заданной в виде параметра, для каждого элемента из набора. В качестве элементов могут
использоваться файлы, каталоги, наборы строк.
Формат командной строки:
FOR %переменная IN (набор) DO команда [параметры]
Параметры:
%переменная — Однобуквенный подставляемый параметр.
(набор) — Определяет набор, состоящий из одного или нескольких
элементов, обрабатываемых командой.
команда — Команда, которую следует выполнить для каждого элемента набора.
параметры — Параметры для команды, выполняемой по отношению к элементам набора.
.
В пакетных файлах для команды FOR используется запись
%%переменная вместо %переменная. Имена переменных
учитывают регистр букв (%i отличается от %I).
Поддерживаются также дополнительные форма команды FOR:
FOR /D %переменная IN (набор) DO команда [параметры]
Ключ /D задает в качестве набора имена каталогов (не файлов).
FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]
Ключ /R задает выполнение команды для каталога [диск:]путь, а также для всех
подкаталогов этого пути. Если после ключа /R не указано имя
каталога, используется текущий каталог. Если набор — это
одиночный символ точки (.), команда просто перечисляет дерево каталогов.
FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]
Ключ /L задает обработку набора из последовательности чисел с заданными
началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) — в (5 4 3 2 1)
FOR /F [«ключи»] %переменная IN (набор-файлов) DO команда [параметры]
FOR /F [«ключи»] %переменная IN («строка») DO команда [параметры]
FOR /F [«ключи»] %переменная IN (‘команда’) DO команда [параметры]
Ключ /F задает обработку файлов, строковых значений или результатов стандартного вывода другой команды. Набор файлов — содержит имена одного или нескольких файлов,
которые по очереди открываются, читаются и обрабатываются.
Обработка состоит в чтении файла, разбивке его на отдельные
строки текста и разборе каждой строки в ноль или более подстрок.
Затем вызывается тело цикла «for», при выполнении которого
каждая найденная подстрока используется в качестве значения
переменной. По умолчанию ключ /F выделяет из каждой строки
каждого файла первую отделенную пробелами подстроку. Пустые
строки в файле пропускаются. Необязательный параметр «ключи»
служит для переопределения правил разбора по умолчанию. Он
представляет собой заключенную в кавычки строку, содержащую
одно или несколько ключевых слов для определения параметров
разбора. Ключевые слова:
eol=символ — знак начала комментария в конце строки ( признак конца обрабатываемых данных строки). Задается в виде одиночного символа.
skip=n — число пропускаемых при обработке строк от начала
файла.
delims=xxx — набор разделителей между обрабатываемыми элементами строк. По
умолчанию, в качестве разделителей используются пробелы и знаки табуляции.
tokens=x,y,m-n — номера подстрок из каждой строки, передаваемые в тело
цикла «for» для каждой итерации. Например, для обычного текстового файла, подстроками будут слова, а разделителями подстрок — пробелы или знаки табуляции. При использовании этого ключа выделяются дополнительные имена переменных. Формат m-n представляет собой диапазон подстрок с номерами от m по n. Если последний знак
в строке tokens= является звездочкой, то создается
дополнительная переменная, значением которой будет
весь оставшийся текст в строке после разбора
последней подстроки.
usebackq — режим обработки кавычек. Строка,
заключенная в обратные кавычки, выполняется как
команда, строка, заключенная в прямые одиночные
кавычки, является строкой символов, а двойные
кавычки могут использоваться для задания имен
файлов, содержащих пробелы.
Поясняющий пример:
FOR /F «eol=; tokens=2,3* delims=, » %i in (myfile.txt) do @echo %i %j %k
Выполняется разбор файла myfile.txt. Все строки, которые
начинаются с символа точки с запятой (eol=; ), пропускаются. Вторая и
третья подстроки из каждой строки ( tokens=2,3 ) передаются в тело цикла «for», причем
подстроки разделяются запятыми и/или пробелами.
В теле цикла переменная %i принимает значение второй
подстроки, %j — третьей, а %k — все оставшееся
поле до конца строки после третьей подстроки . Имена файлов, содержащие пробелы,
необходимо заключать в двойные кавычки. Чтобы использовать
двойные кавычки, необходимо использовать параметр usebackq,
иначе двойные кавычки будут восприняты как определение
строки-литерала для разбора.
В данном примере переменная %i явно объявлена в инструкции «for», а переменные
%j и %k объявляются неявно с помощью ключа tokens= .
Ключ tokens= позволяет извлечь из одной строки файла до
26 подстрок. Следует помнить, что имена переменных FOR являются однобуквенными,
с учетом регистра, поэтому одновременно не может быть активно более 52 переменных, задаваемых как явно, так и неявно.
Команда FOR /F может также использоваться для обработки
явно заданной строки, заключенной в одиночные кавычки и
указанной в качестве параметра в скобках. Она будет разобрана
так же, как одиночная строка, считанная из входного файла.
В качестве обрабатываемого набора, также,
может быть использован вывод ( выходные
данные ) другой команды. В этом случае используется
в качестве параметра в скобках строка в обратных одиночных
кавычках . Эта строка передается для выполнения дочернему
обработчику команд CMD.EXE, а вывод этой команды
сохраняется в памяти и разбирается так, как если бы это
был файл. Пример:
FOR /F «usebackq delims==» %i IN (`set`) DO @echo %i,
Выполняется команда SET, отображающая значения переменных среды и команда FOR /F выведет их перечень с использованием команды echo .
В команде FOR возможно использование ссылок на переменные.
Допускается применение следующих синтаксических конструкций:
%~I — из переменной %I удаляются обрамляющие кавычки («)
%~fI — переменная %I расширяется до полного имени файла
%~dI — из переменной %I выделяется только имя диска
%~pI — из переменной %I выделяется только путь к файлу
%~nI — из переменной %I выделяется только имя файла
%~xI — из переменной %I выделяется расширение имени файла
%~sI — полученный путь содержит только короткие имена
%~aI — переменная %I расширяется до атрибутов файла
%~tI — переменная %I расширяется до даты /времени файла
%~zI — переменная %I расширяется до размера файла
%~$path:I — проводится поиск по каталогам, заданным в переменной среды path, и переменная %I заменяется на полное имя первого найденного файла.
Если переменная path не определена или в результате поиска не найден ни один файл, то этот модификатор заменяется на пустую строку.
При объединении нескольких операторов можно получить следующие результаты:
~dpI — переменная I раскрывается в имя диска и путь
~nxI — переменная I раскрывается в имя файла и его расширение
~fsI — переменная I раскрывается в полный путь с короткими именами
~dp$path:I — проводится поиск по каталогам, заданным в переменной среды path, и переменная I раскрывается в имя диска и путь к первому найденному файлу.
~ftzaI — переменная I раскрывается в строку, подобную выдаваемой командой DIR
В приведенных выше примерах переменные I и path можно
заменить на другие допустимые значения. Синтаксическая
конструкция с символами ~ заканчивается допустимым именем
переменной цикла FOR.
Для имен переменных рекомендуется использовать заглавные
буквы, например —I, что делает эту конструкцию более удобной
для чтения и предотвращает ошибочное принятие их за
модификаторы, которые не различают регистр.
При использовании команды FOR в командных файлах, если внутри цикла нужно выполнить более одной команды, то они заключаются в скобки:
FOR %переменная IN (набор) DO (
команда1 [параметры]
команда2
. . .
)
Пример:
@echo OFF
for /L %%I in (1,1,5) DO (
echo FIRST%%I
ECHO LAST%%I
)
Обычно, в командных файлах команда FOR используется не только для разбора данных, но и их обработки, что требует использования переменных внутри цикла FOR. И здесь возникает проблема — изменения значений переменных не происходит, т.е. их применение внутри скобок невозможно. Подобное явление вызвано не логическими предпосылками, а всего лишь определенными особенностями реализации командного процессора CMD.EXE, и это нужно обязательно учитывать при обработке переменных внутри циклов команд FOR и IF. Другими словами, использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON, что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака (!) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF. Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:
Setlocal EnableDelayedExpansion
После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки. Синтаксически, использование обоих разделителей допускается, но результаты этого использования будут разными, что наглядно демонстрируется следующим командным файлом:
Setlocal EnableDelayedExpansion
@ECHO OFF
set VAR=before
if «%VAR%» == «before» (
set VAR=after
if «!VAR!» == «after» @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR!
)
Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым ( тем, что было установлено до входа в цикл команды FOR ).
Данная особенность реализации командного процессора Windows нередко приводит к неожиданным результатам при использовании групп команд, объединенных скобками в конструкциях FOR и IF и тогда, когда значение какой-либо переменной изменяется внутри цикла с одной командой. Например, для получения списка файлов текущего каталога такой командный файл работать не будет:
set LIST=
for %%i in (*) do set LIST=%LIST% %%i
echo %LIST%
Вроде бы, логически все верно, но не учтена особенность обработки значений переменных. Значение переменной LIST внутри цикла команды FOR изменено не будет, оно останется пустым ( задано командой SET LIST= ), каким и было на начало цикла FOR. Команда SET LIST= %LIST% %%I должна в каждом цикле менять значение переменной LIST на текущее, плюс символ пробела, и плюс текущее значение переменной I, которое принимает значение имени файла в текущем каталоге. Синтаксически, команда верная, но из-за озвученной выше особенности реализации командного процессора — не работает, и значение переменной LIST не изменяется. Для того, чтобы это произошло, командный файл нужно изменить, таким же образом, как и в примере для группы команд:
Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%
Теперь, значение переменной LIST внутри цикла FOR будет
изменяться, последовательно принимая значения имен файлов, разделенных
пробелом ( set LIST=!LIST! %%i).
Эту особенность реализации CMD нужно учитывать и при использовании значений системных переменных внутри циклов, как например, переменной ERRORLEVEL:
IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0
Весь список команд CMD Windows
окон — цикл пакетного скрипта
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
окон — как сделать цикл в пакетном режиме?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
Пакетный файл для цикла — реализация и объяснение
В этом руководстве вы узнаете о пакетном файле для цикла . Аналогично операторам if else, циклы также используются для изменения логики программы.
Цикл в основном означает прохождение чего-либо непрерывно, пока не будет выполнено какое-либо условие.
В пакетных файлах есть прямая реализация только цикла for. Не существует циклов while и do while, как в других языках программирования.
Пакетный файл для синтаксиса цикла
FOR %% var_name IN list DO example_code
Здесь список — это значения, для которых будет выполняться цикл for. В пакетном файле для циклов следует отметить одну вещь: объявление переменной выполняется с %% var_name
вместо % var_name%
.
Давайте рассмотрим пример для иллюстрации командного файла для цикла.
Пакетный файл для примера цикла
@ эхо ВЫКЛ.
FOR %% x IN (1 2 3) DO ECHO %% x
ПАУЗА
Здесь, в этой программе, в списке есть 1, 2 и 3.Итак, для каждого элемента списка будет выполнен цикл for и будет сгенерирован следующий результат.
Теперь, когда мы знаем о простой реализации цикла for, давайте перейдем к следующему уровню цикла for.
Пакетный файл для цикла — цикл по диапазону значений
При программировании пакетных файлов цикл for также может быть реализован с помощью диапазона значений. Ниже приведен синтаксис для реализации цикла for для диапазона значений в пакетном файле.
FOR / L %% var_name IN (нижний предел, приращение, верхний предел) Выполните some_code
Где,
- / L означает, что цикл for используется для перебора диапазона значений
- Нижний предел — это значение, с которого цикл будет начинаться до тех пор, пока он не достигнет верхнего предела, а приращение — это значение, с которым нижний предел будет увеличиваться во время каждой итерации
В следующем примере более подробно рассматривается его концепция.
@ эхо ВЫКЛ.
FOR / L %% y IN (0, 1, 3) DO ECHO %% y
ПАУЗА
Теперь эта программа будет проходить диапазон от 0 до 3, увеличивая значение на 1 на каждой итерации.
Выход
Пакетный файл для цикла — просмотр файлов
До сих пор в цикле for мы использовали «%%», за которым следовала одна буква. Но чтобы перебирать файлы с помощью цикла for, мы должны использовать «%», за которым следует одна буква, например% y.
Итак, вот синтаксис или, возможно, пример цикла for для просмотра файлов в определенном месте.
FOR% y IN (D: \ movie \ *) DO @ECHO% y
Это позволит просмотреть все файлы в папке с фильмами в D: и отобразить файлы в консоли вывода.
Пакетный файл для цикла — просмотр каталогов
Для просмотра каталогов используется «/ D /». Это показано в следующем примере.
FOR / D% y IN (D: \ movie \ *) DO @ECHO% y
Теперь это будет проходить даже через подкаталоги внутри папки фильма, если они существуют.
Итак, это все о пакетном файле для циклов. Пожалуйста, попробуйте каждый фрагмент кода на вашем локальном компьютере для эффективного обучения.
.
окон — как сделать цикл while в пакете
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.