วิธีสร้างลูปแบบไม่สิ้นสุดในไฟล์แบตช์ Windows


160

นี่คือสิ่งที่ฉันต้องการในไฟล์แบตช์ ฉันต้องการที่จะสามารถเรียกใช้ "ทำสิ่งที่" อีกครั้งเมื่อใดก็ตามที่ฉันกดปุ่มใด ๆ เพื่อไปผ่าน "หยุด"

while(true){
    Do Stuff
    Pause
}

ดูเหมือนว่ามีเพียงforลูปเท่านั้นและไม่มีwhileลูปในแบทช์ ฉันจะสร้างวงวนไม่สิ้นสุดได้อย่างไร


4
คุณถามเกี่ยวกับไฟล์แบตช์ Windows / DOS หรือไม่?
thkala

ใช่ขอโทษที่คลุมเครือฉันจะเพิ่มภาคผนวกของ OP
sooprise

1
+1 แล้วฉันโพสต์โดยไม่สังเกตคำตอบอื่น!
PA

คุณสามารถใช้For Commandหรือเชื่อมโยง
scientist_7

คำตอบ:


289

วิธีการเกี่ยวกับการใช้ที่ดี (?) เก่าgoto?

:loop

echo Ooops

goto loop

ดูสิ่งนี้เพื่อเป็นตัวอย่างที่มีประโยชน์มากขึ้น


ไม่ดี: D บางครั้งเร็วกว่า แต่ไม่ดี: D ตกลงมีเพียงที่เดียวที่ดีสำหรับ goto - ในการเขียนโปรแกรมต่ำสุด x)
jave.web

ฉันเห็นด้วยกับ jave.web คุณควรใช้สำหรับข้อเสนอแนะวนรอบด้านล่าง คุณไม่ควรใช้ goto ในรหัสของคุณแม้จะเป็นสคริปต์ Goto กลับมาเจ๋งอีกครั้งใน GW Basic days in 80s
DoodleKana

และจากคำสั่ง cmd?
theonlygusti

13
ฉันไม่เห็นด้วยกับ jave.web - ไม่มีอะไรผิดปกติกับ goto ถ้าคุณใช้มันอย่างถูกต้อง ตัวอย่างเช่นฉันกำลังจะใช้มันเพื่อให้แน่ใจว่าโปรแกรมที่ทำงานภายในลูป auto-respawns ถ้ามันตายด้วยเหตุผลใดก็ตาม อย่างไรก็ตามอาจเป็นการดีที่จะรอสักครู่เพื่อหยุด cpu thrashing หากโปรแกรมของฉันตายทันทีด้วยเหตุผลบางอย่าง
John Hunt

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 โอ๊ะโอ
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รุ่นมากเนื่องจาก for-loop ถูกแคชอย่างสมบูรณ์เมื่อเริ่มต้น


17
ดีมากเพราะมันใช้งานได้แค่พิมพ์ที่ command command สำหรับ / L% n ใน (1,0,2) ทำ @echo "hi guys"
Nicholi

หวังว่าโซลูชันนี้จะมีคำอธิบายเพิ่มเติมอีกเล็กน้อย
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 หรืออินพุตว่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.