Comment créer une boucle infinie dans un fichier batch Windows?

160

C'est essentiellement ce que je veux dans un fichier batch. Je veux pouvoir relancer "Do Stuff" chaque fois que j'appuie sur n'importe quelle touche pour dépasser la "Pause".

while(true){
    Do Stuff
    Pause
}

On dirait qu'il n'y a que des forboucles disponibles et aucune whileboucle par lot. Comment puis-je créer une boucle infinie alors?

sooprise
la source
4
Demandez-vous un fichier batch Windows / DOS?
thkala
Ouais, désolé d'être vague, je vais faire un addendum au PO.
sooprise
1
+1 ooops, j'ai posté sans remarquer l'autre réponse!
PA.
Vous pouvez utiliser For CommandOr Link
scientist_7

Réponses:

289

Que diriez-vous d'utiliser du bon (?) Vieux goto?

:loop

echo Ooops

goto loop

Voir aussi ceci pour un exemple plus utile.

Thkala
la source
pas bon: D parfois plus rapide mais jamais bon: D ok il n'y a qu'une seule bonne place pour goto - dans la programmation la plus basse x)
jave.web
Je suis d'accord avec jave.web, vous devriez utiliser la suggestion de boucle for ci-dessous. Vous ne devriez presque jamais utiliser goto dans votre code, même s'il s'agit de scripts. Goto était cool à l'époque de GW Basic dans les années 80.
DoodleKana
Et de l'invite cmd?
theonlygusti
13
Je ne suis pas d'accord avec jave.web - il n'y a rien de mal à goto si vous l'utilisez correctement. Par exemple, je suis sur le point de l'utiliser pour m'assurer que le programme qui est exécuté dans la boucle réapparaît automatiquement s'il meurt pour une raison quelconque. Il peut cependant être judicieux de mettre une petite attente dans la boucle pour arrêter le battement du processeur si mon programme meurt instantanément pour une raison quelconque.
John Hunt
1
@theonlygusti Ne fonctionne pas comme une commande sur une ligne, comme vous vous en doutez :lbl & echo Ooops & goto lbl; mais le commentaire de @Nicholi ci-dessous fait :FOR /L (1,0,2) DO @echo Oops
JimB
77

Boucle illimitée dans la commande en une ligne pour une utilisation dans cmdWindows:

FOR /L %N IN () DO @echo Oops

entrez la description de l'image ici

Nabi KAZ
la source
7
Pour utiliser cela dans un fichier batch, tapez: FOR / L %% N IN () DO @echo Oops
Phil Roggenbuck
C'est une réponse sous-évaluée. Je vous remercie!
var firstName
63

Une boucle vraiment infinie, comptant de 1 à 10 avec incrément de 0.
Vous avez besoin d'incréments infinis ou plus pour atteindre le 10.

for /L %%n in (1,0,10) do (
  echo do stuff
  rem ** can't be leaved with a goto (hangs)
  rem ** can't be stopped with exit /b (hangs)
  rem ** can be stopped with exit
  rem ** can be stopped with a syntax error
  call :stop
)

:stop
call :__stop 2>nul

:__stop
() creates a syntax error, quits the batch

Cela pourrait être utile si vous avez besoin d'une boucle vraiment infinie, car elle est beaucoup plus rapide qu'une goto :loopversion car une boucle for est complètement mise en cache une fois au démarrage.

jeb
la source
17
Bien car cela fonctionne également en le tapant simplement à l'invite de commande. for / L% n in (1,0,2) do @echo. "salut les gars"
Nicholi
Je souhaite que cette solution ait un peu plus d'explications.
Nelda.techspiress
19

lis help GOTO

et essaye

:again
do it
goto again
PENNSYLVANIE.
la source
4

Une autre meilleure façon de le faire:

:LOOP
timeout /T 1 /NOBREAK 
::pause or sleep x seconds also valid
call myLabel
if not ErrorLevel 1 goto :LOOP

De cette façon, vous pouvez également vous occuper des erreurs

Julito Sanchis
la source
1

Voici un exemple d'utilisation de la boucle:

echo off
cls

:begin

set /P M=Input text to encode md5, press ENTER to exit: 
if %M%==%M1% goto end

echo.|set /p ="%M%" | openssl md5

set M1=%M%
Goto begin

C'est le lot simple que j'utilise lorsque j'ai besoin de crypter un message dans le hachage md5 sur Windows (openssl requis), et le programme se répéterait fidèlement sauf si Ctrl + C ou entrée vide.

user1147015
la source