[windows] 배치 스크립트 루프

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

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

따라서 명령이 주어지면 배치 스크립트를 통해 a어떻게 명령을 실행 N합니까?

참고 : 나는 무한 루프를 원하지 않습니다

예를 들어, 다음은 Javascript와 비슷합니다.

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

Windows에서 실행되는 배치 스크립트에서 어떤 모양입니까?



답변

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


답변

디렉토리의 파일을 반복하려면 다음을 수행하십시오.

@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는 프로그램이 반복 될 때마다가 아니라 변수를 한 번만 (루프에 들어가기 전에) 해석합니다.


답변

단순하지만 카운트 된 루프를위한 템플릿 :

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 . . .


답변

for루프 대신 이것을 시도 할 수도 있습니다 .

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

아주 작고 항상 사용하는 것입니다.


답변

또는 반복하려는 횟수만큼 변수를 감소 / 증가시킬 수 있습니다.

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고속도로를 사용하고 이것은 더 오래 걸리는 뒷골목이지만 동일한 목적지에 도착합니다.


답변

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


답변

당신은 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

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