Цикл в файле bat: Как выполнить цикл определенное число раз в bat файле

Как выполнить цикл определенное число раз в bat файле

Windows, Windows 10, Windows 7, Windows 8, Windows Server, Windows Vista, Windows XP

  • Recluse
  • 06.05.2021
  • 9 756
  • 1
  • 10
  • 10
  • 0



  • Содержание статьи
    • Способ 1 — использование команды FOR
    • Способ 2 — использование переменной
    • Способ 3 — использование переменной
    • Комментарии к статье ( 1 шт )
    • Добавить комментарий

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

В примерах ниже, мы будем повторять цикл 8 раз, после чего произойдет завершение bat скрипта. В процессе выполнения любого из скриптов ниже, будет поочередно запущено 8 раз приложение Блокнот (Notepad).

Способ 1 — использование команды FOR

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

for /l %%x in (1, 1, 8) do (
	notepad.exe
)
pause
exit

Способ 2 — использование переменной

Еще один способ — это установить значение переменной (в нашем случае — COUNTER) равное единице, после чего увеличивать текущее значение этой переменной на единицу. Так же, следует поставить условие, что когда значение переменной достигнет 9, то следует перейти к метке end, которая в нашем случае содержит команду завершения работы. Выглядеть все это будет следующим образом:

set COUNTER=1
goto loop

:loop
if %COUNTER%==9 goto end
set /A COUNTER=COUNTER+1
notepad. exe
goto loop

:end
pause
exit

Способ 3 — использование переменной

Другой вариант предыдущего скрипта, который содержит ручную смену значения переменной на нужное значение после каждого выполнения цикла.

set COUNTER=1
goto loop

:loop
if %COUNTER%==9 goto end
if %COUNTER%==8 set COUNTER=9
if %COUNTER%==7 set COUNTER=8
if %COUNTER%==6 set COUNTER=7
if %COUNTER%==5 set COUNTER=6
if %COUNTER%==4 set COUNTER=5
if %COUNTER%==3 set COUNTER=4
if %COUNTER%==2 set COUNTER=3
if %COUNTER%==1 set COUNTER=2
notepad.exe
goto loop

:end
pause
exit

windows — Как использовать переменную цикла в .bat файла в цикле for?


Вопрос задан


Изменён
2 месяца назад


Просмотрен
408 раз

Имеется следующий код в . bat файле:

@echo off
set NAMEFILE=version
rem counting commas
set "f=%VERSION%"
set "vz=,"
set /a "z=0,n=0"
for /f "delims=" %%a in ('findstr /r /c:"\%vz%" "%f%"') do set "s=%%a"& call :#
<+ (for /f "tokens=1,2 delims==" %%b in ('more') do set /a "z+=%%b")& del+
set /a z =%z% + 1
rem цикл с проблемой
rem tokens=%%a* - часть кода, содержащая проблему
for /l %%a in (1,1,%z%) do for /f "tokens=%%a* delims=," %%i in (%NAMEFILE%) do @echo %%i>File_%%a.vers
:#
 setlocal enabledelayedexpansion 2>nul
  for %%a in ("!s:~%n%,1!") do (
   if "%%~a"=="%vz%" set /a z+=1
   if not "%%~a"=="" set /a n+=1& goto #
  )
 endlocal
exit /b

Я не знаю, что делать с tokens=%%a. Переменная %%a не видна во время выполнения (как я полагаю). Может быть проблема в символе %? Думаю, что он должен быть экранирован. Помогите, если знаете ответ.

  • windows
  • bat






6

Нельзя использовать ни delayed expansion (не знаю аналог термина на русском), ни for-parameter expansion в части параметров команды FOR (то же самое верно и для if). Это вызвано тем, как их обрабатывает пакетный парсер.

Но процентное расширение всё ещё работает. В моём пример нельзя использовать его встроенным (inline), поэтому приходится использовать вспомогательную функцию.

...
for /l %%a in (1,1,%z%) do call :helper_func %%a
...
:helper_func
for /f "tokens=%1* delims=," %%i in (%NAMEFILE%) do @echo %%i>File_%%a.vers

Выглядит странно, что в helper_func всё ещё можно использовать %%a в echo %%i>File_%%a. Это эффект того, что все используемые в данный момент параметры for видны во всех циклах for.

идея пользователя jeb

Тоже искал решение и нашел, оказалось всё просто:

Setlocal EnableDelayedExpansion
CHCP 1251
CLS
REM Организация цикла
SET BASES1C=(base1 base2 base3 base4)
FOR %%i IN %BASES1C% DO (
SET PGDATABASE=%%i
echo !PGDATABASE!
)







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки



Пакетный файл

для цикла — реализация и объяснение

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

Для синтаксиса цикла
Для примера петли
Перебор диапазона
Перебор файлов
Перебор каталогов

Цикл в основном означает непрерывное выполнение чего-либо до тех пор, пока не будет выполнено какое-то условие.

В пакетных файлах есть только прямая реализация цикла for. Не существует циклов while и do while, как в других языках программирования.

Пакетный файл для синтаксиса цикла

 FOR %%var_name IN list DO example_code 

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

Давайте возьмем пример для иллюстрации командного файла для цикла.

Пакетный файл для примера цикла

 @echo OFF
FOR %%x IN (1 2 3) DO ECHO %%x
ПАУЗА 

Здесь в этой программе у нас есть 1, 2 и 3 в списке. Таким образом, для каждого элемента списка будет выполнен цикл for и будет сгенерирован следующий вывод.

Теперь, когда мы знаем о простой реализации цикла for, давайте реализуем цикл for на следующем уровне.

Пакетный файл для цикла – перебор диапазона значений

