본문 바로가기
개발

[윈도우] 배치파일 문법 setlocal EnableDelayedExpansion 사용하기

by I!i어★떤☆날★에Ι!i 2022. 3. 24.
반응형

윈도우 배치파일을 작성할 때 자주 사용되는 setlocal EnableDelayedExpansion 구문에 대해서 알아보자.

일단 단어를 그대로 해석해보면, 환경변수 딜레이 확장 정도로 번역할 수 있다. 말 그대로 환경변수를 확장하는 것에 대한 문법 이리는 뜻이다. 

 

setlocal EnableDelayedExpansion 문법은 setlocal 명령어의 기능 중 하나이다. setlocal 명령은 선언한 환경변수를 setlocal로 설정한 영역에서만 동작하도록 한다. 참고로 setlocal  endlocal과 함께 짝을 이루어 사용된다.

 

setlocal에 대한 자세한 내용은 이전 포스팅을 참고하기 바란다.

 

[윈도우] 배치파일 명령어 setlocal

setlocal 은 윈도우 배치파일에서 사용하는 문법으로써, 배치파일 환경변수의 지역화를 위한 문법이다. setlocal은 endlocal과 함께 사용한다. setlocal 은 setlocal EnableDelayedExpansion 문법을 사용할 때 주..

www.metacode9.com

 

 

* setlocal EnableDelayedExpansion

 

setlocal EnableDelayedExpansion은 setlocal 명령어의 확장 기능으로써,
set으로 설정한 환경변수가 라인별로 적용되도록 하는 기능이다.

 

처음 접하면 무슨말인지 이해가 잘 되지 않는다. 다음의 예제들을 통해서 좀 더 자세히 알아보자.

 

* 일반적인 set 설정이 적용되는 예제

아래는 abced 라는 환경변수를 12345라는 값으로 설정한 test.bat 파일이다. set으로 abcde를 12345 또는 999로 설정할 경우 바로바로 적용된다.

G:\Work>copy con test.bat
@echo off
set abcde=12345
echo %abcde%

set abcde=999
echo %abcde%
^Z
        1개 파일이 복사되었습니다.

G:\Work>test.bat
12345
999

G:\Work>

참고로, echo %abcde%는 abcde 변수의 값을 출력하라는 명령어다.

배치파일을 실행하면 의도한 대로 잘 실행된다.

 

 

* 조건문에서 set 설정이 적용되는 예제

 

그렇다면 이렇게 순차적으로 작성한 코드들이 모두 잘 동작할까?

 

다음 코드는 if라는 조건문을 이용하여 조건에 따라서 변수의 값을 다르게 설정하는 test.bat 파일의 내용이다. echo 1, echo 2, echo 3으로 상태마다 값을 출력할 수 있도록 하였다.

@echo off

set var=111
echo 1 VAR : %var%

if %var% == 111 (
    set var=222
    echo 2 VAR : %var%
    if %var% == 222 (
        set var=333
        echo 3 VAR : %var%
    )
)

echo last VAR is %var%

 

var값이 어떻게 변경되는지 확인이 되는가? 자신이 생각한 대로 변수값이 잘 변경되는지 다음의 실행결과로 확인해 보자.

작성한 test.bat 파일을 실행하면 다음과 같은 결과가 출력된다.

 

G:\Work>test.bat
1 VAR : 111
2 VAR : 111
last VAR is 222

G:\Work>

 

1 var는 111이 맞다. 2 var 전에 set var=222로 var 변수의 값을 변경했지만, 2 var가 111로 출력된다.

if 조건문 안에서 실행된 2 var의 값은 변경되지 않은 111 값으로 출력된 것이다. 원하지 않는 결과값이다.

 

환경변수는 프로그램 시작시에 모두 정의된다.

var라는 변수의 값도 라인별로 설정되는 것이 아니라, 프로그램 시작 시에 이미 모두 정의되기 때문에 이러한 현상이 발생한다.

 

 

반응형

 

 

* setlocal EnableDelayedExpansion 적용

 

그렇다면 프로그램이 실행될 때마다 설정한 환경변수가 바로바로 적용되도록 하고 싶을 때 어떻게 해야 할까?

바로 setlocal EnableDelayedExpansion 를 사용하여 라인별로 변경한 내용이 반영될 수 있도록 하는 것이다.

그런데 setlocal EnableDelayedExpansion을 그냥 추가만 하면 되는 것은 아니고 추가적인 작업을 해야 한다.

 

일단 위 예제 파일에 ​setlocal EnableDelayedExpansion 코드만 추가해서 실행해 보자. 코드 상단에 추가하였다.

@echo off
setlocal EnableDelayedExpansion

set var=111
echo 1 VAR : %var%

if %var% == 111 (
    set var=222
    echo 2 VAR : %var%
    if %var% == 222 (
        set var=333
        echo 3 VAR : %var%
    )
)

echo last VAR is %var%

 

작성한 test.bat 파일을 실행하였다.

G:\Work>test.bat
1 VAR : 111
2 VAR : 111
last VAR is 222

G:\Work>

2 var 가 222 값으로 출력되길 바랬지만 안타깝게도 이전과 동일한 111 값이 출력되었다.

뭔가 잘못된 것 같다. ​setlocal EnableDelayedExpansion만 추가한다고 해서 변하는 것은 없다.

 

 

 

* setlocal EnableDelayedExpansion 의 올바른 사용 예

 

​setlocal EnableDelayedExpansion을 제대로 사용하기 위해서는
변수의 값을 얻을 때때    % 대신 !   를 사용해야 한다.

 

%var% 는 처음에 설정한 var의 값을 반환하고, !var! 가 변경된 값을 반환한다.

변수를 모두 !var!로 변경해서 실행해 보자.

 

@echo off
setlocal EnableDelayedExpansion

set var=111
echo 1 VAR : %var%

if !var! == 111 (
    set var=222
    echo 2 VAR : !var!
    if !var! == 222 (
        set var=333
        echo 3 VAR : !var!
    )
)

echo last VAR is !var!

 

이제 변경된 내용을 저장한 test.bat 파일을 실행해 보자.

G:\Work>test.bat
1 VAR : 111
2 VAR : 222
3 VAR : 333
last VAR is 333

G:\Work>

 

우리가 원하는 대로 잘 출력되는 것을 확인할 수 있다. ​setlocal EnableDelayedExpansion과 !를 사용하여 원하는 결과를 얻을 수 있다.

반응형

댓글