310 votes

.bat

J'ai besoin d'exécuter une commande de 100 à 200 fois, et pour l'instant ma recherche indique que je voudrais soit copier/coller 100 exemplaires de cette commande, OU d'utiliser un for boucle, mais l' for boucle s'attend à une liste d'éléments, donc j'aurais besoin de 200 fichiers pour fonctionner, ou une liste de 200 articles, donc vaincre le point.

Je préfère ne pas avoir à écrire un programme C et de passer par la longueur de documenter pourquoi j'ai dû écrire un autre programme à exécuter mon programme à des fins de test. Modification de mon programme lui-même n'est pas non plus une option.

Donc, compte tenu d'une commande, <a>, comment pourrais-je exécuter N fois par le biais d'un script batch?

593voto

Jon Points 6911

for /l est votre ami:

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

Commence à 1, pas à pas et se termine à 100.

Utilisez deux % s s'il est dans un fichier de commandes

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

(qui est l'une des choses que je déteste vraiment au sujet de Windows Scripting)

Si vous avez plusieurs commandes pour chaque itération de la boucle, procédez comme suit:

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

67voto

Olivier Faucheux Points 723

Et itérer sur les fichiers d'un répertoire:

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

Vous devez utiliser "enableDelayedExpansion" et! FILENAME! au lieu de $ FILENAME $. Dans le second cas, DOS interprétera la variable une seule fois (avant qu’elle entre dans la boucle) et pas à chaque fois que le programme boucle.

6voto

Mechaflash Points 2483

Ou vous pouvez décrémenter / incrémenter une variable du nombre de fois que vous voulez boucler:

 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
 

Évidemment, en utilisant FOR /L est la route et c'est la rue principale qui prend plus de temps, mais elle arrive à la même destination.

6voto

Marcus Culver Points 95

Vous pourriez faire quelque chose à l'effet suivant en évitant la boucle 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
 

1voto

Carl Smotricz Points 36400

DOS n'offre pas très élégant mécanismes pour cela, mais je pense que vous pouvez toujours le code d'une boucle pour 100 ou 200 itérations, avec un effort raisonnable. Alors il n'y a pas un numérique, for boucle, vous pouvez utiliser une chaîne de caractères comme une "variable de boucle."

Le Code de la boucle à l'aide de GOTO, et pour chaque itération utiliser SET X=%X%@ ajouter encore un autre @ signe à un environnement variable X, et pour sortir de la boucle, de comparer la valeur de X avec une chaîne de 100 (ou 200) @ signes.

Je n'ai jamais dit que c'était élégant, mais il devrait fonctionner!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X