Пакетный цикл скриптов
Мне нужно выполнить команду 100-200 раз, и пока мое исследование показывает, что мне нужно будет либо скопировать / вставить 100 копий этой команды, либо использовать for
петля, но for
Цикл ожидает список элементов, поэтому мне потребуется 200 файлов для работы или список из 200 элементов, чтобы победить точку.
Я бы предпочел не писать программу на С и пройти весь процесс документирования, почему мне пришлось написать другую программу для выполнения моей программы в тестовых целях. Модификация самой моей программы тоже не вариант.
Итак, учитывая команду, a
как бы это выполнить N
раз через пакетный скрипт?
19 ответов
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
переменная циклов
(начальное значение, приращение значения, конечное условие [включительно])
И для перебора файлов каталога:
@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 будет интерпретировать переменную только один раз (до того, как она войдет в цикл), а не каждый раз, когда программа зацикливается.
Шаблон для простого, но подсчитанного цикла:
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 . . .
Вы также можете попробовать это вместо for
цикл:
set count=0
:loop
set /a count=%count%+1
(Commands here)
if %count% neq 100 goto loop
(Commands after loop)
Это довольно мало, и это то, что я использую все время.
Или вы можете уменьшить / увеличить переменную на количество циклов, которое вы хотите выполнить:
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
это шоссе, и это переулок, который занимает больше времени, но он добирается до того же пункта назначения.
Вы можете сделать что-то для следующего эффекта, избегая цикла 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
Очень простой способ реализовать цикл в программировании 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
)
Полностью безупречный шлейф
set num=0
:loop
:: insert code
set num=%num%+1
if %num% neq 10 goto loop
::insert after code code
вы можете отредактировать его, изменив 10 в строке 5 на любое число, чтобы указать, сколько раз вы хотите, чтобы он повторялся.
Вы можете сделать это без 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
У него есть базовое понимание. Просто проверь это.:П
DOS не предлагает очень элегантных механизмов для этого, но я думаю, что вы все равно можете кодировать цикл для 100 или 200 итераций с разумными усилиями. Пока нет числового for
цикл, вы можете использовать символьную строку в качестве "переменной цикла".
Код цикла, используя GOTO, и для каждой итерации используйте SET X=%X%@
добавить еще один @
войдите в переменную окружения X; и чтобы выйти из цикла, сравните значение X со строкой 100 (или 200) @
приметы.
Я никогда не говорил, что это элегантно, но это должно сработать!
Я использую это. Это примерно то же самое, что и другие, но это просто еще один способ написать это.
@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
Ответ на самом деле зависит от того, насколько вы знакомы с пакетом, если вы не очень опытны, я бы порекомендовал увеличить переменную цикла:
@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]
Не уверен, что такой ответ уже был отправлен, но вы можете попробовать что-то вроде этого:
@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, после чего программа выведет, что она завершила выполнение. Опять же, не уверен, что это было представлено или что-то подобное, но я думаю, что это может быть самым компактным.
Используйте последовательность для цикла
for i in `seq 1 100`
do
echo $i
done
ИспользоватьFOR /l
и обязательно используйте%%
вместо%
Это избавит вас от головной боли.
И попробуйте установить петлю.
Вот шаблонный сценарий, который я буду использовать.
@echo off
goto Loop
:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop
exit
При запуске он отключает эхо, после чего запускает "Loop", но в этом месте продолжает переходить в "Loop" (надеюсь, это поможет).
У меня есть 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)
Вероятно, используйте goto как
@echo off
:Whatever
echo hello world
pause
echo TEST
goto Whatever
Это делает бесконечный (бесконечный) цикл.
(Отредактировано) Я сделал это так, что он останавливается после 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", чтобы он работал очень быстро.