Пакетний цикл циклу


275

Мені потрібно виконати команду 100-200 разів, і поки що моє дослідження показує, що мені доведеться або копіювати / вставляти 100 копій цієї команди, або використовувати forцикл, але forцикл очікує список елементів, отже, мені знадобиться 200 файлів для роботи або список з 200 елементів, що перемогли точку.

Я б швидше не мав писати програму на С і переглядати довжину документування, чому мені довелося написати іншу програму, щоб виконати свою програму для тестових цілей. Модифікація самої моєї програми також не є варіантом.

Отже, даючи команду, 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 не має цих розширень. З іншого боку, оболонки команд, що постачаються з Windows, звичайно.
Карл Смотрич

8
@Imray %x- це змінна циклічна функція, /l(не \l) означає, що команда for буде працювати чисельно, а не працювати з набором файлів.
Джон

19
Запускаючи for /l %x in (1, 1, 100) do echo %xя отримую "x не очікується".
LaBracca

2
@ user193655 прочитайте решту відповіді, вам потрібно подвоїти% s, якщо ви робите це в пакетному файлі.
Джон

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
Дякую за повідомлення про це - я знаю, що це не те, про що просив ОП, але це те, що я шукав, коли опинився тут.
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

Приклад: Скажіть "Здрастуйте, світ!" 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. Усі інші, знайдені в Google, не працюють.
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
Це в основному ідентично відповіді Маркуса Калвера . Будь ласка, не публікуйте відповіді, які не додають нічого нового. Дякую!
Фабіо каже: Відновити Моніку

Ups sry цього не бачив, просто полетів, кинув його і щойно побачив петлі ...
Мені

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автомагістралі, і це зворотний шлях, який займає більше часу, але він потрапляє до того ж пункту призначення.


5

Ви можете зробити щось із наступним ефектом, уникаючи циклу 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

Це можна зробити без 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

DOS не пропонує дуже елегантних механізмів для цього, але я думаю, що ви все-таки можете додати цикл для 100 або 200 ітерацій з розумними зусиллями. Хоча числовий forцикл не існує , ви можете використовувати символьний рядок як "змінну циклу".

Зашифруйте цикл, використовуючи GOTO, і для кожної ітерації використовуйте SET X=%X%@для додавання ще одного @знака до змінної середовища X; і щоб вийти з циклу, порівняйте значення X із рядком зі 100 (або 200) @знаків.

Я ніколи не говорив, що це елегантно, але це має працювати!


1
/aОпція в SETкоманді буде оцінювати чисельне вираження для правого боку значення. Див. Подвищення для SET . Не варто робити фокус з конкатенацією.
Адам Порад

2
для DOS, це НЕ необхідне, так як немає set /aв DOS. На щастя, керування є для cmd... (під час цієї відповіді назва запитання була "цикл пакетного сценарію DOS"
Стефан

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

Це робиться, коли він починається, він вимикає відлуння, після чого він запускає цикл, але в цьому місці він продовжує переходити до "Петлі" (я сподіваюся, що це допомагає.)


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

Це робить інф (нескінченну) петлю.


ну, infiniteце трохи більше, ніж запитується 100-200 times, тому це не відповідає на питання.
Стефан

Дійсно, я хотів мати можливість циклічно задавати кількість разів, тому мені не доведеться копіювати вставку команди знову і знову
Том Дж. Ноуелл

-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
Ми цінуємо вашу спробу зробити свій внесок, але повторне повторення п'ятирічної відповіді не дуже допомагає та просто додає шум.
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.