Loop skrip batch

275

Saya perlu menjalankan perintah 100-200 kali, dan sejauh ini penelitian saya menunjukkan bahwa saya harus menyalin / menempelkan 100 salinan perintah ini, ATAU menggunakan forloop, tetapi forloop mengharapkan daftar item, maka saya akan perlu 200 file untuk beroperasi, atau daftar 200 item, mengalahkan titik.

Saya lebih suka tidak harus menulis program C dan membaca dokumentasi mengapa saya harus menulis program lain untuk menjalankan program saya untuk tujuan pengujian. Modifikasi program saya sendiri juga bukan pilihan.

Jadi, diberi perintah,, abagaimana saya akan menjalankannya Nkali melalui skrip batch?

Catatan: Saya tidak ingin loop tanpa batas

Sebagai contoh, berikut tampilannya di Javascript:

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

Seperti apa bentuknya dalam skrip batch yang berjalan di Windows?

Tom J Nowell
sumber

Jawaban:

524

for /l adalah temanmu:

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

Mulai dari 1, langkah per satu, dan berakhir pada 100.

Gunakan dua %jika itu dalam file batch

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

(yang merupakan salah satu hal yang saya sangat benci tentang scripting windows)

Jika Anda memiliki beberapa perintah untuk setiap iterasi dari loop, lakukan ini:

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

atau dalam file batch

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

Kunci:
/lmenunjukkan bahwa forperintah akan beroperasi secara numerik, daripada beroperasi pada set file
%xadalah variabel loop
(nilai awal, kenaikan nilai, kondisi akhir [inklusif])

Jon
sumber
2
Itu tergantung pada seberapa harfiah kita mengambil referensi "DOS". Versi terbaru dari MS-DOS, 7.1, tanggal kembali ke 1997 dan AFAIK tidak memiliki ekstensi ini. Shell perintah yang dikirimkan bersama Windows, tentu saja, lakukan.
Carl Smotricz
8
@Imray %xadalah variabel loop, /l(bukan \l) berarti bahwa perintah for akan beroperasi secara numerik, daripada beroperasi pada set file.
Jon
19
Dengan menjalankan for /l %x in (1, 1, 100) do echo %xsaya mendapatkan "x tidak diharapkan".
LaBracca
2
@ user193655 baca sisa jawaban, Anda perlu menggandakan% s jika Anda melakukan ini dalam file batch.
Jon
7
% x di loop terakhir harus %% x.
wildpointercs
63

Dan untuk beralih pada file direktori:

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

Anda harus menggunakan "enableDelayedExpansion" dan! FILENAME! bukannya $ FILENAME $. Dalam kasus kedua, DOS akan menafsirkan variabel hanya sekali (sebelum memasuki loop) dan tidak setiap kali loop program.

Olivier Faucheux
sumber
19
Terima kasih telah memposting ini - Saya tahu bukan itu yang diminta OP, tapi itu yang saya cari ketika saya berakhir di sini.
BrainSlugs83
24

Templat untuk loop sederhana namun terhitung:

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

Contoh: Katakan "Hello World!" 5 kali:

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

Contoh ini akan menampilkan:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .
FluorescentGreen5
sumber
ini adalah satu-satunya kode loop yang dapat saya gunakan pada PC win7 saya. Semua yang ditemukan oleh googleing tidak berfungsi.
LaBracca
2
Dalam contoh Anda, saya akan menambahkan set /p loopcount="How many loops? "sehingga Anda dapat menjalankannya dengan input pengguna. Ini lebih praktis.
1934286
8

Anda juga dapat mencoba ini sebagai ganti forperulangan:

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

Ini cukup kecil dan itu yang saya gunakan sepanjang waktu.

BlazeLP
sumber
1
Ini pada dasarnya identik dengan jawaban Marcus Culver . Tolong jangan memposting jawaban yang tidak menambahkan sesuatu yang baru. Terima kasih!
Fabio mengatakan Reinstate Monica
Ups sry tidak melihat itu, hanya terbang melemparkannya dan hanya melihat untuk loop ... Maaf kalau begitu :)
BlazeLP
6

Atau Anda bisa mengurangi / menambah variabel dengan berapa kali Anda ingin mengulang:

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

Jelas, menggunakan FOR /Ladalah jalan raya dan ini adalah jalan belakang yang membutuhkan waktu lebih lama, tetapi mencapai tujuan yang sama.

Mechaflash
sumber
5

Anda bisa melakukan sesuatu dengan efek berikut menghindari loop 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
Marcus Culver
sumber
2

