Как создать бесконечный цикл в командном файле Windows?

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

while(true){
    Do Stuff
    Pause
}

Похоже, что доступны только for петли и нет while петель в пакете. Как мне тогда создать бесконечный цикл?


person sooprise    schedule 30.03.2011    source источник
comment
Вы спрашиваете о пакетном файле Windows / DOS?   -  person thkala    schedule 30.03.2011
comment
Да, извините за расплывчатость, сделаю дополнение к ОП.   -  person sooprise    schedule 30.03.2011
comment
+1 ой, я написал, не заметив другого ответа!   -  person PA.    schedule 30.03.2011
comment
Вы можете использовать For Command или ссылку   -  person    schedule 22.08.2019


Ответы (6)


Как насчет использования старого доброго (?) goto?

:loop

echo Ooops

goto loop

См. Также более полезный пример this.

person thkala    schedule 30.03.2011
comment
ничего хорошего: D иногда быстрее, но никогда не хорошо: D хорошо, есть только одно хорошее место для goto - в самом низком программировании x) - person jave.web; 14.08.2013
comment
Я согласен с jave.web, вам следует использовать предложенный ниже цикл for. Вы почти никогда не должны использовать goto в своем коде, даже если это сценарий. Гото был крутым в 80-е в дни GW Basic. - person DoodleKana; 23.08.2014
comment
Я не согласен с jave.web - в goto нет ничего плохого, если вы используете его правильно. Например, я собираюсь использовать его, чтобы гарантировать, что программа, выполняемая в цикле, автоматически возрождается, если она умирает по какой-либо причине. Однако может быть разумным поставить небольшое ожидание в цикл, чтобы остановить перегрузку процессора, если моя программа по какой-то причине мгновенно умирает. - person John Hunt; 17.06.2015
comment
@theonlygusti Не работает как однострочная команда, как и следовало ожидать :lbl & echo Ooops & goto lbl; но комментарий @Nicholi ниже: FOR /L (1,0,2) DO @echo Oops - person JimB; 23.09.2015
comment
@JimB ваша команда имеет (1 was unexpected at this time. ошибку, я думаю, так лучше: stackoverflow.com/a/8846529/1407491 - person Nabi K.A.Z.; 30.12.2017
comment
@ NabiK.A.Z. Виноват! Несколько опечаток, должно быть FOR /L %N IN (1,0,2) DO ECHO %N. Исходный был прав. В пакетном файле требуется FOR \L %%N . Мне нравится этот за его простоту. - person JimB; 31.12.2017

Неограниченный цикл в однострочной команде для использования в cmd окнах:

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

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

person Nabi K.A.Z.    schedule 30.12.2017
comment
Чтобы использовать это в пакетном файле, введите: FOR / L %% N IN () DO @echo Oops - person phrogg; 07.03.2018
comment
Это недооцененный ответ. Спасибо! - person var firstName; 15.10.2018
comment
Просто следите за запуском команд, которые немедленно завершаются, что гораздо чаще в Windows, чем в Linux :-D - person Martin Pecka; 02.10.2020

Действительно бесконечный цикл, считающий от 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, потому что цикл for полностью кэшируется один раз при запуске.

person jeb    schedule 30.03.2011
comment
Приятно, потому что он также работает, просто набрав его в командной строке. for / L% n в (1,0,2) do @ echo.hi, ребята - person Nicholi; 09.07.2012
comment
Хотелось бы, чтобы у этого решения было немного больше объяснений. - person Nelda.techspiress; 01.08.2019

читать help GOTO

и попробовать

:again
do it
goto again
person PA.    schedule 30.03.2011

Еще один лучший способ сделать это:

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

Таким образом, вы тоже можете позаботиться об ошибках

person Julito Sanchis    schedule 13.04.2017

Вот пример использования цикла:

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 или пустого ввода.

person user1147015    schedule 13.01.2012