Toplu komut dosyası döngüsü


275

100-200 kez bir komut yürütmek gerekiyor ve şimdiye kadar benim araştırma ya bu komutun 100 kopyasını kopyalamak / yapıştırmak, VEYA bir fordöngü kullanmak zorunda olacağını gösterir , ancak fordöngü bir öğe listesi bekler, bu yüzden ihtiyacım olurdu Üzerinde çalışacak 200 dosya veya 200 öğenin bir listesi noktayı yenerek.

Bir C programı yazmak ve neden test amacıyla programımı yürütmek için başka bir program yazmak zorunda olduğumu belgeleme uzunluğundan geçmek istemem. Programımın kendisinin değiştirilmesi de bir seçenek değil.

Peki, bir komut verildiğinde, abunu Nbir toplu iş komut dosyası aracılığıyla nasıl yürütürdüm?

Not: Sonsuz bir döngü istemiyorum

Örneğin, Javascript'te şöyle görünecektir:

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

Windows üzerinde çalışan bir toplu komut dosyasında nasıl görünür?


Yanıtlar:


524

for /l senin arkadaşın:

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

1'den başlar, adım adım ve 100'de biter.

%Bir toplu iş dosyasındaysa iki s kullanın

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

(bu, windows komut dosyası oluşturma konusunda gerçekten nefret ettiğim şeylerden biri)

Döngünün her yinelemesi için birden fazla komutunuz varsa, bunu yapın:

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

veya bir toplu iş dosyasında

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

Anahtar: komutun bir dizi dosya üzerinde çalışmak yerine sayısal bir şekilde çalışacağını
/lbelirtir. Döngü değişkeni (başlangıç ​​değeri, değerin artışı, bitiş koşulu [dahil])for
%x


2
Bu, "DOS" başvurusunu tam anlamıyla almamıza bağlıdır. MS-DOS'un son sürümü olan 7.1, 1997'ye dayanmaktadır ve AFAIK bu uzantılara sahip değildir. Öte yandan, Windows ile birlikte verilen komut kabukları da elbette.
Carl Smotricz

8
@Imray %xdöngü değişkenidir /l(değil \l), for komutunun bir dosya kümesinde çalışmak yerine sayısal bir şekilde çalışacağı anlamına gelir.
Jon

19
Çalıştırarak for /l %x in (1, 1, 100) do echo %x"x beklenmiyor" olsun.
LaBracca

2
@ user193655 cevabın geri kalanını okuyun, bunu bir toplu iş dosyasında yapıyorsanız% s'yi iki katına çıkarmanız gerekir.
Jon

7
Son döngüdeki% x, %% x olmalıdır.
wildpointercs

63

Ve bir dizinin dosyalarını yinelemek için:

@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" ve! FILENAME! $ FILENAME $ yerine. İkinci durumda, DOS değişkeni program döngüsünün her birinde değil, yalnızca bir kez (döngüye girmeden önce) yorumlayacaktır.


19
Bunu gönderdiğin için teşekkürler - OP'nin sorduğu şey olmadığını biliyorum, ama buraya geldiğimde aradığım şey bu.
BrainSlugs83

24

Basit ama sayılan bir döngü için şablon:

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

Örnek: "Merhaba Dünya!" 5 kere:

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

Bu örnek aşağıdakileri verecektir:

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

Bu benim win7 pc kullanabildi tek döngü kodu. Google tarafından bulunan diğer tüm kullanıcılar çalışmaz.
LaBracca

2
Örneğinizde, set /p loopcount="How many loops? "kullanıcı girişi ile çalıştırabilmeniz için ekleyeceğim . Daha pratik.
1934286

8

Bir fordöngü yerine bunu da deneyebilirsiniz :

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

Oldukça küçük ve her zaman kullandığım şey bu.


1
Bu temelde Marcus Culver'ın cevabı ile aynı . Lütfen yeni bir şey eklemeyen cevaplar göndermeyin. Teşekkür ederim!
Fabio, Reinstate Monica'ya

Ups sry görmedim, sadece uçtu attı ve sadece döngüler için gördüm ... Üzgünüm o zaman :)
BlazeLP

6

Veya bir değişkeni döngü yapmak istediğiniz sayı kadar azaltabilir / artırabilirsiniz:

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

Açıkçası, FOR /Lotoyol kullanmak ve bu daha uzun süren arka sokak, ancak aynı hedefe ulaşıyor.


