Batch script loop


275

Tôi cần phải thực thi một lệnh 100-200 lần và cho đến nay nghiên cứu của tôi chỉ ra rằng tôi sẽ phải sao chép / dán 100 bản sao của lệnh này, HOẶC sử dụng một forvòng lặp, nhưng forvòng lặp mong đợi một danh sách các mục, do đó tôi sẽ cần 200 tệp để hoạt động hoặc danh sách 200 mục, đánh bại điểm.

Tôi thà không phải viết một chương trình C và trải qua thời gian viết tài liệu tại sao tôi phải viết một chương trình khác để thực hiện chương trình của mình cho mục đích thử nghiệm. Sửa đổi chương trình của tôi cũng không phải là một lựa chọn.

Vì vậy, được đưa ra một lệnh, alàm thế nào tôi có thể thực hiện Nlần đó thông qua một tập lệnh bó?

Lưu ý: Tôi không muốn một vòng lặp vô hạn

Ví dụ, đây là giao diện của Javascript:

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

Nó trông như thế nào trong một tập lệnh bó chạy trên Windows?


Câu trả lời:


523

for /l là bạn của bạn:

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

Bắt đầu từ 1, từng bước một và kết thúc ở 100.

Sử dụng hai %s nếu nó trong một tệp bó

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

(đó là một trong những điều tôi thực sự ghét về kịch bản windows)

Nếu bạn có nhiều lệnh cho mỗi lần lặp của vòng lặp, hãy làm điều này:

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

hoặc trong một tệp bó

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

Khóa:
/lbiểu thị rằng forlệnh sẽ hoạt động theo kiểu số, thay vì hoạt động trên một tập hợp các tệp
%xlà biến vòng lặp
(giá trị bắt đầu, tăng giá trị, điều kiện kết thúc [bao gồm])


2
Điều đó phụ thuộc vào việc chúng ta thực hiện tham chiếu "DOS" theo nghĩa đen như thế nào. Phiên bản mới nhất của MS-DOS, 7.1, có từ năm 1997 và AFAIK không có các tiện ích mở rộng này. Các shell lệnh được phân phối với Windows, mặt khác, tất nhiên là có.
Carl Smotricz

8
@Imray %xlà biến vòng lặp, /l(không \l) có nghĩa là lệnh for sẽ hoạt động theo kiểu số, thay vì hoạt động trên một tập hợp các tệp.
Jon

19
Bằng cách chạy for /l %x in (1, 1, 100) do echo %xtôi nhận được "x không mong đợi".
LaBracca

2
@ user193655 đọc phần còn lại của câu trả lời, bạn cần tăng gấp đôi% s nếu bạn đang làm điều này trong một tệp bó.
Jon

7
% x trong vòng lặp cuối cùng phải là %% x.
wildpulumcs

63

Và để lặp lại trên các tập tin của một thư mục:

@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!
)

Bạn phải sử dụng "enableDelayedExpansion" và! FILENAME! thay vì $ FILENAME $. Trong trường hợp thứ hai, DOS sẽ diễn giải biến chỉ một lần (trước khi vào vòng lặp) và không phải mỗi lần chương trình lặp.


19
Cảm ơn bạn đã đăng bài này - tôi biết đó không phải là những gì OP đang hỏi, mà đó là những gì tôi đã tìm kiếm khi tôi kết thúc ở đây.
BrainSlugs83

24

Mẫu cho một vòng lặp đơn giản nhưng được tính:

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

Ví dụ: Nói "Xin chào thế giới!" 5 lần:

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

Ví dụ này sẽ xuất ra:

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

đây là mã vòng lặp duy nhất tôi có thể sử dụng trên máy tính win7 của mình. Tất cả những thứ khác được tìm thấy bởi googleing không hoạt động.
LaBracca

2
Trong ví dụ của bạn, tôi sẽ thêm set /p loopcount="How many loops? "để bạn có thể chạy nó với đầu vào của người dùng. Nó thực tế hơn.
1934286

8

Bạn cũng có thể thử điều này thay vì một forvòng lặp:

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

Nó khá nhỏ và đó là những gì tôi sử dụng mọi lúc.


1
Điều này về cơ bản giống với câu trả lời của Marcus Culver . Xin vui lòng không đăng câu trả lời mà không thêm bất cứ điều gì mới. Cảm ơn bạn!
Fabio nói Phục hồi lại

Ups sry đã không nhìn thấy điều đó, chỉ cần ném nó và chỉ nhìn thấy các vòng lặp ... Tôi xin lỗi sau đó :)
BlazeLP

6

Hoặc bạn có thể giảm / tăng một biến theo số lần bạn muốn lặp:

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

Rõ ràng, sử dụng FOR /Llà đường cao tốc và đây là backstreet mất nhiều thời gian hơn, nhưng nó đến cùng một đích.


5

Bạn có thể làm gì đó với hiệu ứng sau để tránh vòng lặp FOR.