При программировании пакетного файла цикл for также может быть реализован через диапазон значений. Ниже приведен синтаксис для реализации цикла for по диапазону значений в пакетном файле.

 FOR /L %%var_name IN (нижний предел, приращение, верхний предел) Do some_code 

Где,

  • /L означает, что цикл for используется для перебора диапазона значений
  • Нижний предел — это значение, с которого цикл будет начинаться, пока не достигнет Верхнего предела, а приращение — это значение, на которое нижний предел будет увеличиваться при каждой итерации

В следующем примере более подробно рассматривается его концепция.

 @эхо ВЫКЛ.
FOR /L %%y IN (0, 1, 3) DO ECHO %%y
PAUSE 

Теперь эта программа пройдет через диапазон от 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 

Теперь это будет проходить даже через подкаталоги внутри папки с фильмами, если они существуют.

Итак, это все о пакетном файле для циклов. Пожалуйста, отработайте каждый фрагмент кода на своем локальном компьютере для эффективного обучения.



Для — Зацикливание команд — Windows CMD

Для — Зацикливание команд — Windows CMD — SS64.com

  • SS64
  • Командная строка
  • Практическое руководство

Условно выполнить команду несколько раз.

 синтаксис-для-файлов
       FOR %%parameter IN ( набор ) DO  команда 
   
 синтаксис-FOR-Files-Rooted at Path
       FOR  /R  [[диск:]путь] %%параметр IN (  набор  ) DO  команда 
   
 синтаксис-FOR-папки
       FOR  /D  %%параметр IN (  набор_папок  ) DO  команда 
   
 синтаксис-FOR-Список чисел
       FOR  /L  %%параметр IN (начало,шаг,конец) DO  команда 
   
 синтаксис-FOR-содержимое файла
       FOR  /F  ["опции"] %%параметр IN (набор имен файлов) DO  команда 
   
       FOR  /F  ["опции"] %%параметр IN ("Текстовая строка для обработки") DO  команда 
   
 синтаксис-FOR-Command Результаты
       FOR  /F  ["параметры"] %%параметр IN ("команда для обработки") DO  команда  

Действие команды FOR можно резюмировать как. ..

  • Взять набор данных
  • Сделать параметр FOR %%G равным некоторой части этих данных
  • Выполните команду (необязательно используя параметр как часть команды).
  • Повторить для каждого элемента данных

Если вы используете команду FOR в командной строке, а не в пакетной программе, используйте только один знак процента: %G вместо %%G .

ДЛЯ Параметры

Первый параметр должен быть определен с помощью одного символа, например буквы G.

FOR %%G IN …

В каждой итерации цикла FOR предложение IN ( ….) оценивается, и %%G устанавливается в другое значение

Если это предложение приводит к одному значению затем %%G устанавливается равным этому значению, и команда выполняется.

Если предложение приводит к нескольким значениям, то для каждого из них неявно определяются дополнительные параметры. Они автоматически назначаются в алфавитном порядке %%H %%I %%J . .. (неявное определение параметра)

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

Конечно, вы можете выбрать любую букву алфавита, кроме %%G.

%%G — хороший выбор, поскольку он не конфликтует ни с одной из букв формата имени пути (a, d, f, n, p, s, t, x) и обеспечивает самый длинный набор неконфликтующих букв для использования. как неявные параметры.
G > H > I > J > K > L > M
Буквы формата чувствительны к регистру, поэтому использование заглавной буквы также является хорошим способом избежать конфликтов %%A, а не %%a.

Если вам нужно много букв параметров, полный список от младших до старших:
> ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ˆ _ ` a b c d e ж g h i j k l m n o p q r s t u v w x y z { | }

Начиная с %A, вы можете использовать 29 символов, прежде чем вам придется экранировать любые знаки препинания. [источник]

Использование переменных в цикле FOR

Переменные расширяются в начале цикла FOR и не обновляются до тех пор, пока не будет завершена вся секция DO.
В следующем примере подсчитываются файлы в текущей папке, но %count% всегда возвращает 1:

.

@эхо от
УСТАНОВИТЬ количество = 1
FOR /f «tokens=*» %%G IN (‘dir /b’) DO (
эхо %count%:%%G
набор /количество+=1 )

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

@эхо выкл
УСТАНОВИТЬ количество = 1
FOR /f «tokens=*» %%G IN (‘dir /b’) DO (вызов : подпрограмма «%%G» )
GOTO: eof

: подпрограмма
эхо %count%:%1
установить /количество+=1
ПЕРЕЙТИ: eof

Вложенные команды FOR

FOR команды могут быть вложенными FOR %%G… DO (для %%U… do …)
при размещении команд выберите разные буквы для каждой части. тогда ты сможешь
обратитесь к обоим параметрам в окончательной команде DO.

Пример выхода из внутреннего цикла двух вложенных циклов FOR см. на странице ВЫХОД.

Уровни ошибок

FOR сам по себе не устанавливает и не сбрасывает уровень ошибки, оставляя это на усмотрение вызываемой команды .
Единственным исключением является использование подстановочного знака, если подстановочный знак не соответствует ни одному файлу, то FOR вернет %ERRORLEVEL% = 5

.

FOR — это внутренняя команда.
Если расширения команд отключены, команда FOR будет
поддерживают только базовый синтаксис без расширенных переменных:
FOR %%parameter IN (set) DO command [параметры команды]

Примеры

FOR /F «tokens=1-5» %%A IN («Это короткое предложение») DO @echo %%A %%B %%D

приведет к выводу: Это короткое

Создайте набор из 26 папок, по одной на каждую букву алфавита:

ДЛЯ %%G IN (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v ,w,x,y,z) DO (md C:\demo\%%G)

«Тот, кто не помнит прошлого, обречен на его повторение» — Джордж Сантаяна

Связанные команды:

FOR — Зациклить набор файлов в одной папке.