5

FOR döngüsünden kaçınarak aşağıdaki etkiye bir şeyler yapabilirsiniz.

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

Bunu bir fordeyim olmadan yapabilirsiniz ^. ^:

@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

Temel bir anlayışa sahiptir. Sadece bir test yap. : P


1
burada gecikmeli genişlemeye ihtiyacınız yok.
Stephan

2

Etiketleri kullanarak cmd programlamada döngüyü uygulamanın çok temel yolu

@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 bunun için çok zarif mekanizmalar sunmuyor, ancak yine de bir döngüyü makul çaba ile 100 veya 200 yineleme için kodlayabileceğinizi düşünüyorum. Sayısal bir fordöngü olmasa da , karakter dizgisini "döngü değişkeni" olarak kullanabilirsiniz.

Döngüyü GOTO kullanarak kodlayın ve her yineleme için X ortam değişkenine SET X=%X%@başka bir @işaret eklemek için kullanın ; ve döngüden çıkmak için, X değerini 100 (veya 200) @işaretli bir dize ile karşılaştırın .

Bunun zarif olduğunu söylemedim, ama işe yaramalı!


1
/aSeçeneği SETkomutu sağ taraf değeri için sayısal ifadeyi değerlendirecektir. SET için dokümana bakınız . Birleştirme hilesi yapmak gerekli değildir.
Adam Porad

2
DOS için, DOS'ta olduğu gibi gereklidir set /a. Neyse ki qeustion için cmd... (bu cevap sırasında, soru başlığı "DOS toplu komut dosyası döngüsü" idi
Stephan

0

Böyle bir cevabın henüz gönderilmiş olup olmadığından emin değilim, ancak bunun gibi bir şey deneyebilirsiniz:

@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% değişkeni, programın yürütmeyi bitirdiği çıktıyı çıkardığı zaman 100'e ulaşıncaya kadar bir artacaktır. Yine, bunun gönderilip gönderilmediğinden emin değilim, ama en kompakt olabileceğini düşünüyorum.


0

Bunu kullanıyorum. Diğerleri ile hemen hemen aynı şey, ama yazmak için başka bir yol.

@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

Cevap gerçekten partiye ne kadar aşina olduğunuza bağlıdır, eğer çok deneyimli değilseniz, bir döngü değişkenini artırmanızı tavsiye ederim:

@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

Ancak, toplu iş konusunda daha deneyimli iseniz, daha pratik olanın for /l %loop in (1, 1, 10) do echo %loopdaha iyi bir seçim olduğunu tavsiye ederim .

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

0

İşte kullanacağım bir şablon betiği.

@echo off
goto Loop

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

exit

Bu ne zaman başlar sonra yankı kapatır sonra ondan sonra "Döngü" çalışır ama o yerde "Döngü" devam ediyor (Umarım bu yardımcı olur.)


0

tamamen kusursuz bir döngü

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

satır 5'teki 10'u, döngü yapmasını istediğiniz süreyi göstermek için herhangi bir sayıya çevirerek düzenleyebilirsiniz.


-2

(DÜZENLENDİ) 100 kez sonra durması için yaptım

@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

Bu, 1 saniyede 100 kez 4 rasgele sayı üretecektir. Süper hızlı gitmek için "zaman aşımı 1 / nobreak> nul" çıkarın.


3
soru "sonsuz döngü" değil, "100-200 kez" idi.
Stephan

-2

Muhtemelen goto gibi kullanın

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

Bu bir inf (sonsuz) döngü yapar.


Peki, infinitetalep edilenden biraz daha büyük 100-200 times, bu yüzden bu soruya cevap vermiyor.
Stephan

Gerçekten de, bir dizi kez döngü yapabilmek istedim, bu yüzden bir komutu tekrar tekrar yapıştırmak zorunda kalmam
Tom J Nowell

-2

Ben 2 yanıt var Yöntemler 1: Toplu Javascript Ekle

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(JavaScript hakkında fazla bir şey bilmiyorum)

Yöntem 2: Toplu Döngü

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

(Teşekkürler FluorescentGreen5)


1
Katkı sağlamaya çalıştığınız için teşekkür ederiz, ancak beş yıllık bir cevap kelimesini tekrarlamak çok yardımcı olmaz ve sadece gürültü ekler.
Stephan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.