배치 스크립트 루프


275

나는 명령을 100-200 번 실행해야하며, 지금까지 연구에 따르면이 명령의 사본 100 개를 복사 / 붙여 넣거나 for루프를 사용해야 하지만 for루프는 항목 목록을 기대하므로 필요한 항목이 필요합니다. 요점을 무너 뜨리는 200 개 파일 또는 200 개 항목 목록.

오히려 C 프로그램을 작성할 필요가없고 테스트 목적으로 프로그램을 실행하기 위해 다른 프로그램을 작성해야하는 이유를 문서화하는 데 시간이 걸렸습니다. 내 프로그램 자체의 수정도 옵션이 아닙니다.

따라서 명령이 주어지면 배치 스크립트를 통해 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에서 1 단계 씩 시작하여 100에서 끝납니다.

%배치 파일에 있으면 두 개를 사용하십시오.

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와 함께 제공되는 명령 셸은 물론 그렇습니다.
Carl Smotricz

8
@Imray %x는 루프 변수이며 /l(아님 \l)는 for 명령이 파일 세트에서 작동하지 않고 숫자 방식으로 작동 함을 의미합니다.
Jon

19
실행 for /l %x in (1, 1, 100) do echo %x하면 "x not expected"가 표시됩니다.
LaBracca

2
@ user193655 나머지 답변을 읽으십시오. 배치 파일 에서이 작업을 수행하는 경우 % s를 두 배로 늘려야합니다.
Jon

7
마지막 루프의 % x는 %% x 여야합니다.
wildpointercs 5

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
이 글을 게시 해 주셔서 감사합니다. OP가 요청한 내용이 아니라는 것을 알았습니다.
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

예 : "Hello World!"라고 말합니다. 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 PC에서 사용할 수있는 유일한 루프 코드입니다. 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
이것은 기본적으로 Marcus Culver의 답변 과 동일합니다 . 새로운 것을 추가하지 않은 답변은 게시하지 마십시오. 감사합니다!
Fabio에 따르면 Reinstate Monica는

업의 SRY은 임 죄송합니다 다음 : ... 그와 루프에 대한 방금 본 던졌다 날아, 그 보지 않았다
BlazeLP

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

기본적인 이해가 있습니다. 그냥 시험 해봐 :피


1
여기에서 확장 지연이 필요하지 않습니다.
Stephan

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를 사용하여 루프를 코딩하고, 반복 할 때마다 환경 변수 X에 SET X=%X%@또 다른 @부호를 추가하십시오 . 루프를 종료하려면 X 값을 100 (또는 200) 문자열로 비교하십시오 @.

나는 이것이 우아하다고 말한 적이 없지만 작동해야합니다!


1
/a의 옵션 SET명령은 오른쪽 값에 대한 수치 적 표현을 평가합니다. SET 문서를 참조하십시오 . 연결 트릭을 수행 할 필요는 없습니다.
Adam Porad

2
DOS를 위해, 그것은 하지 아니 존재하는 한,이 켜지지 set /aDOS에서. 운 좋게도 qeustion은 cmd... (이 답변의 시점에서 질문 제목은 "DOS 배치 스크립트 루프"
Stephan

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에 도달 할 때까지 1 씩 증가하여 프로그램이 실행을 완료 한 것으로 출력합니다. 다시 말하지만, 이것이 제출되었는지 또는 이와 비슷한 지 확실하지 않지만 가장 컴팩트 할 수 있습니다.


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

5 행에서 10을 임의의 숫자로 변경하여 반복 할 시간을 나타내면 편집 할 수 있습니다.


-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

이것은 1 초 100 번 4 난수를 생성합니다. "timeout 1 / nobreak> nul"을 꺼내서 매우 빠르게 진행하십시오.


3
문제는 "무한 루프"가 아니라 "100-200 배"였습니다.
Stephan

-2

고토처럼

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

이것은 inf (무한한) 루프를 수행합니다.


글쎄, infinite요청한 것보다 약간 크므로 100-200 times질문에 대답하지 않습니다.
Stephan

실제로, 나는 여러 번 반복 할 수 있기를 원했기 때문에 명령을 반복해서 붙여 넣기 할 필요가 없었습니다
Tom J Nowell

-2

두 가지 답변이 있습니다 방법 1 : 배치에 자바 스크립트 삽입

@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
기여해 주셔서 감사합니다. 그러나 5 년 전의 답변을 반복하는 것이 큰 도움이되지 않고 소음을 추가합니다.
Stephan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.