Batch script loop


275

ฉันต้องดำเนินการคำสั่ง 100-200 ครั้งและจนถึงขณะนี้การวิจัยของฉันระบุว่าฉันจะต้องคัดลอก / วาง 100 สำเนาของคำสั่งนี้หรือใช้forวง แต่forห่วงคาดว่ารายการของรายการดังนั้นฉันจะต้อง 200 ไฟล์ที่จะใช้งานหรือรายการ 200 รายการเอาชนะจุด

ฉันไม่ต้องการเขียนโปรแกรม C และทำตามความยาวของเอกสารว่าทำไมฉันต้องเขียนโปรแกรมอื่นเพื่อรันโปรแกรมของฉันเพื่อการทดสอบ การปรับเปลี่ยนโปรแกรมของฉันเองก็ไม่ใช่ตัวเลือก

ดังนั้นเมื่อได้รับคำสั่งaฉันจะรันมันอย่างไรNผ่านสคริปต์แบทช์

หมายเหตุ: ฉันไม่ต้องการวงวนไม่สิ้นสุด

ตัวอย่างเช่นนี่คือสิ่งที่ดูเหมือนใน Javascript:

var i;
for (i = 0; i < 100; i++) {
  console.log( i );
} 

ดูเหมือนว่าในสคริปต์ชุดงานที่ทำงานบน Windows


คำตอบ:


524

for /l เป็นเพื่อนของคุณ:

for /l %x in (1, 1, 100) do echo %x

เริ่มต้นที่ 1, ขั้นตอนโดยหนึ่งและเสร็จสิ้นที่ 100

ใช้สอง%s หากอยู่ในไฟล์แบตช์

for /l %%x in (1, 1, 100) do echo %%x

(ซึ่งเป็นหนึ่งในสิ่งที่ฉันเกลียดจริงๆเกี่ยวกับการเขียนสคริปต์ windows)

หากคุณมีหลายคำสั่งสำหรับการวนซ้ำแต่ละครั้งให้ทำดังนี้

for /l %x in (1, 1, 100) do (
   echo %x
   copy %x.txt z:\whatever\etc
)

หรือในไฟล์แบตช์

for /l %%x in (1, 1, 100) do (
   echo %%x
   copy %%x.txt z:\whatever\etc
)

คีย์:
/lหมายถึงว่าforคำสั่งจะทำงานในรูปแบบตัวเลขแทนที่จะใช้งานกับชุดของไฟล์
%xคือตัวแปรลูป
(ค่าเริ่มต้น, การเพิ่มค่า, เงื่อนไขสิ้นสุด [รวม])


2
ขึ้นอยู่กับว่าเราจะใช้อ้างอิง "DOS" อย่างแท้จริงอย่างไร รุ่นล่าสุดของ MS-DOS, 7.1, ย้อนหลังไปถึงปี 1997 และ AFAIK ไม่มีส่วนขยายเหล่านี้ แน่นอนว่าคำสั่ง shells มาพร้อมกับ Windows ในทางกลับกัน
Carl Smotricz

8
@Imray %xเป็นตัวแปรลูป/l(ไม่ใช่\l) หมายความว่าคำสั่ง for จะทำงานในรูปแบบตัวเลขแทนที่จะใช้กับชุดของไฟล์
Jon

19
โดยเรียกใช้for /l %x in (1, 1, 100) do echo %xฉันได้รับ "x ไม่ได้คาดหวัง"
LaBracca

2
@ user193655 อ่านคำตอบที่เหลือคุณต้องเพิ่ม% s ซ้ำถ้าคุณทำสิ่งนี้ในไฟล์แบตช์
Jon

7
% x ในลูปสุดท้ายควรเป็น %% x
wildpointercs

63

และทำซ้ำในไฟล์ของไดเรกทอรี:

@echo off 
setlocal enableDelayedExpansion 

set MYDIR=C:\something
for /F %%x in ('dir /B/D %MYDIR%') do (
  set FILENAME=%MYDIR%\%%x\log\IL_ERROR.log
  echo ===========================  Search in !FILENAME! ===========================
  c:\utils\grep motiv !FILENAME!
)

คุณต้องใช้ "enableDelayedExpansion" และ! FILENAME! แทน $ FILENAME $ ในกรณีที่สอง DOS จะตีความตัวแปรเพียงครั้งเดียว (ก่อนที่มันจะเข้าสู่ลูป) และไม่ใช่ในแต่ละครั้งที่โปรแกรมวนรอบ


19
ขอขอบคุณที่โพสต์สิ่งนี้ - ฉันรู้ว่าไม่ใช่สิ่งที่ OP ขอมา แต่เป็นสิ่งที่ฉันค้นหาเมื่อสิ้นสุดที่นี่
BrainSlugs83

24

แม่แบบสำหรับวงที่เรียบง่าย แต่นับ

