Pętla skryptu partii

275

Muszę wykonać polecenie 100-200 razy i jak dotąd moje badania wskazują, że musiałbym albo skopiować / wkleić 100 kopii tego polecenia, LUB użyć forpętli, ale forpętla oczekuje listy elementów, dlatego potrzebowałbym 200 plików do działania lub lista 200 elementów, pokonując punkt.

Wolałbym nie pisać programu w języku C i musiałem dokumentować, dlaczego musiałem napisać inny program, aby uruchomić mój program do celów testowych. Modyfikacja mojego programu również nie wchodzi w grę.

Tak więc, biorąc pod uwagę polecenie, ajak miałbym to wykonać Nza pomocą skryptu wsadowego?

Uwaga: nie chcę nieskończonej pętli

Na przykład oto, jak wyglądałoby to w JavaScript:

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

Jak by to wyglądało w skrypcie wsadowym działającym w systemie Windows?

Tom J Nowell
źródło

Odpowiedzi:

524

for /l jest twoim przyjacielem:

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

Zaczyna się od 1, krok po kroku, a kończy na 100.

Użyj dwóch %s, jeśli jest w pliku wsadowym

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

(co jest jedną z rzeczy, których tak naprawdę nienawidzę w skryptach systemu Windows)

Jeśli masz wiele poleceń dla każdej iteracji pętli, wykonaj następujące czynności:

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

lub w pliku wsadowym

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

Klucz:
/loznacza, że forpolecenie będzie działać w sposób numeryczny, a nie na zestawie plików
%xjest zmienna pętli
(wartość początkowa, przyrost wartości, warunek końcowy [włącznie])

Jon
źródło
2
To zależy od tego, jak dosłownie mamy przyjąć odniesienie „DOS”. Najnowsza wersja MS-DOS, 7.1, pochodzi z 1997 roku, a AFAIK nie ma tych rozszerzeń. Z drugiej strony powłoki poleceń są dostarczane z systemem Windows.
Carl Smotricz
8
@Imray %xjest zmienną pętli, /l(nie \l) oznacza, że ​​polecenie for będzie działać w sposób numeryczny, a nie na zestawie plików.
Jon
19
Po uruchomieniu for /l %x in (1, 1, 100) do echo %xotrzymuję „x nie oczekiwany”.
LaBracca,
2
@ user193655 przeczytaj resztę odpowiedzi, musisz podwoić% s, jeśli robisz to w pliku wsadowym.
Jon
7
% x w ostatniej pętli powinno być %% x.
wildpointercs
63

I w celu iteracji po plikach katalogu:

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

Musisz użyć „enableDelayedExpansion” i! FILENAME! zamiast $ FILENAME $. W drugim przypadku DOS zinterpretuje zmienną tylko raz (przed wejściem do pętli), a nie za każdym razem, gdy program zapętli się.

Olivier Faucheux
źródło
19
Dzięki za opublikowanie tego - wiem, że nie o to pytał OP, ale tego szukałem, kiedy tu trafiłem.
BrainSlugs83
24

Szablon prostej, ale zliczonej pętli:

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

Przykład: powiedz „Hello World!” 5 razy:

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

Ten przykład wyświetli:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .
Fluorescencyjny zielony 5
źródło
jest to jedyny kod pętli, którego mogłem użyć na moim komputerze z systemem Windows 7. Wszystkie pozostałe znalezione przez googleing nie działają.
LaBracca,
2
W twoim przykładzie dodałbym set /p loopcount="How many loops? ", abyś mógł uruchomić go z danymi wejściowymi użytkownika. To jest bardziej praktyczne.
1934286
8

Możesz również wypróbować to zamiast forpętli:

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

Jest dość mały i tego używam cały czas.

BlazeLP
źródło
1
Jest to w zasadzie identyczne z odpowiedzią Marcusa Culvera . Nie publikuj odpowiedzi, które nie dodają nic nowego. Dziękuję Ci!
Fabio mówi Przywróć Monikę
Ups sry tego nie widziałem, po prostu poleciałem, rzuciłem i po prostu zobaczyłem pętle ... Przepraszam więc :)
BlazeLP
6

Możesz też zmniejszać / zwiększać zmienną liczbę razy, kiedy chcesz zapętlić:

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

Oczywiście, używanie FOR /Lto autostrada i jest to zaułek, który zajmuje więcej czasu, ale dociera do tego samego celu.

Mechaflash
źródło
5

Możesz zrobić coś z następującym efektem, unikając pętli 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
źródło
2

