Пакетный цикл скриптов


275

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

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

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

Примечание: я не хочу бесконечный цикл

Например, вот как это будет выглядеть в Javascript:

var i;
for (i = 0; i < 100; i++) {
  console.log( i );
} 

Как бы это выглядело в пакетном скрипте, работающем в Windows?


Ответы:


524

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- это переменная циклов
(начальное значение, приращение значения, конечное условие [включительно])


2
Это зависит от того, насколько буквально мы должны взять ссылку «DOS». Последняя версия MS-DOS, 7.1, датируется 1997 годом, и AFAIK не имеет этих расширений. Командные оболочки, поставляемые с Windows, с другой стороны, конечно же, делают.
Карл Смотриц

8
@Imray %x- это переменная цикла, /l(не \l) означает, что команда for будет работать в числовом режиме, а не с набором файлов.
Джон

19
При запуске for /l %x in (1, 1, 100) do echo %xя получаю «х не ожидал».
LaBracca

2
@ user193655 прочитайте остаток ответа, вам нужно удвоить% s, если вы делаете это в пакетном файле.
Джон

7
% x в последнем цикле должно быть %% x.
wildpointercs

63

И для перебора файлов каталога:

@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
Спасибо за сообщение - я знаю, что это не то, о чем спрашивал ОП, но это то, что я искал, когда оказался здесь.
BrainSlugs83

24

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

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

Пример: скажите "Hello World!" 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 . . .

это единственный код цикла, который я смог использовать на своем компьютере win7. Все остальные найденные гуглом не работают.
LaBracca

2
В вашем примере я бы добавил, set /p loopcount="How many loops? "чтобы вы могли запускать его с пользовательским вводом. Это более практично.
1934286

8

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

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

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


1
Это в основном идентично ответу Маркуса Калвера . Пожалуйста, не размещайте ответы, которые не добавляют ничего нового. Спасибо!
Фабио говорит восстановить монику

Упс сры не видел этого, просто полетел, бросил его и просто увидел петли ... Извини тогда :)
BlazeLP

6

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

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- это шоссе, и это обратная улица, которая занимает больше времени, но она достигает того же пункта назначения.


5

Вы можете сделать что-то для следующего эффекта, избегая цикла 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

Вы можете сделать это без 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

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


1
вам не нужно отсроченное расширение здесь.
Стефан

2

Очень простой способ реализовать цикл в программировании 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

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

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

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


1
/aОпция в SETкоманде будет оценивать численное выражение для правой стороны значения. Смотрите документацию для SET . Нет необходимости делать конкатенационный трюк.
Адам Порад

2
для DOS, это не необходимое, так как нет set /aв DOS. К счастью, qeuration для cmd... (во время этого ответа заголовок вопроса был "цикл сценария пакетной обработки DOS"
Стефан

0

Не уверен, что такой ответ уже был отправлен, но вы можете попробовать что-то вроде этого:

@echo off
:start
set /a var+=1
if %var% EQU 100 goto end
:: Code you want to run goes here
goto start

:end
echo var has reached %var%.
pause
exit

Переменная% var% будет увеличиваться на единицу, пока не достигнет 100, после чего программа выведет, что она завершила выполнение. Опять же, не уверен, было ли это представлено или что-то подобное, но я думаю, что это может быть самым компактным.


0

Я использую это. Это примерно то же самое, что и другие, но это просто еще один способ написать это.

@ECHO off
set count=0
:Loop
if %count%==[how many times to loop] goto end
::[Commands to execute here]
set count=%count%+1
goto Loop
:end

0

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

@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]

0

Вот шаблон сценария, который я буду использовать.

@echo off
goto Loop

:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop

exit

То, что он делает, это когда он запускается, он выключает эхо, затем после этого он запускает «Петлю», но в этом месте он продолжает идти в «Петлю» (надеюсь, это помогает.)


0

совершенно безупречная петля

set num=0
:loop
:: insert code
set num=%num%+1
if %num% neq 10 goto loop
::insert after code code

Вы можете отредактировать его, изменив число 10 в строке 5 на любое число, чтобы указать, сколько раз вы хотите, чтобы оно повторялось.


-2

(Отредактировано) Я сделал это так, что он останавливается после 100 раз

@echo off
goto actual
set /a loopcount=0
:actual
set /a loopcount=%loopcount% + 1
echo %random% %random% %random% %random%
timeout 1 /nobreak>nul
if %loopcount%== 100 goto stop
goto actual
:stop
exit

Это сгенерирует 4 случайных числа за 1 секунду 100 раз. Уберите «timeout 1 / nobreak> nul», чтобы он работал очень быстро.


3
вопрос был «100 - 200 раз», а не «бесконечная петля».
Стефан

-2

Возможно использовать Goto как

@echo off
:Whatever
echo hello world
pause
echo TEST
goto Whatever

Это делает inf (бесконечный) цикл.


ну, infiniteнемного больше, чем запрошено 100-200 times, так что это не отвечает на вопрос.
Стефан

Действительно, я хотел иметь возможность циклически устанавливать определенное количество раз, чтобы мне не пришлось копировать и вставлять команду снова и снова
Том Дж. Новелл

-2

У меня есть 2 ответа Методы 1: Вставьте JavaScript в пакетном режиме

@if (@a==@b) @end /*

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Я не знаю много о JavaScript)

Способ 2: цикл в партии

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

(Спасибо FluorescentGreen5)


1
Мы ценим вашу попытку внести свой вклад, но повторение пятилетнего дословного ответа мало чем помогает и просто добавляет шума.
Стефан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.