set loopcount=[Number of times]
:loop
[Commands you want to repeat]
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop

ตัวอย่าง: พูดว่า "Hello World!" 5 ครั้ง:

@echo off
set loopcount=5
:loop
echo Hello World!
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause

ตัวอย่างนี้จะแสดงผล:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .

นี่เป็นรหัสลูปเดียวที่ฉันสามารถใช้กับพีซี win7 ของฉัน คนอื่น ๆ ที่พบโดย googleing ไม่ทำงาน
LaBracca

2
ในตัวอย่างของคุณฉันจะเพิ่มset /p loopcount="How many loops? "เพื่อให้คุณสามารถเรียกใช้ด้วยการป้อนข้อมูลของผู้ใช้ มันมีประโยชน์มากกว่า
1934286

8

คุณสามารถลองทำสิ่งนี้แทนการforวนซ้ำ:

set count=0
:loop
set /a count=%count%+1
(Commands here)
if %count% neq 100 goto loop
(Commands after loop)

มันค่อนข้างเล็กและเป็นสิ่งที่ฉันใช้ตลอดเวลา


1
นี้เป็นพื้นเหมือนกันกับคำตอบของมาร์คัสนกพิราบ โปรดอย่าโพสต์คำตอบที่ไม่ได้เพิ่มอะไรใหม่ ขอบคุณ!
Fabio พูดว่า Reinstate Monica

Ups sry ไม่เห็นว่าเพียงแค่บินโยนมันและเพิ่งเห็นลูป ... ฉันขอโทษแล้ว :)
BlazeLP

6

หรือคุณสามารถลด / เพิ่มตัวแปรตามจำนวนครั้งที่คุณต้องการวนซ้ำ:

SETLOCAL ENABLEDELAYEDEXPANSION
SET counter=200
:Beginning
IF %counter% NEQ 0 (
echo %x
copy %x.txt z:\whatever\etc
SET /A counter=%counter%-1
GOTO Beginning
) ELSE (
ENDLOCAL
SET counter=
GOTO:eof

เห็นได้ชัดว่าการใช้FOR /Lเป็นทางหลวงและนี่คือถนนสายหลังที่ใช้เวลานานกว่า แต่จะไปถึงปลายทางเดียวกัน



2

คุณสามารถทำได้โดยไม่มีforคำสั่ง ^. ^:

@echo off
:SPINNER
SET COUNTP1=1

:1
CLS
 :: YOUR COMMAND GOES HERE
IF !COUNTP1! EQU 200 goto 2

SET COUNTP1=1
) ELSE (
SET /A COUNTP1+=1
)
goto 1

:2
:: COMMAND HAS FINISHED RUNNING 200 TIMES

มันมีความเข้าใจพื้นฐาน เพียงแค่ให้มันทดสอบ : P


1
คุณไม่ต้องการการขยายที่ล่าช้าที่นี่
เตฟาน

2

วิธีพื้นฐานมากในการใช้การวนลูปในการเขียนโปรแกรม cmd โดยใช้ป้ายกำกับ

@echo off
SET /A "index=1"
SET /A "count=5"
:while
if %index% leq %count% (
   echo The value of index is %index%
   SET /A "index=index + 1"
   goto :while
)

1

ดอสไม่ได้มีกลไกที่สง่างามสำหรับเรื่องนี้ แต่ฉันคิดว่าคุณยังคงสามารถวนรหัสวนซ้ำได้ 100 หรือ 200 ครั้งด้วยความพยายามที่สมเหตุสมผล ในขณะที่ไม่มีการforวนซ้ำตัวเลขคุณสามารถใช้สตริงอักขระเป็น "ตัวแปรลูป"

เขียนรหัสวนรอบโดยใช้ GOTO และสำหรับแต่ละการวนซ้ำใช้SET X=%X%@เพื่อเพิ่ม@เครื่องหมายอื่นให้กับตัวแปรสภาพแวดล้อม X และเมื่อต้องการออกจากลูปให้เปรียบเทียบค่า X กับสตริง 100 (หรือ 200) @เครื่องหมาย

ฉันไม่เคยพูดแบบนี้ดี แต่ควรใช้งานได้!


1
/aตัวเลือกของSETคำสั่งจะมีการประเมินการแสดงออกเชิงตัวเลขสำหรับค่าด้านขวา ดู doucmentation สำหรับตลาดหลักทรัพย์ ไม่จำเป็นต้องทำเคล็ดลับการต่อข้อมูล
Adam Porad