Możesz to zrobić bez forinstrukcji ^. ^:

@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

Ma podstawowe zrozumienie. Po prostu sprawdź to. : P

zask
źródło
1
nie potrzebujesz tutaj opóźnionego rozwoju.
Stephan
2

Bardzo podstawowy sposób implementacji zapętlania w programowaniu cmd przy użyciu etykiet

@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
źródło
1

DOS nie oferuje do tego bardzo eleganckich mechanizmów, ale myślę, że nadal możesz kodować pętlę dla 100 lub 200 iteracji przy rozsądnym wysiłku. Chociaż nie ma forpętli numerycznej , możesz użyć ciągu znaków jako „zmiennej pętli”.

Zakoduj pętlę za pomocą GOTO i dla każdej iteracji SET X=%X%@dodaj kolejny @znak do zmiennej środowiskowej X; i aby wyjść z pętli, porównaj wartość X z ciągiem 100 (lub 200) @znaków.

Nigdy nie mówiłem, że to eleganckie, ale powinno działać!

Carl Smotricz
źródło
1
/aOpcja z SETpoleceniem oceni wyrażenie numeryczną wartość prawej bocznej. Zobacz doucmentation dla SET . Nie trzeba wykonywać sztuczki konkatenacji.
Adam Porad,
2
w przypadku DOS jest to konieczne, ponieważ nie ma go set /aw DOS. Na szczęście pytanie dotyczy cmd... (w momencie tej odpowiedzi tytuł pytania brzmiał: „Pętla skryptów wsadowych DOS”
Stephan
0

Nie jestem pewien, czy taka odpowiedź została już przesłana, ale możesz spróbować czegoś takiego:

@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

Zmienna% var% będzie rosła o jeden, aż osiągnie wartość 100, po czym program wyświetli zakończenie wykonywania. Ponownie, nie jestem pewien, czy to zostało przesłane, czy coś podobnego, ale myślę, że może być najbardziej kompaktowy.

Josh Girouard
źródło
0

Używam tego. Jest to prawie to samo, co inne, ale jest to tylko inny sposób na napisanie tego.

@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.
źródło
0

Odpowiedź naprawdę zależy od tego, jak dobrze znasz wsad, jeśli nie masz takiego doświadczenia, zaleciłbym zwiększenie zmiennej pętli:

@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

Ale jeśli masz większe doświadczenie z partią, polecam, że bardziej praktyczny for /l %loop in (1, 1, 10) do echo %loopjest lepszy wybór.

             (start at 1, go up in 1's, end at 10)
for /l %[your choice] (start, step, end) do [command of your choice]
Dr Hugh Jarse
źródło
0

Oto skrypt szablonu, którego użyję.

@echo off
goto Loop

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

exit

Po uruchomieniu wyłącza echo, a następnie uruchamia „Loop”, ale w tym miejscu przechodzi do „Loop” (mam nadzieję, że to pomaga).

Doggo
źródło
0

całkowicie bezbłędna pętla

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

możesz go edytować, zmieniając 10 w wierszu 5 na dowolną liczbę, aby wskazać, ile razy chcesz zapętlić.

guest257351
źródło
-2

(ZMIENIONO) Zrobiłem to, więc zatrzymuje się po 100 razy

@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

To wygeneruje 4 losowe liczby co 1 sekundę 100 razy. Wyjmij „limit czasu 1 / nobreak> nul”, aby przyspieszyć.

Manny
źródło
3
pytanie brzmiało „100–200 razy”, a nie „niekończąca się pętla”.
Stephan
-2

Prawdopodobnie użyj goto jak

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

To robi pętlę inf (nieskończoną).

Lamdenny5ONROBLOX
źródło
cóż, infinitejest nieco większy niż żądany 100-200 times, więc to nie odpowiada na pytanie.
Stephan
Rzeczywiście, chciałem mieć możliwość zapętlenia określonej liczby razy, więc nie musiałbym kopiować wklejania polecenia w kółko
Tom J Nowell
-2

Mam 2 odpowiedzi Metody 1: Wstaw JavaScript do partii

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Nie wiem dużo o JavaScript)

Metoda 2: Pętla w partii

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

(Dzięki FluorescentGreen5)

Cocos Nucifera
źródło
1
Doceniamy twoją próbę wniesienia wkładu, ale powtórzenie dosłownie pięcioletniej odpowiedzi niewiele pomaga, a jedynie powoduje hałas.
Stephan