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

Как зациклить пакетный скрипт только определенное количество раз (x10 или что-то в этом роде)? Если код был:

@echo off                                                                     
:loop1                                                                              
Start taskmgr.exe                                                       
Goto loop                                                                         
:loop2                                                                             
Start cmd.exe                                                                 
goto loop2     

Как зациклить loop1 и несколько раз и перейти к loop2?

Любой полезный ответ будет оценен :)


person user2838763    schedule 02.10.2013    source источник
comment
возможный дубликат цикл для цикла %x% раз в пакете   -  person Jon Carlstedt    schedule 02.10.2013


Ответы (5)


если вы откроете командное окно и наберете FOR /? это даст вам команду, которую вы ищете.

FOR /L %variable IN (start,step,end) DO command [command-parameters]

The set is a sequence of numbers from start to end, by step amount.
So (1,1,5) would generate the sequence 1 2 3 4 5 and (5,-1,1) would
generate the sequence (5 4 3 2 1)
person Fred    schedule 02.10.2013

По причине, которую я игнорирую, команда FOR не будет работать для зацикливания определенной метки. Например (могу ошибаться):

@echo off
for /L %%a in (1,1,2) do (
goto loop
)

:loop
echo this won't loop for 2 times.

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

Вот пример:

@echo off
set loop=0
:loop
echo hello world
set /a loop=%loop%+1 
if "%loop%"=="2" goto next
goto loop

:next
echo This text will appear after repeating "hello world" for 2 times.

Выход:

hello world
hello world
This text will appear after repeating "hello world" for 2 times.

Объяснение:

  • set loop=0 устанавливает значение переменной loop в 0;
  • set /a loop=%loop%+1 добавляет 1 каждый раз, когда метка :loop повторяется.
  • if "%loop%"=="2" goto next проверяет, равна ли переменная loop 2 (поэтому повторилось 2 раза); если он равен, то он будет идти к метке :next, иначе он будет идти к метке :loop.
person Edoardo Fiocchi    schedule 23.01.2017
comment
в вашем первом вырезанном коде замените goto loop на call :loop (примечание: : не является обязательным для goto, но он нужен call), и он будет работать. - person Stephan; 16.06.2019

Вот пример:

@echo off                                                                     
for /L %%a in (1,1,10) do (
Start taskmgr.exe          
)                                             

for /L %%a in (1,1,10) do (                                                        
Start cmd.exe                                                                 
)
person foxidrive    schedule 02.10.2013

@echo off
set /a a=1
goto loop
:loop
echo looped %a% times so far
set /a a=%a%+1
if %a%=10 (
echo looped a total of %a% times
)

Вы также можете использовать эту команду:

@echo off
for /l %%a in (1,1,10) do (
rem %%a is a variable and starts at a value of 1, steps by 1 and ends at a value of 10
start "Command Prompt #%%a Opened" cmd
rem eg Command Prompt #1 Opened
rem eg Command Prompt #2 Opened
rem etc
)

который открывает командную строку с заголовком «Командная строка #%%a открыта». rem — это команда, которую вы можете использовать для записи комментарии.

person user11655794    schedule 16.06.2019
comment
оба метода были предложены много лет назад. Как ваш ответ добавляет дополнительную ценность? - person Stephan; 16.06.2019
comment
Я просто использую пример из некоторых моих пакетных файлов. - person user11655794; 20.06.2019
comment
@Stephan не было такого примера с for и ссылкой на переменную цикла - person Lu55; 04.03.2021

Попробуй это:

@echo off
set loopvar=1
:repeat
if %loopvar% gtr 5 (goto :done) else (set /a loopvar=%loopvar%+1 && echo Loop && goto :repeat)
:done

Под :done напишите код, который вы хотите сделать после цикла. Обязательно замените пять количеством раз, которое вы хотите, чтобы цикл повторялся. Для задержки в цикле попробуйте следующее:

@echo off
set loopvar=1
:repeatwithdelay
if %loopvar% gtr 5 (goto :done) else (set /a loopvar=%loopvar%+1 && timeout /T 1 >nul && echo Loop && goto :repeatwithdelay)

Надеюсь, это помогло!

person DCT A    schedule 05.01.2021