2
สำหรับ DOS เป็นสิ่งจำเป็นเนื่องจากไม่มีset /aใน DOS โชคดีที่ qeustion มีไว้สำหรับcmd... (ในเวลาที่คำตอบนี้ชื่อคำถามคือ "ห่วงแบทช์สคริปต์ DOS ชุด"
Stephan

0

ไม่แน่ใจว่าคำตอบเช่นนี้ได้ถูกส่งไปแล้ว แต่คุณสามารถลองสิ่งนี้:

@echo off
:start
set /a var+=1
if %var% EQU 100 goto end
:: Code you want to run goes here
goto start

:end
echo var has reached %var%.
pause
exit

ตัวแปร% var% จะเพิ่มขึ้นทีละหนึ่งจนกว่าจะถึง 100 ซึ่งโปรแกรมจะแสดงผลว่ามันเสร็จสิ้นการดำเนินการแล้ว อีกครั้งไม่แน่ใจว่าสิ่งนี้ได้รับการส่งหรือสิ่งที่ชอบ แต่ฉันคิดว่ามันอาจจะกะทัดรัดที่สุด


0

ฉันใช้สิ่งนี้ มันเป็นเรื่องเดียวกับคนอื่น ๆ แต่มันก็เป็นอีกวิธีหนึ่งในการเขียน

@ECHO off
set count=0
:Loop
if %count%==[how many times to loop] goto end
::[Commands to execute here]
set count=%count%+1
goto Loop
:end

0

คำตอบนั้นขึ้นอยู่กับว่าคุณคุ้นเคยกับแบตช์อย่างไรหากคุณไม่คุ้นเคยดังนั้นฉันขอแนะนำให้เพิ่มตัวแปรลูป:

@echo off
set /a loop=1
:repeat
echo Hello World!
set /a loop=%loop%+1
if %loop%==<no. of times to repeat> (
goto escapedfromrepeat
)
goto repeat
:escapedfromrepeat
echo You have come out of the loop
pause

แต่ถ้าคุณมีประสบการณ์มากขึ้นกับแบทช์ฉันขอแนะนำให้ใช้ประโยชน์ได้มากกว่าfor /l %loop in (1, 1, 10) do echo %loopนี้คือตัวเลือกที่ดีกว่า

             (start at 1, go up in 1's, end at 10)
for /l %[your choice] (start, step, end) do [command of your choice]

0

นี่คือเทมเพลตสคริปต์ที่ฉันจะใช้

@echo off
goto Loop

:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop

exit

สิ่งนี้จะเกิดขึ้นเมื่อมันเริ่มทำงานมันจะปิดเสียงสะท้อนหลังจากนั้นมันจะเรียกใช้ "Loop" แต่ในที่นั้นมันจะไปที่ "Loop" (ฉันหวังว่านี่จะช่วยได้)


0

วงที่สมบูรณ์แบบไร้ที่ติ

set num=0
:loop
:: insert code
set num=%num%+1
if %num% neq 10 goto loop
::insert after code code

คุณสามารถแก้ไขได้โดยเปลี่ยน 10 ในบรรทัด 5 เป็นตัวเลขใด ๆ เพื่อแสดงว่าคุณต้องการให้วนซ้ำกี่ครั้ง


-2

(แก้ไข) ฉันสร้างมันขึ้นมาเพื่อหยุดหลังจาก 100 ครั้ง

@echo off
goto actual
set /a loopcount=0
:actual
set /a loopcount=%loopcount% + 1
echo %random% %random% %random% %random%
timeout 1 /nobreak>nul
if %loopcount%== 100 goto stop
goto actual
:stop
exit

สิ่งนี้จะสร้างตัวเลขสุ่ม 4 หมายเลขตลอดเวลา 1 วินาที 100 ครั้ง นำ "timeout 1 / nobreak> nul" ออกเพื่อให้มันเร็วสุด


3
คำถามคือ "100 - 200 เท่า" ไม่ใช่ "วนซ้ำไม่รู้จบ"
เตฟาน

-2

อาจใช้ goto อย่างเช่น

@echo off
:Whatever
echo hello world
pause
echo TEST
goto Whatever

นี่เป็นการวนลูป inf (อนันต์)


ดีinfiniteไม่น้อยที่มีขนาดใหญ่กว่าที่มีการร้องขอ100-200 timesดังนั้นนี้ไม่ตอบคำถาม
เตฟาน

แน่นอนฉันต้องการที่จะวนซ้ำจำนวนครั้งดังนั้นฉันไม่ต้องคัดลอกวางคำสั่งซ้ำแล้วซ้ำอีก
Tom J Nowell

-2

ฉันมี 2 คำตอบวิธีที่ 1: แทรก Javascript ลงในแบทช์

@if (@a==@b) @end /*

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(ฉันไม่ค่อยรู้เรื่อง JavaScript มากนัก)

วิธีที่ 2: วนซ้ำในชุดงาน

   @echo off
    set loopcount=5
    :loop
    echo Hello World!
    set /a loopcount=loopcount-1
    if %loopcount%==0 goto exitloop
    goto loop
    :exitloop
    pause

(ขอบคุณ FluorescentGreen5)


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