set counter=0
:loop
echo "input commands here"
SET /A counter=%counter%+1
if %counter% GTR 200
(GOTO exit) else (GOTO loop)
:exit
exit

2

Bạn có thể làm điều này mà không cần một fortuyên bố ^. ^:

@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

Nó có sự hiểu biết cơ bản. Chỉ cần cho nó một bài kiểm tra. : P


1
bạn không cần mở rộng chậm trễ ở đây.
Stephan

2

Cách rất cơ bản để thực hiện lặp trong lập trình cmd bằng nhãn

@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

DOS không cung cấp các cơ chế rất thanh lịch cho việc này, nhưng tôi nghĩ bạn vẫn có thể viết mã vòng lặp cho 100 hoặc 200 lần lặp với nỗ lực hợp lý. Mặc dù không có forvòng lặp số , bạn có thể sử dụng chuỗi ký tự làm "biến vòng lặp".

Mã hóa vòng lặp bằng GOTO và cho mỗi lần lặp sử dụng SET X=%X%@để thêm một @dấu hiệu khác vào biến môi trường X; và để thoát khỏi vòng lặp, hãy so sánh giá trị của X với một chuỗi 100 (hoặc 200) @dấu hiệu.

Tôi không bao giờ nói điều này là thanh lịch, nhưng nó nên hoạt động!


1
Các /atùy chọn của SETlệnh sẽ đánh giá một biểu thức số cho giá trị bên phải. Xem phần nâng cấp cho SET . Không cần thiết phải thực hiện thủ thuật ghép.
Adam Porad

2
cho hệ điều hành DOS, nó cần thiết, như không có là set /atrong DOS. May mắn thay, qe bỏng dành cho cmd... (tại thời điểm trả lời này, tiêu đề câu hỏi là "Vòng lặp tập lệnh DOS"
Stephan

0

Không chắc chắn nếu một câu trả lời như thế này đã được gửi chưa, nhưng bạn có thể thử một cái gì đó như thế này:

@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

Biến% var% sẽ tăng thêm một cho đến khi đạt tới 100 trong đó chương trình xuất ra rằng nó đã thực hiện xong. Một lần nữa, không chắc chắn nếu điều này đã được gửi hoặc một cái gì đó tương tự, nhưng tôi nghĩ rằng nó có thể là nhỏ gọn nhất.


0

Tôi sử dụng cái này Nó chỉ là về những điều tương tự như những người khác, nhưng nó chỉ là một cách khác để viết nó.

@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

Câu trả lời thực sự phụ thuộc vào mức độ quen thuộc của bạn với lô, nếu bạn không có kinh nghiệm, tôi khuyên bạn nên tăng một biến vòng lặp:

@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

Nhưng nếu bạn có nhiều kinh nghiệm với lô, tôi sẽ khuyên bạn thực tế hơn for /l %loop in (1, 1, 10) do echo %looplà sự lựa chọn tốt hơn.

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

0

Đây là một kịch bản mẫu tôi sẽ sử dụng.

@echo off
goto Loop

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

exit

Điều này làm là khi nó khởi động, nó sẽ tắt tiếng vang và sau đó nó chạy "Vòng lặp" nhưng ở nơi đó nó sẽ tiếp tục "Vòng lặp" (tôi hy vọng điều này sẽ giúp ích.)


0

một vòng lặp hoàn hảo

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

bạn có thể chỉnh sửa nó bằng cách thay đổi 10 trong dòng 5 thành bất kỳ số nào để biểu thị số lần bạn muốn nó lặp.


-2

(EDITED) Tôi đã làm cho nó dừng lại sau 100 lần

@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

Điều này sẽ tạo ra 4 số ngẫu nhiên bao giờ 1 giây 100 lần. Lấy ra "thời gian chờ 1 / nobreak> nul" để làm cho nó đi rất nhanh.


3
câu hỏi là "100 - 200 lần", không phải "vòng lặp vô tận".
Stephan

-2

Có thể sử dụng goto như

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

Điều này không một vòng lặp inf (vô hạn).


tốt, infinitelớn hơn một chút so với yêu cầu 100-200 times, vì vậy điều này không trả lời câu hỏi.
Stephan

Thật vậy, tôi muốn có thể lặp một số lần đã đặt để tôi sẽ không phải sao chép dán lệnh nhiều lần
Tom J Nowell

-2

Tôi có 2 câu trả lời Cách 1: Chèn Javascript vào hàng loạt

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Tôi không biết nhiều về JavaScript)

Cách 2: Lặp lại theo đợt

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

(Cảm ơn huỳnh quangGreen5)


1
Chúng tôi đánh giá cao nỗ lực đóng góp của bạn, nhưng lặp lại một câu trả lời năm tuổi nguyên văn không giúp được gì nhiều và chỉ gây thêm tiếng ồn.
Stephan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.