Anda dapat melakukan ini tanpa forpernyataan ^. ^:

@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

Ini memiliki pemahaman dasar. Berikan saja tes. : P

zask
sumber
1
Anda tidak perlu ekspansi yang tertunda di sini.
Stephan
2

Cara yang sangat mendasar untuk mengimplementasikan perulangan dalam pemrograman cmd menggunakan label

@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
)
Rakesh Chaudhari
sumber
1

DOS tidak menawarkan mekanisme yang sangat elegan untuk ini, tetapi saya pikir Anda masih bisa membuat kode loop untuk 100 atau 200 iterasi dengan upaya yang masuk akal. Meskipun tidak ada forloop numerik , Anda dapat menggunakan string karakter sebagai "variabel loop."

Kode loop menggunakan GOTO, dan untuk setiap iterasi gunakan SET X=%X%@untuk menambahkan @tanda lain ke variabel lingkungan X; dan untuk keluar dari loop, bandingkan nilai X dengan string 100 (atau 200) @tanda.

Saya tidak pernah mengatakan ini elegan, tetapi seharusnya berhasil!

Carl Smotricz
sumber
1
The /apilihan untuk SETperintah akan mengevaluasi ekspresi numerik untuk nilai sisi kanan. Lihat doucmentation untuk SET . Tidak perlu melakukan trik penggabungan.
Adam Porad
2
untuk DOS, itu adalah perlu, karena tidak ada set /adi DOS. Untungnya qeustion adalah untuk cmd... (pada saat jawaban ini, judul pertanyaannya adalah "loop script batch DOS"
Stephan
0

Tidak yakin apakah jawaban seperti ini sudah dikirimkan, tetapi Anda dapat mencoba sesuatu seperti ini:

@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

Variabel% var% akan meningkat satu hingga mencapai 100 di mana program kemudian mengeluarkan bahwa ia telah selesai dieksekusi. Sekali lagi, tidak yakin apakah ini telah dikirimkan atau semacamnya, tapi saya pikir ini mungkin yang paling ringkas.

Josh Girouard
sumber
0

Saya menggunakan ini. Ini hampir sama dengan yang lain, tetapi itu hanyalah cara lain untuk menulisnya.

@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
Jordan B
sumber
0

Jawabannya benar-benar tergantung pada seberapa akrab Anda dengan batch, jika Anda tidak begitu berpengalaman, saya akan merekomendasikan penambahan variabel loop:

@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

Tetapi jika Anda lebih berpengalaman dengan batch, saya akan merekomendasikan yang lebih praktis for /l %loop in (1, 1, 10) do echo %loopadalah pilihan yang lebih baik.

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

Berikut ini adalah skrip templat yang akan saya gunakan.

@echo off
goto Loop

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

exit

Apa yang dilakukan adalah ketika dimatikan, kemudian dimatikan kemudian setelah itu menjalankan "Loop" tetapi di tempat itu ia terus "Loop" (saya harap ini membantu.)

Doggo
sumber
0

loop yang benar-benar sempurna

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

Anda dapat mengeditnya dengan mengubah 10 pada baris 5 ke nomor apa pun untuk menunjukkan berapa kali Anda ingin mengulang.

guest257351
sumber
-2

(Diedit) Saya membuatnya jadi berhenti setelah 100 kali

@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

Ini akan menghasilkan 4 angka acak 1 kali 100 detik. Keluarkan "timeout 1 / nobreak> nul" untuk membuatnya super cepat.

Manny
sumber
3
pertanyaannya adalah "100 - 200 kali", bukan "loop tanpa akhir".
Stephan
-2

Mungkin menggunakan goto like

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

Ini melakukan inf (infinite) loop.

Lamdenny5ONROBLOX
sumber
well, infinitesedikit lebih besar dari yang diminta 100-200 times, jadi ini tidak menjawab pertanyaan.
Stephan
Memang, saya ingin dapat mengulang beberapa kali sehingga saya tidak perlu menyalin perintah lagi dan lagi
Tom J Nowell
-2

Saya punya 2 jawaban Metode 1: Masukkan Javascript ke dalam Batch

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Saya tidak tahu banyak tentang JavaScript)

Metode 2: Loop dalam Batch

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

(Terima kasih FluorescentGreen5)

Cocos Nucifera
sumber
1
Kami menghargai upaya Anda untuk berkontribusi, tetapi mengulangi jawaban lima tahun kata demi kata tidak banyak membantu dan hanya menambah kebisingan.
Stephan