Necesito ejecutar un comando de 100 a 200 veces, y hasta ahora mi investigación indica que iba a tener que copiar/pegar 100 copias de este comando, O el uso de un for bucle, pero la for bucle de espera de una lista de elementos, por lo tanto necesitaría 200 archivos de operar, o una lista de 200 elementos, derrotando al punto.

Preferiría no tener que escribir un programa en C y vaya a través de la longitud de documentar por qué tenía que escribir otro programa para ejecutar mi programa para los propósitos de la prueba. La modificación de mi programa en sí es también una opción.

Así, dado un comando, a, ¿cómo puedo ejecutar N veces a través de una secuencia de comandos por lotes?

InformationsquelleAutor Tom J Nowell | 2010-04-07

14 Comentarios

  1. 492

    for /l es tu amigo:

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

    Comienza en 1, los pasos de uno, y termina en 100.

    Utilizar dos %s si es en un archivo de proceso por lotes

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

    (que es una de las cosas que realmente odio de secuencias de comandos de windows)

    Si usted tiene varios comandos para cada iteración del bucle, hacer esto:

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

    o en un archivo por lotes

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

    Clave:

    /l denota que la for comando funcionará en una numérico de la moda, en lugar de operar sobre un conjunto de archivos

    %x es la bucles variable

    (valor inicial, incremento de valor, la condición final[incluido] )

    • Mucho mejor que mi solución, siempre estamos hablando de un razonablemente moderno DOS.
    • Espero que en el 2010, que al menos podría asumir NT Extensiones de Comando están presentes 😛
    • Eso depende de cómo, literalmente, vamos a tomar el «DOS» de referencia. La última versión de MS-DOS, 7.1, se remonta a 1997, y AFAIK no tiene estas extensiones. Los shells de comandos se entrega con Windows, por otro lado, es evidente que hacer.
    • Estoy usando esto para ejecutar un juego en varias ocasiones con un proyecto personal de la mina de carga, junto con algunas estadísticas de generación de código. Debía pensar en alguien que puede ejecutar con un NT o de una versión posterior de windows no tener una oportunidad en la ejecución de mucho más en estos días
    • Puede usted explicar lo que significa esto exactamente? Por ejemplo, lo que %x? \l?
    • es la variable de bucle, /l (no \l) significa que el comando funcionará en una numérico de la moda, en lugar de operar sobre un conjunto de archivos.
    • Mediante la ejecución de for /l %x in (1, 1, 100) do echo %x me sale «x no se espera».
    • leer el resto de la respuesta, se necesitan el doble de la %s si usted está haciendo esto en un archivo de proceso por lotes.
    • ¿Por qué es que dos % es necesario si se utiliza un archivo de proceso por lotes?
    • No tengo ni idea, tendrías que preguntar a Microsoft.
    • %x en el último bucle debe ser %%x.
    • eso dependerá de si se encuentran en un archivo por lotes o no…
    • leer la salida de «ayuda» en su favorito de dos/win shell. Esto le dirá a todos. (Y si no, «para» no está presente.)
    • Agradable, Jon. Cómo hacer para powershell?
    • Si desea ejecutar varias líneas de código y una de esas líneas contiene paréntesis () a continuación, puede ejecutar en problemas y la necesidad de acudir a un método loop.
    • ejecutando el comando anterior, se está dando siguiente mensaje de error en la consola, «x fue inesperado, en este momento»
    • % tiene un significado especial en archivos de proceso por lotes. Supongo %% es necesario para evitar el carácter al procesar el archivo de proceso por lotes [ver a esta respuesta](stackoverflow.com/a/382312/773334]

  2. 61

    Y para iterar sobre los archivos de un directorio:

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

    Debe utilizar «enableDelayedExpansion» y !Nombre de archivo! en lugar de $FILENAME$. En el segundo caso, DOS interpretar la variable sólo una vez (antes de entrar en el bucle) y no cada vez que el programa de bucles.

    • Gracias por publicar esto … sé que no es lo que el OP estaba pidiendo, pero es lo que yo estaba buscando cuando acabé aquí.
  3. 19

    Plantilla para un simple pero contado de bucle:

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

    Ejemplo: Decir «Hola Mundo!» 5 veces:

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

    Este ejemplo de salida:

    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Press any key to continue . . .
    
    • Casi a la misma respuesta se da ya
    • Nada malo con eso, si es por escrito mejor
    • este es el único código de bucle que era capaz de usar mi pc win7. Todos los otros encontrados por googleing no funcionan.
    • En tu ejemplo, me gustaría añadir set /p loopcount="How many loops? " por lo que se puede ejecutar con la entrada del usuario. Es más práctico.
  4. 7

    También puede intentar esto en lugar de un for bucle:

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

    Es muy pequeño y es lo que yo uso todo el tiempo.

    • Esto es básicamente idéntica a la de Marcus Culver respuesta. Por favor, no publicar las respuestas que no aportan nada nuevo. Gracias!
    • Ups sry no ver que, simplemente voló la tiró y sólo vio bucles for… Im sorry entonces 🙂
  5. 6

    O puede decremento/incremento de una variable por el número de veces que desea repetir:

    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, el uso de FOR /L es la autopista y esta es la backstreet que lleva más tiempo, pero se llega al mismo destino.

  6. 4

    Se podría hacer algo para el siguiente efecto de evitar el bucle 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
    
  7. 2

    Usted puede hacer esto sin un for declaración ^.^:

    @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
    

    Tiene una comprensión básica. Acaba de dar una prueba de. 😛

    • usted no necesita expansión retardada aquí.
    • También su if construcción no se está trabajando.
  8. 2

    Manera muy básica para implementar un bucle en el cmd de programación mediante el uso de etiquetas

    @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
    )
    
  9. 1

    DOS no ofrece muy elegante mecanismos para esto, pero creo que todavía se puede codificar un bucle de 100 o 200 iteraciones con un esfuerzo razonable. Si bien no hay una numérico for bucle, puede utilizar una cadena de caracteres como una «variable de bucle.»

    Código del bucle usando GOTO, y para cada iteración uso SET X=%X%@ para agregar otro @ firmar a un entorno variable X; y para salir del bucle, comparar el valor de X con una cadena de 100 (o 200) @ signos.

    Nunca me dijo que este era elegante, pero debería funcionar!

    • El /a opción de la SET comando evaluar una expresión numérica para el lado derecho de valor. Ver el doucmentation para JUEGO. No es necesario hacer la concatenación truco.
    • para los DOS, que está es necesario, ya que no hay set /a de DOS en DOS. Por suerte, el qeustion es para cmd… (en el momento de esta respuesta, la pregunta del título fue «DOS lotes de secuencia de comandos de bucle»
  10. 0

    No está seguro de si una respuesta como esta ya ha sido presentado todavía, pero puedes intentar algo como esto:

    @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
    

    La variable %var% aumentará en uno hasta que llegue a 100, donde el programa de salidas que ha terminado de ejecutarse. De nuevo, no se si esto ha sido presentado o algo por el estilo, pero creo que puede ser la más compacta.

  11. 0

    Yo uso este. Es casi lo mismo que los otros, pero eso es sólo otra manera de escribir.

    @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
    
  12. 0

    La respuesta realmente depende de cómo se familiarice con el lote, si no son tan experimentados, yo recomendaría el incremento de una variable de bucle:

    @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
    

    Pero si usted tiene más experiencia con el lote, yo recomendaría el más práctico for /l %loop in (1, 1, 10) do echo %loop es la mejor opción.

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

    (EDITADO) lo hice así para que se detiene después de 100 veces

    @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
    

    Esto generará 4 números aleatorios cada vez de 1 segundo de 100 veces.
    Sacar el «tiempo de espera de 1 /nobreak>nul» para hacer que se vaya super rápido.

    • la pregunta era «100 – 200 veces», no «bucle infinito».

Dejar respuesta

Please enter your comment!
Please enter your name here