Пакетный цикл скриптов - PullRequest
243 голосов
/ 07 апреля 2010

Мне нужно выполнить команду 100-200 раз, и пока мое исследование показывает, что мне нужно будет либо скопировать / вставить 100 копий этой команды, либо использовать цикл for, но цикл for ожидает список предметов, поэтому мне понадобится 200 файлов для работы или список из 200 предметов, чтобы победить точку.

Я бы предпочел не писать программу на С и пройти весь процесс документирования, почему мне пришлось написать другую программу для выполнения моей программы в тестовых целях. Модификация самой моей программы тоже не вариант.

Итак, учитывая команду a, как бы я ее выполнил N раз с помощью пакетного сценария?

Ответы [ 13 ]

473 голосов
/ 07 апреля 2010

for /l ваш друг:

for /l %x in (1, 1, 100) do echo %x

Начинается с 1, шаг за шагом и заканчивается на 100.

Используйте два % s, если он находится в пакетном файле

for /l %%x in (1, 1, 100) do echo %%x

(это одна из тех вещей, которые я действительно ненавижу в сценариях Windows)

Если у вас есть несколько команд для каждой итерации цикла, сделайте следующее:

for /l %x in (1, 1, 100) do (
   echo %x
   copy %x.txt z:\whatever\etc
)

или в пакетном файле

for /l %%x in (1, 1, 100) do (
   echo %%x
   copy %%x.txt z:\whatever\etc
)

Ключ:
/l означает, что команда for будет работать численно, а не над набором файлов
%x - переменная цикла
(начальное значение, приращение значения, конечное условие [включительно])

59 голосов
/ 24 февраля 2012

И для итерации по файлам каталога:

@echo off 
setlocal enableDelayedExpansion 

set MYDIR=C:\something
for /F %%x in ('dir /B/D %MYDIR%') do (
  set FILENAME=%MYDIR%\%%x\log\IL_ERROR.log
  echo ===========================  Search in !FILENAME! ===========================
  c:\utils\grep motiv !FILENAME!
)

Вы должны использовать "enableDelayedExpansion" и! FILENAME! вместо $ FILENAME $. Во втором случае DOS будет интерпретировать переменную только один раз (до того, как она войдет в цикл), а не каждый раз, когда программа зацикливается.

19 голосов
/ 10 марта 2015

Шаблон для простого, но подсчитанного цикла:

set loopcount=[Number of times]
:loop
[Commands you want to repeat]
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop

Пример: скажите "Привет, мир!" 5 раз:

@echo off
set loopcount=5
:loop
echo Hello World!
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause

Этот пример выведет:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .
6 голосов
/ 17 ноября 2016

Вы также можете попробовать это вместо цикла for:

set count=0
:loop
set /a count=%count%+1
(Commands here)
if %count% neq 100 goto loop
(Commands after loop)

Это довольно мало, и это то, что я использую все время.

6 голосов
/ 08 июня 2011

Или вы можете уменьшить / увеличить переменную на количество циклов, которое вы хотите:

SETLOCAL ENABLEDELAYEDEXPANSION
SET counter=200
:Beginning
IF %counter% NEQ 0 (
echo %x
copy %x.txt z:\whatever\etc
SET /A counter=%counter%-1
GOTO Beginning
) ELSE (
ENDLOCAL
SET counter=
GOTO:eof

Очевидно, что использование FOR /L - это шоссе, и это обратная улица, которая занимает больше времени, но она достигает того же пункта назначения.

4 голосов
/ 09 октября 2013

Вы можете сделать что-то со следующим эффектом, избегая цикла FOR.

set counter=0
:loop
echo "input commands here"
SET /A counter=%counter%+1
if %counter% GTR 200
(GOTO exit) else (GOTO loop)
:exit
exit
2 голосов
/ 25 января 2016

Вы можете сделать это без оператора for ^. ^:

@echo off
:SPINNER
SET COUNTP1=1

:1
CLS
 :: YOUR COMMAND GOES HERE
IF !COUNTP1! EQU 200 goto 2

SET COUNTP1=1
) ELSE (
SET /A COUNTP1+=1
)
goto 1

:2
:: COMMAND HAS FINISHED RUNNING 200 TIMES

Имеет базовое понимание. Просто проверь это. : P

1 голос
/ 08 ноября 2017

Очень простой способ реализации цикла в программировании cmd с использованием меток

@echo off
SET /A "index=1"
SET /A "count=5"
:while
if %index% leq %count% (
   echo The value of index is %index%
   SET /A "index=index + 1"
   goto :while
)
1 голос
/ 07 апреля 2010

DOS не предлагает очень элегантных механизмов для этого, но я думаю, что вы все равно можете кодировать цикл для 100 или 200 итераций с разумными усилиями.Хотя нет числового цикла for, вы можете использовать строку символов в качестве «переменной цикла».

Кодировать цикл с помощью GOTO, и для каждой итерации использовать SET X=%X%@, чтобы добавить еще одну @знак переменной среды X;и чтобы выйти из цикла, сравните значение X со строкой из 100 (или 200) @ знаков.

Я никогда не говорил, что это элегантно, но должно работать!

0 голосов
/ 10 ноября 2017

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

@echo off
set /a loop=1
:repeat
echo Hello World!
set /a loop=%loop%+1
if %loop%==<no. of times to repeat> (
goto escapedfromrepeat
)
goto repeat
:escapedfromrepeat
echo You have come out of the loop
pause

Но если вы более опытны с партией, я бы порекомендовал более практичный for /l %loop in (1, 1, 10) do echo %loop - лучший выбор.

             (start at 1, go up in 1's, end at 10)
for /l %[your choice] (start, step, end) do [command of your choice]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...