본문 바로가기
개발

[윈도우] 배치파일 명령어 setlocal 사용 방법

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

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

 

* setlocal

setlocal은 배치파일의 환경변수를 배치파일 내에서만 사용할 때 사용한다.

윈도우의 cmd 창에서 setlocal /? 를 쳐보면 설명이 나온다.

D:\>setlocal /?
배치 파일에서 환경 변경의 지역화를 시작합니다. SETLOCAL이 시작된 후 일어난 환경 변경은 배치 파일에만 유효합니다.
이전 설정으로 복구하려면 ENDLOCAL을 사용해야 합니다.  배치 스크립트 끝에
도달하면, 암시적인 ENDLOCAL이 배치 스크립트가
만든  모든 특별한 SETLOCAL 명령어를 실행합니다.

SETLOCAL

명령 확장을 사용하면 SETLOCAL은 아래와 같이 바뀝니다.

SETLOCAL 일괄 명령은 선택적인 인수를 받아들입니다.
        ENABLEEXTENSIONS 또는 DISABLEEXTENSIONS는
            명령 처리 확장을 사용하거나 사용하지 않도록 설정합니다.
            이러한 인수는 CMD /E:ON 또는 /E:OFF 스위치에 대해 우선권을
            갖습니다. 자세한 내용은 CMD /?를 참조하십시오.
        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION은
            지연된 환경 변수 확장을 사용하거나 사용하지 않도록
            설정합니다. 이러한 인수는 CMD /V:ON 또는 /V:OFF 스위치에 대해
            우선권을 갖습니다. 자세한 내용은 CMD /?를 참조하십시오.
이러한 수정 사항은 SETLOCAL 명령 이전의 설정에 관계 없이
일치하는 ENDLOCAL 명령이 실행할 때까지 지속됩니다.

SETLOCAL 명령은  인수가 주어지면 ERRORLEVEL값을 설정합니다.
두 개의 올바른 인수 중 하나가 주어지고 다른 하나가 주어지지
않으면 0이 됩니다. 이것으로 아래와 같은 기법을 사용하여
일괄 스크립트에서 확장을 사용 가능한지를 결정할 수
있습니다.

VERIFY OTHER 2>nul
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo 확장을 사용할 수 없습니다.

이것은 CMD.EXE, SETLOCAL의 이전 버전에ERRORLEVEL 값이
설정되지 않았기 때문에 작동합니다. 잘못된 인수와 함께 VERIFY 명령을
사용하면 ERRORLEVEL 값이 0이 아닌 값으로 초기화됩니다.

D:\>

즉 setlocal 이 설정된 영역에서 정의한 환경변수는 endlocal 이 수행되거나 해당 파일이 끝나기 전까지만 사용이 가능하다.

배치파일에 setlocal을 설정한 후 아무리 환경변수를 변경해 보아도 배치 파일이 종료되면 더 이상 그 환경변수를 사용하지 못하게 된다.

 

 

반응형

 

* 환경변수 사용 예시

환경변수는 set으로 정의한다. 환경변수 동작에 대한 다음의 예를 한번 살펴보자. 

abcde 라는 변수에 12344라는 값을 정의하였다.

echo %abcde%는 abcde 변수의 값을 출력하라는 명령어 이다.

D:\>set abcde=12344

D:\>echo %abcde%
12344

D:\>

예시에서 보는 바와 같이 윈도우에서 환경변수 abcde를 정의하여 사용할 수 있다. 한번 정의했기 때문에, abcde 변수를 사용하여 여러 곳에서 이용할 수도 있다.

 

다음과 같이 bat 파일로 환경변수를 만들어서 적용해도 시스템에 잘 적용이 된다.

D:\>copy con abc.bat
@echo off
set abc=11111
^Z
        1개 파일이 복사되었습니다.


D:\>abc.bat

D:\>echo %abc%
11111

D:\>

배치파일로 만들어 실행해도 환경변수가 살아 있다.

 

 

* setlocal 사용 예시

다음과 같이 setlocal을 사용하면, 배치파일이 종료될 경우 정의한 환경변수를 다시 사용할 수 없다.

D:\>copy con aaa.bat
@echo off
setlocal
set bbbbb=12345
^Z
        1개 파일이 복사되었습니다.

D:\>
D:\>aaa.bat

D:\>echo %bbbbb%
%bbbbb%

D:\>

보는 바와 같이 bbbbb를 정의했지만 aaa.bat 파일이 종료된 후에는 bbbbb 변수를 찾을 수 없기 때문에 echo %bbbbb% 명령으로 %bbbbb% 의 내용을 보고자 했을 때, 정의된 내용이 없기 때문에 %bbbbb% 가 그대로 표시되는 것을 볼 수 있다.

 

다음 예시는 setlocal과 endlocal의 동작을 확인하기 위해서 test.bat 파일을 만들었다.

D:\>
D:\>copy con test.bat
@echo off
setlocal
echo ==============
echo %abcde%
echo --------------

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


D:\>test.bat
==============
ECHO가 설정되어 있지 않습니다.
--------------
12345
++++++++++++++
ECHO가 설정되어 있지 않습니다.

D:\>

set abcde=12345가 정의되기 전에는 당연히 abcde 변수에 대한 정의를 찾을 수 없고, set abcde에서 정의된 이후에 abcde변수의 내용을 볼 수 있다. 그 후에 endlocal이 실행된 이후 다시 abcde 변수의 내용을 찾을 수 없다.

즉 setlocal과 endlocal 사이에 정의된 변수는 두 명령 사이에서만 사용이 가능하다.

 

이러한 setlocal은 여러 배치파일을 연속해서 실행해야 할 때 많이 사용된다. 서로의 환경변수가 다른 파일의 변수에 영향을 끼치치 않도록 조정하는 것이다. 배치파일 내에서 다른 사람이 만들었거나 다른 목적으로 만들어진 배치파일을 호출할 때, 서로의 파일에 영향을 끼치지 않도록 하기 위한 목적이다.

 

이러한 setlocal 명령은 배치파일들에서 자주 사용되는 setlocal EnableDelayedExpansion 정의와 함께 많이 사용된다.

 

 

[윈도우] 배치파일 문법 setlocal EnableDelayedExpansion

윈도우 배치파일을 작성할 때 자주 사용되는 setlocal EnableDelayedExpansion 구문에 대해서 알아보자. 명령어 단어를 보면, 환경변수 딜레이 확장이다. 환경변수를 확장하는 것에 대한 문법이다. setloca

www.metacode9.com

 

반응형

댓글