모든 프로그래밍 언어는 흐름형 구조, 제어문 구조, 반복문 구조를 가지고 있습니다.
배치파일에서도 반복문을 쓸 수 있는데 이는 for 문 또는 set /a와 goto문을 응용해서 만들 수 있습니다.
◆ FOR 반복문
[코드]
for /L %%변수 in (시점,증감,종점) do (
[for문 코드]
)
:: 띄어쓰기 조심하라는 부분은 로 강조하였음, 특히 ) 뒤의 띄어쓰기도 조심
변수 : set변수가 아닌 for문 변수이므로 %변수%가 아닌 %%변수
시점 : for문 반복시 초기 값
증감 : for문 반복할 때 마다 오르는 값
종점 : for문 반복을 마치기 위한 값
for문 코드 : 수행할 코드 입력 (단, set /a에서도 '%%변수'로 써야 함)
1부터 10까지의 합을 구하는 예제를 봅시다.
파일명 : 5-1.bat
@echo off
echo ==============================
echo 배치파일 예제 5-1 - FOR문 반복문
echo ==============================
echo.
set sum=0
for /L %%i in (1,1,10) do (
echo %%i
set /a sum+=%%i
)
echo 1부터 10까지의 합 = %sum%
pause>nul
프로그램 분석을 해 보면, 일단 sum에 0의 값을 초기화 시킨 다음
for문에서 %%i는 1부터 1씩 %%i의 값을 변화하면서,
echo를 통해 현재숫자 출력, sum 값에 %%i의 값을 sum에 더하고,
%%i가 10이 될 때까지 하며 그 후, 합계인 sum 값을 출력합니다.
이번에도 역시 마찬가지로 홀수의 합과 짝수의 합을 구해 봅시다.
하지만 아쉽게도 for문에 약간 버그가 있습니다.
저도 왜 이런지 모르겠습니다만 연구 도중
set T=%%i 를 수행하니 T에는 값이 비어 있는거에요...
따라서, FOR문이 제대로 작동이 안될 때에는 약간의 트릭이 필요한데요.
바로 다음과 같이 for문은 한 줄로 쓰듯이, call문을 이용해 약간의 변화를 주면 됩니다.
이게 괄호보다 안정적인 코드가 되었습니다.
[for문 시작 전 수행코드]
for /L %%변수 in (시점,증감,종점) do call :FOR레이블 %%변수
[for문 종료 후 수행코드]
:FOR레이블
[for문 내부 수행 코드 구현 (단, for문 변수는 %~1로 처리)]
exit /b (for문을 2번 이상 쓰는 경우, 필요함)
파일 명 : 5-2.bat
@echo off
echo ==============================
echo 배치파일 예제 5-2 - FOR문 반복문
echo ==============================
echo.
:: 홀수 합과 짝수 합을 구할 변수 준비
set hol=0
set zzak=0
:: for문 실행
for /L %%i in (1,1,10) do call :TempFor %%i
:: 결과 출력
echo 홀수 합 = %hol%
echo 짝수 합 = %zzak%
pause>nul
:: for문 내부 구현
:TempFor
:: 현재 반복중인 숫자 출력
echo %~1
:: 홀짝을 구하기 위해 변수를 2로 나눈 나머지를 저장
set /a D=%~1 %% 2
:: 두 if문중에서 만족하는 것에서 해당 연산을 수행 (홀, 짝수 변수에 누적 합을 구함)
:: 간결한 if문은 goto 문장을 쓰지 않고 한줄에 구현을 할 수도 있음
if "%D%"=="0" set /a zzak+=%~1
if "%D%"=="1" set /a hol+=%~1
exit /b
수행 결과
1
2
3
4
5
6
7
8
9
10
홀수 합 = 25
짝수 합 = 30
그리고, C언어 등의 프로그램언어와 마찬가지로 중첩 for문도 쓰실 수 있습니다.
2겹은 물론 ,3, 4, ... 9겹 까지 쓸 수 있습니다.
[for문 시작 전 수행코드]
for /L %%a in (시점,증감,종점) do (
for /L %%b in (시점,증감,종점) do (
...
call :FOR레이블 %%a %%b ...
...
)
)
[for문 종료 후 수행코드]
:FOR레이블
[for문 내부 수행 코드 구현 (단, for문 변수는 %~1, %~2, ..., %~9로 처리)]
exit /b (for문을 2번 이상 쓰는 경우, 필요함)
예)
for /L %%i in (1,1,5) do (
for /L %%j in (1,1,5) do (
call :TempFor %%i %%j
)
)
:TempFor
echo (%~1,%~2)
다음 시간에서는 함수에 대해서 알아 봅시다.
배치파일에서도 반복문을 쓸 수 있는데 이는 for 문 또는 set /a와 goto문을 응용해서 만들 수 있습니다.
◆ FOR 반복문
[코드]
for /L %%변수 in (시점,증감,종점) do (
[for문 코드]
)
:: 띄어쓰기 조심하라는 부분은 로 강조하였음, 특히 ) 뒤의 띄어쓰기도 조심
변수 : set변수가 아닌 for문 변수이므로 %변수%가 아닌 %%변수
시점 : for문 반복시 초기 값
증감 : for문 반복할 때 마다 오르는 값
종점 : for문 반복을 마치기 위한 값
for문 코드 : 수행할 코드 입력 (단, set /a에서도 '%%변수'로 써야 함)
1부터 10까지의 합을 구하는 예제를 봅시다.
파일명 : 5-1.bat
@echo off
echo ==============================
echo 배치파일 예제 5-1 - FOR문 반복문
echo ==============================
echo.
set sum=0
for /L %%i in (1,1,10) do (
echo %%i
set /a sum+=%%i
)
echo 1부터 10까지의 합 = %sum%
pause>nul
프로그램 분석을 해 보면, 일단 sum에 0의 값을 초기화 시킨 다음
for문에서 %%i는 1부터 1씩 %%i의 값을 변화하면서,
echo를 통해 현재숫자 출력, sum 값에 %%i의 값을 sum에 더하고,
%%i가 10이 될 때까지 하며 그 후, 합계인 sum 값을 출력합니다.
이번에도 역시 마찬가지로 홀수의 합과 짝수의 합을 구해 봅시다.
하지만 아쉽게도 for문에 약간 버그가 있습니다.
저도 왜 이런지 모르겠습니다만 연구 도중
set T=%%i 를 수행하니 T에는 값이 비어 있는거에요...
따라서, FOR문이 제대로 작동이 안될 때에는 약간의 트릭이 필요한데요.
바로 다음과 같이 for문은 한 줄로 쓰듯이, call문을 이용해 약간의 변화를 주면 됩니다.
이게 괄호보다 안정적인 코드가 되었습니다.
[for문 시작 전 수행코드]
for /L %%변수 in (시점,증감,종점) do call :FOR레이블 %%변수
[for문 종료 후 수행코드]
:FOR레이블
[for문 내부 수행 코드 구현 (단, for문 변수는 %~1로 처리)]
exit /b (for문을 2번 이상 쓰는 경우, 필요함)
파일 명 : 5-2.bat
@echo off
echo ==============================
echo 배치파일 예제 5-2 - FOR문 반복문
echo ==============================
echo.
:: 홀수 합과 짝수 합을 구할 변수 준비
set hol=0
set zzak=0
:: for문 실행
for /L %%i in (1,1,10) do call :TempFor %%i
:: 결과 출력
echo 홀수 합 = %hol%
echo 짝수 합 = %zzak%
pause>nul
:: for문 내부 구현
:TempFor
:: 현재 반복중인 숫자 출력
echo %~1
:: 홀짝을 구하기 위해 변수를 2로 나눈 나머지를 저장
set /a D=%~1 %% 2
:: 두 if문중에서 만족하는 것에서 해당 연산을 수행 (홀, 짝수 변수에 누적 합을 구함)
:: 간결한 if문은 goto 문장을 쓰지 않고 한줄에 구현을 할 수도 있음
if "%D%"=="0" set /a zzak+=%~1
if "%D%"=="1" set /a hol+=%~1
exit /b
수행 결과
1
2
3
4
5
6
7
8
9
10
홀수 합 = 25
짝수 합 = 30
그리고, C언어 등의 프로그램언어와 마찬가지로 중첩 for문도 쓰실 수 있습니다.
2겹은 물론 ,3, 4, ... 9겹 까지 쓸 수 있습니다.
[for문 시작 전 수행코드]
for /L %%a in (시점,증감,종점) do (
for /L %%b in (시점,증감,종점) do (
...
call :FOR레이블 %%a %%b ...
...
)
)
[for문 종료 후 수행코드]
:FOR레이블
[for문 내부 수행 코드 구현 (단, for문 변수는 %~1, %~2, ..., %~9로 처리)]
exit /b (for문을 2번 이상 쓰는 경우, 필요함)
예)
for /L %%i in (1,1,5) do (
for /L %%j in (1,1,5) do (
call :TempFor %%i %%j
)
)
:TempFor
echo (%~1,%~2)
다음 시간에서는 함수에 대해서 알아 봅시다.
'old drawer > programming' 카테고리의 다른 글
[배치파일] 디렉토리 복사(폴더복사) (0) | 2013.01.10 |
---|---|
[배치파일] 6강 함수 (0) | 2013.01.10 |
[배치파일] 4강 정수형 수치연산 2 (0) | 2013.01.10 |
[배치파일] 3강 정수형 수치연산 (0) | 2013.01.10 |
[배치파일] 2강 일반 제어문 (0) | 2013.01.10 |