Loop de script em lote


275

Preciso executar um comando de 100 a 200 vezes e, até agora, minha pesquisa indica que eu teria que copiar / colar 100 cópias desse comando, OU usar um forloop, mas o forloop espera uma lista de itens, portanto, eu precisaria 200 arquivos para operar ou uma lista de 200 itens, derrotando o ponto.

Eu preferiria não ter que escrever um programa em C e percorrer toda a documentação porque eu tive que escrever outro programa para executar meu programa para fins de teste. A modificação do meu programa em si também não é uma opção.

Então, dado um comando, acomo eu o executaria por Nmeio de um script em lote?

Nota: eu não quero um loop infinito

Por exemplo, aqui está como seria em Javascript:

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

Como seria um script em lote em execução no Windows?


Respostas:


524

for /l é seu amigo:

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

Começa em 1, passos por um e termina em 100.

Use dois %s se estiver em um arquivo em lotes

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

(que é uma das coisas que eu realmente odeio nos scripts do Windows)

Se você tiver vários comandos para cada iteração do loop, faça o seguinte:

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

ou em um arquivo em lotes

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

Chave:
/lindica que o forcomando operará de maneira numérica, em vez de operar em um conjunto de arquivos
%xé a variável de loops
(valor inicial, incremento de valor, condição final [inclusive])


2
Isso depende de quão literalmente devemos usar a referência "DOS". A versão mais recente do MS-DOS, 7.1, data de 1997 e o AFAIK não possui essas extensões. Os shells de comando entregues com o Windows, por outro lado, é claro.
Carl Smotricz

8
@Imray %xé a variável do loop, /l(not \l) significa que o comando for irá operar de maneira numérica, em vez de operar em um conjunto de arquivos.
Jon

19
Ao executar, for /l %x in (1, 1, 100) do echo %xrecebo "x não esperado".
LaBracca 23/03

2
@ user193655 leia o restante da resposta, você precisará dobrar o% s se estiver fazendo isso em um arquivo em lotes.
23415 Jon

7
% x no último loop deve ser %% x.
wildpointercs

63

E para iterar nos arquivos de um diretório:

@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!
)

Você deve usar "enableDelayedExpansion" e! FILENAME! em vez de $ FILENAME $. No segundo caso, o DOS interpretará a variável apenas uma vez (antes de entrar no loop) e não sempre que o programa fizer um loop.


19
Obrigado por postar isso - eu sei que não é o que o OP estava pedindo, mas era o que eu estava procurando quando acabei aqui.
precisa saber é o seguinte

24

Modelo para um loop simples, mas contado:

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

Exemplo: Diga "Olá, mundo!" 5 vezes:

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

Este exemplo produzirá:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .

este é o único código de loop que eu pude usar no meu pc win7. Todos os outros encontrados pelo googleing não funcionam.
LaBracca 23/03

2
No seu exemplo, eu acrescentaria set /p loopcount="How many loops? "para que você possa executá-lo com a entrada do usuário. É mais prático.
1934286

8

Você também pode tentar isso em vez de um forloop:

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

É bem pequeno e é o que eu uso o tempo todo.


1
Isso é basicamente idêntico à resposta de Marcus Culver . Não poste respostas que não adicionem nada de novo. Obrigado!
Fabio diz Restabelecer Monica

Ups sry não viu que, voou jogou e viu apenas para loops ... Sinto muito, então :)
BlazeLP

6

Ou você pode diminuir / incrementar uma variável pelo número de vezes que deseja fazer um 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

Obviamente, usar FOR /Lé a estrada e essa é a rua que leva mais tempo, mas chega ao mesmo destino.


5

Você pode fazer algo no seguinte efeito, evitando o loop 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

Você pode fazer isso sem uma fordeclaração ^. ^:

@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

Tem entendimento básico. Apenas faça um teste. : P


1
você não precisa de expansão atrasada aqui.
Stephan

2

Maneira muito básica de implementar loop na programação cmd usando rótulos

@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

O DOS não oferece mecanismos muito elegantes para isso, mas acho que você ainda pode codificar um loop para 100 ou 200 iterações com esforço razoável. Embora não haja um forloop numérico , você pode usar uma cadeia de caracteres como uma "variável de loop".

Codifique o loop usando GOTO e, para cada iteração, SET X=%X%@adicione outro @sinal a uma variável de ambiente X; e para sair do loop, compare o valor de X com uma sequência de 100 (ou 200) @sinais.

Eu nunca disse que isso era elegante, mas deveria funcionar!


1
A /aopção do SETcomando avaliará uma expressão numérica para o valor do lado direito. Veja a duplicação para SET . Não é necessário executar o truque de concatenação.
Adam Porad 13/09/13

2
para o DOS, é necessário, pois não existe set /ano DOS. Felizmente o qeustion é para cmd... (no momento desta resposta, o título pergunta era "DOS loop de script em lotes"
Stephan

0

Não tenho certeza se uma resposta como essa já foi enviada ainda, mas você pode tentar algo como isto:

@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

A variável% var% aumentará em um até atingir 100, onde o programa emitirá a conclusão de execução. Novamente, não tenho certeza se isso foi enviado ou algo parecido, mas acho que pode ser o mais compacto.


0

Eu uso isso. É quase a mesma coisa que as outras, mas é apenas outra maneira de escrevê-lo.

@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

A resposta realmente depende de como você está familiarizado com o lote, se você não tem tanta experiência, eu recomendaria incrementar uma variável de loop:

@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

Mas se você tem mais experiência com lotes, eu recomendaria o mais prático for /l %loop in (1, 1, 10) do echo %loopé a melhor escolha.

             (start at 1, go up in 1's, end at 10)
for /l %[your choice] (start, step, end) do [command of your choice]

0

Aqui está um script de modelo que vou usar.

@echo off
goto Loop

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

exit

O que isso faz é que, quando é iniciado, ele desativa o eco e, em seguida, executa o "Loop", mas nesse local continua o "Loop" (espero que isso ajude.)


0

um loop completamente sem falhas

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

você pode editá-lo alterando 10 na linha 5 para qualquer número para representar quantas vezes deseja que ele faça um loop.


-2

(EDITADO) Eu fiz isso para que parasse depois de 100 vezes

@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

Isso irá gerar 4 números aleatórios a cada 1 segundo 100 vezes. Retire o "timeout 1 / nobreak> nul" para torná-lo super rápido.


3
a pergunta era "100 - 200 vezes", não "loop sem fim".
Stephan

-2

Provavelmente use goto como

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

Isso faz um loop inf (infinito).


bem, infiniteé um pouco maior que o solicitado 100-200 times, então isso não responde à pergunta.
Stephan

Na verdade, eu queria poder repetir um número definido de vezes, para não precisar copiar e colar um comando repetidamente
Tom J Nowell

-2

Eu tenho 2 respostas Métodos 1: Inserir Javascript no lote

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Eu não sei muito sobre JavaScript)

Método 2: loop no lote

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

(Obrigado FluorescentGreen5)


1
Agradecemos sua tentativa de contribuir, mas repetir uma resposta de cinco anos literalmente não ajuda muito e apenas acrescenta ruído.
Stephan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.