Як створити нескінченний цикл у пакетному файлі Windows?


160

Це в основному те, що я хочу в пакетному файлі. Я хочу мати можливість повторно запускати "Do Stuff" кожного разу, коли натискаю будь-яку клавішу, щоб пройти повз "Пауза".

while(true){
    Do Stuff
    Pause
}

Схоже, доступні лише forпетлі, а whileциклів у партії немає. Як тоді створити нескінченну петлю?


4
Ви питаєте про пакетний файл Windows / DOS?
thkala

Так, вибачте, що розпливчасто, я внесу доповнення до ОП.
зачіп

1
+1 ooops, я розмістив, не помічаючи іншої відповіді!
ПА.

Ви можете використовувати For Commandабо посилання
scientist_7

Відповіді:


289

Як щодо використання хороших (?) Старих goto?

:loop

echo Ooops

goto loop

Дивіться також це для більш корисного прикладу.


немає добра: D іноді швидше, але ніколи добре: D ок, є лише одне хороше місце для goto - у найнижчому програмуванні x)
jave.web

Я згоден з jave.web, ви повинні використовувати пропозицію для циклу нижче. Ви майже ніколи не повинні використовувати goto у своєму коді, навіть якщо це сценарій. Goto було круто ще в GW Basic дні в 80-х.
DoodleKana

А з cmd-підказки?
theonlygusti

13
Я не згоден з jave.web - у Goto немає нічого поганого, якщо ви правильно його використовуєте. Наприклад, я збираюся використати його для забезпечення програми, яка запускається в циклі автоматичного відновлення, якщо вона загине з будь-якої причини. Однак може бути розумним покласти невелике зачекання в циклі, щоб перестати лунати процесором, якщо моя програма вмирає з якоїсь причини.
Джон Хант

1
@theonlygusti Не працює як однорядкова команда, як ви очікували :lbl & echo Ooops & goto lbl; але коментар @Nicholi нижче :FOR /L (1,0,2) DO @echo Oops
JimB

77

Необмежений цикл в однорядковій команді для використання у cmdWindows:

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

введіть тут опис зображення


7
Використовувати це у пакетному файлі: FOR / L %% N IN () DO @echo Oops
Phil Roggenbuck

Це недооцінена відповідь. Дякую!
var firstName

63

Справді нескінченна петля, що нараховує від 1 до 10 з кроком у 0.
Для досягнення 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

Це може бути корисно, якщо вам потрібен дійсно нескінченний цикл, оскільки це набагато швидше, ніж goto :loopверсія, оскільки фор-цикл кешується повністю один раз при запуску.


17
Приємно, тому що він також працює просто набравши його в командному рядку. for / L% n in (1,0,2) do @echo. "привіт, хлопці"
Ніколі

Побажання цього рішення мало трохи більше пояснень.
Nelda.techspiress


4

Ще один кращий спосіб зробити це:

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

Таким чином ви можете піклуватися і про помилки


1

Ось приклад використання циклу:

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

Це проста партія, яку я використовую, коли мені потрібно зашифрувати будь-яке повідомлення в хеш md5 в Windows (потрібен openssl), і програма лояльно повторить себе, за винятком заданих Ctrl + C або порожнього вводу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.