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

160

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

while(true){
    Do Stuff
    Pause
}

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

sooprise
источник
4
Вы спрашиваете о пакетном файле Windows / DOS?
Thkala
Да, извините за расплывчатость, я сделаю дополнение к ФП.
сюрприз
1
+1 опа, я выложил, не заметив другого ответа!
ПА.
Вы можете использовать For Commandили Link
scientist_7

Ответы:

289

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

:loop

echo Ooops

goto loop

Смотрите также это для более полезного примера.

thkala
источник
не хорошо: D иногда быстрее, но никогда не хорошо: D хорошо, есть только одно хорошее место для goto - в самом низком программировании x)
jave.web
Я согласен с jave.web, вы должны использовать предложение цикла for ниже. Вы почти никогда не должны использовать goto в своем коде, даже если это сценарий. Гото был крут в далёкие дни в 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 Упс
Фил Роггенбак,
Это недооцененный ответ. Спасибо!
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версия, потому что цикл for полностью кэшируется один раз при запуске.

Джеб
источник
17
Хорошо, потому что он также работает, просто набрав его в командной строке. for / L% n в (1,0,2) do @echo. "Привет, ребята"
Nicholi
Жаль, что у этого решения было немного больше объяснения.
Nelda.techspiress
19

читать help GOTO

и попробуйте

:again
do it
goto again
PA.
источник
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 или пустого ввода.

user1147015
источник