본문 바로가기

진리는어디에

윈도우 배치 스크립트(Batch Script) - 배열(Array)

이미지 출처 : http://oopsla.sch.ac.kr/lecture/c/ju10/chap_10-2.htm

들어가며

윈도우 배치 스크립트에서 배열의 사용이 가능하다. 단, 배열을 사용 할 때 다음 사항에 유의해야 한다.

  • 배열의 각 요소는 set 명령으로 정의해야 한다.
  • 배열의 값을 순회(iterate)하려면 'for' 루프가 필요하다.

배열 생성

배열은 아래와 같이 set 명령어를 이용해 생성 가능하다.

set a[0]=1

여기서 0은 배열의 인덱스이고 1은 배열의 첫번째 요소에 할당 된 값이다.

배열을 만드는 또 다른 방법은 값 목록(value list)를 정의하고 반복하는 것이다. 아래는 이를 구현하는 예를 보여준다.

Example

@echo off 
set list=1 2 3 4 
(for %%a in (%list%) do ( 
   echo %%a 
))

Output

1
2
3
4

배열 요소 가져오기

배열의 요소에 있는 값은 아래 예제 처럼 꺽쇠 괄호 안에 원하는 인덱스를 넘겨주어 원하는 값을 얻어 올 수 있다.

@echo off 
set a[0]=1 
echo %a[0]%

배열의 인덱스는 0 부터 시작하며 가장 처음의 요소를 얻기 위해서는 인덱스로 0을 넘겨주면 된다. 당연히 두번째 요소는 1을 넘겨주고 세번째 네번째 역시 각 접근하려는 요소보다 1 작은 인덱스를 지정하면 된다.아래 예제에서 배열을 생성하고 각 요소들의 값에 접근 하는 방법을 살펴 보자.

@echo off
set a[0]=1 
set a[1]=2 
set a[2]=3 
echo The first element of the array is %a[0]% 
echo The second element of the array is %a[1]% 
echo The third element of the array is %a[2]%

위 예제의 결과는 아래와 같다.

The first element of the array is 1 
The second element of the array is 2 
The third element of the array is 3

배열 요소 수정하기

배열의 제일 뒷 부분에 값을 추가하기 위해서는 배열의 마지막 인덱스에 set을 사용 할 수 있다.

@echo off 
set a[0]=1  
set a[1]=2  
set a[2]=3 
Rem Adding an element at the end of an array 
set a[3]=4 
echo The last element of the array is %a[3]%

예제의 결과는 아래와 같다.

The last element of the array is 4

기존 요소의 값을 변경하는 것 또한 인덱스를 지정하고 set을 사용하면 된다.

@echo off 
set a[0]=1 
set a[1]=2  
set a[2]=3 
Rem Setting the new value for the second element of the array 
Set a[1]=5 
echo The new value of the second element of the array is %a[1]%

위 예제의 결과는 아래와 같은 결과를 출력한다.

The new value of the second element of the array is 5

배열 순회하기

배열의 순회는 'for' 루프를 이용해 각 요소에 접근 할 수 있다. 다음 예제는 배열의 순회를 구현하는 간단한 방법에 대해 살펴 보고 있다.

@echo off 
setlocal enabledelayedexpansion 
set topic[0]=comments 
set topic[1]=variables 
set topic[2]=Arrays 
set topic[3]=Decision making 
set topic[4]=Time and date 
set topic[5]=Operators 

for /l %%n in (0,1,5) do ( 
   echo !topic[%%n]!
)

위 예제에서 다음과 같은 사항에 주의하도록 하자.

  • 배열의 각 요소는 set 명령을 사용하여 명시적으로 정의해야 한다.
  • for 루프의 /l(엘임, 아이 아님. 대소문자 구분 안함) 인자는 배열의 인덱스를 증가시키며 순회하기 위해 사용 된다.
    'for /L %%변수 in (start, step, end) do 명령문'의 형태를 가지며 start에서 시작하여 step만큼 증가하거나 감소하여 end까지 진행한다. 위 예에서는 0에서 부터 시작하여 5까지 1씩 증가한다는 의미다.
Comments 
variables 
Arrays 
Decision making 
Time and date 
Operators

배열의 길이

배치 스크립트에서는 배열의 길이를 리턴해주는 직접적인 함수가 없기 때문에 배열의 길이를 구하기 위해서는 직접 배열을 순회하여 알아내야 한다.

@echo off 
set Arr[0]=1 
set Arr[1]=2 
set Arr[2]=3 
set Arr[3]=4 
set "x = 0" 
:SymLoop 

if defined Arr[%x%] ( 
   call echo %%Arr[%x%]%% 
   set /a "x+=1"
   GOTO :SymLoop 
)
echo "The length of the array is" %x%

위 예제의 결과는 아래와 같다.

1
2
3
4
"The length of the array is" 4

배열 안에 구조체 생성하기

배치 스크립트에서도 구조체를 사용하는 것이 가능하다. 아래 예제는 그 방법을 보여 준다.

@echo off 
set obj[0].Name=Joe 
set obj[0].ID=1 
set obj[1].Name=Mark 
set obj[1].ID=2 
set obj[2].Name=Mohan 
set obj[2].ID=3 
FOR /L %%i IN (0 1 2) DO  (
   call echo Name = %%obj[%%i].Name%%
   call echo Value = %%obj[%%i].ID%%
)

위의 코드에 대해 아래 사항들에 주목하도록 하자.

  • set 명령을 사용하여 정의된 각 변수에는 배열의 각 인덱스와 연결된 2개의 값이 있다.
  • 변수 i는 0으로 값이 셋팅되어 순회를 시작하므로 배열의 길이는 3이다.
  • 항상 i 값이 길이 값과 같은지 여부에 대한 조건을 확인하고 그렇지 않은 경우 코드를 반복한다.
  • obj[%i%] 표기법을 사용하여 구조의 각 요소에 액세스할 수 있다.
Name=Joe 
Value=1 
Name=Mark 
Value=2 
Name=Mohan 
Value=3

마치며

본 포스트는 배치 스크립트의 배열에 중점을 두고 설명했기 때문에 배치 스크립트의 변수의 사용법이나 for 루프와 같은 것에 익숙하지 않은 사람들이라면 다소 내용이 어려울 수 있다. 만일 본 포스트를 읽는데 어려움을 느낀다면 부록으로 추가된 각 항목들에 대한 자세한 설명을 추가로 읽도록 하자.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!