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

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

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

  • Recluse
  • 06.05.2021
  • 15 091
  • 1
  • 16
  • 16
  • 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

Команда 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»

)

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

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

В этом руководстве вы узнаете о пакетном файле для цикла . Точно так же, если операторы 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 — Пока цикл в пакетном режиме

У меня есть трюк для этого!

Я придумал этот метод, потому что в CLI невозможно использовать методы, представленные в других ответах здесь, и это всегда меня беспокоило.

Я называю это «Выполнение до перерыва» или «Бесконечный» цикл:

Базовый пример

 FOR /L %L IN (0,0,1) DO @(
 ЭХО. Счетчик всегда 0, см. «%L» = «0» — Ожидание доли секунды и ping -n 1 127.0.0.1>NUL )
 

Это действительно бесконечный цикл!

Это полезно для мониторинга чего-либо в окне CMD и позволяет вам использовать CTRL + C , чтобы сломать его, когда вы закончите.

Хотите иметь счетчик?

Либо используйте SET /A ИЛИ Вы можете изменить цикл FOR /L , чтобы он выполнял подсчет и оставался бесконечным (Обратите внимание, ОБА этих метода имеют 32-битное целочисленное переполнение)

SET /A Метод :

 FOR /L %L IN (0,0,1) DO @(
 НАБОР /A "#+=1"&ЭХО.  L по-прежнему равно 0, см. "%L = 0"! - Ожидание доли секунды &ping -n 1 127.0.0.1>NUL )
 

Собственный FOR /L Счетчик:

 FOR /L %L IN (-2147483648,1,2147483648) DO @(
 ECHO.Current значение L: %L - Ожидание доли секунды &ping -n 1 127.0.0.1>NUL )
 

Подсчет наборов 4294967295 и отображение текущего значения L:

 FOR /L %L IN (1,1,2147483648) DO @(
 (
  ЕСЛИ %L EQU 0 УСТАНОВИТЬ /A "#+=1">NUL
 )&SET /A "#+=0"&ECHO. Наборы 4294967295 - Текущее значение L: %L - Ожидание доли секунды &ping -n 1 127.0.0.1>NUL )
 

Однако, что, если:

  • Вы заинтересованы в просмотре вывода монитора и обеспокоены тем, что я превыслю лимит буфера в 9999 строк, прежде чем проверю его после его завершения.
  • Вы хотели бы предпринять некоторые дополнительные действия после того, как Вещь, которую я отслеживаю, будет завершена.

Для этого я определил, как использовать пару методов, чтобы прервать цикл FOR , преждевременно эффективно превратив его в цикл « DO WHILE » или « DO DO », которого в противном случае очень не хватает в CMD.

ПРИМЕЧАНИЕ. Большую часть времени цикл будет продолжать итерацию после того, как вы проверили условие, часто это желательное поведение, но не в нашем случае.

Превратите «бесконечный цикл» в цикл «

DO WHILE » / « DO UNTIL UNTIL » и, подумав, может ли быть «более правильный» метод для достижения этого, я рекомендую использовать Новый метод!

Новый метод (можно использовать внутри сценариев CMD без выхода из сценария):

 FOR /F %%A IN ('
  CMD /C "FOR /L %%L IN (0,1,2147483648) DO @(ECHO.%%L & IF /I %%L EQU 10 (выход /b))"
') ДЕЛАТЬ @(
  ЭХО %%~A
)
 

В CLI:

 FOR /F %A IN ('
  CMD /C "FOR /L %L IN (0,1,2147483648) DO @( ECHO.%L & IF /I %L EQU 10 ( выход /b ) )"
') ДЕЛАТЬ @(
  ЭХО %~A
)
 

Исходный метод (Прекрасно работает в CLI, но закрывает скрипт.)

 FOR /L %L IN (0,1,2147483648) DO @(
  ECHO.Current значение L: %L - Ожидание доли секунды &ping -n 1 127. 0.0.1>NUL&(
    ЕСЛИ /I %L ЭКВ 10 (
      ЭХО. Разорвать петлю! Потому что мы выполнили условие!&DIR >&0
    )
  )
) 2>НУЛ
 

Older Post Stuff

Случайно я наткнулся на некоторые способы преждевременного выхода из циклов, которые не закрывали подсказку CMD при попытке сделать что-то другое, что натолкнуло меня на эту идею.

ПРИМЕЧАНИЕ:

В то время как ECHO.>&3 >NUL работало для меня в некоторых сценариях, я играл с этим время от времени на протяжении многих лет и обнаружил, что DIR >&0 >NUL был гораздо более последовательным.

Я переписываю этот ответ отсюда и вперед, чтобы использовать этот метод вместо этого, поскольку я недавно нашел старую заметку для себя, чтобы использовать этот метод вместо этого.

Отредактированное сообщение с лучшим методом:

 DIR >&0 >NUL
 

Параметр >NUL необязателен, я просто предпочитаю, чтобы он не выводил ошибку.

Я предпочитаю, когда это возможно, сопоставлять inLine, как вы можете видеть в этом очищенном примере команды, которую я использую для мониторинга миграций LUN в нашей VNX.

 для /л %L IN (0,0,1) DO @(
   ЭХО.& ЭХО.==========================================& (
     [Командная команда VNX] | FINDSTR /R /C:"Имя исходного LU" /C:"Состояние:" /C:"Время" || НАПРАВЛЕНИЕ >&0 >НУЛ
   ) & Ping -n 10 1.1.1.1 -w 1000>NUL )
 

Кроме того, у меня есть еще один метод, который я нашел в этой заметке для себя, и который я только что повторно протестировал, чтобы подтвердить, что он работает в CLI так же хорошо, как и другой метод.

По-видимому, когда я впервые опубликовал здесь, я разместил более старую итерацию, с которой я играл, вместо двух более новых, которые работают лучше:

В этом методе мы используем EXIT /B для выхода из цикла For, но мы не хотим выходить из CLI, поэтому мы заключаем его в сеанс CMD:

 FOR /F %A IN ('CMD /C "FOR /L %L IN (0,1,10000000) DO @( ECHO. %L & IF /I %L EQU 10 ( выход /b ) )" ') DO @(ECHO %~A)
 

Поскольку сам цикл происходит в сеансе CMD, мы можем использовать EXIT /B для выхода из итерации цикла без потери нашего сеанса CMD и без ожидания завершения цикла, почти так же, как и в другом методе.