SETLOCAL

1 개요[ | ]

SETLOCAL
  • 환경 변수의 지역화를 사용하도록 설정하는 명령어
  • 배치파일 내에서 CMD /E:OFF 또는 CMD V:ON 없이 명령 처리 확장 또는 지연된 환경 변수 확장을 사용 여부를 설정할 수 있는 명령어

2 설명[ | ]

변수 지역화
  • SETLOCAL은 배치파일 안에서 변수 지역화를 사용하도록 설정한다. 이때 변수 지역화는 SETLOCAL 명령 실행 이후부터 적용이 되며, ENDLOCAL 명령 이후에 지역화가 끝난다.
  • SETLOCAL로 변수 지역화가 시작된 후, ENDLOCAL로 변수 지역화를 끝낼 경우 모든 변수는 SETLOCAL 이전의 설정으로 복구된다.
  • 즉, SETLOCAL 이후에 값이 바뀐 변수는 SETLOCAL 이전의 값으로 복구되며, SETLOCAL 이후에 생성된 변수의 값은 ENDLOCAL 후 사라진다.
  • 지역 변수화는 여러 번 적용할 수 있으며, 최대 32중의 변수 지역화를 사용할 수 있다. 이때 이전의 SETLOCAL의 설정을 상속받지만, 설정을 변경하는 것도 가능하다.
SETLOCAL
SET "Val_Mint=맛이 없다."

SETLOCAL
SET Val_Number=1
SET "Val_Mint=맛이 존재한다.."
ENCLOCAL

:: Val로 시작되는 변수 목록을 보여준다.
SET Val
REM 출력: Val_Mint=맛이 없다.

ENDLOCAL
SET Val
REM 출력:
명령 처리 확장
  • 기본적으로 켜져있으며, 배치파일에서는 SETLOCAL ENABLEEXTENSIONS/DISABLEEXTENSIONS, 명령 프롬프트에서 사용하려면 CMD /E:ON 또는 CMD /E:OFF로 사용 여부를 결정할 수 있다.
  • 명령 처리 확장을 끄는 것을 요구하는 경우는 매우 드물며, 명령 처리 확장을 사용하지 않을 경우 CD, COLOR과 같은 명령이나 FOR 명령의 /F, /D, /R 등을 사용할 수 없다.
지연된 환경 변수 확장
  • 기본적으로 꺼져있으며, 배치파일에서는 SETLOCAL ENABLEDELAYEDEXPANSION/DISABLEELAYEDEXPANSION, 명령 프롬프트에서 사용하려면 CMD /V:ON 또는 CMD /V:OFF로 사용 여부를 결정할 수 있다.
  • 이 설정은 변수 확장(간단히 말해서 변수->값)이 언제 이루어지는지를 결정한다. 이 설정이 켜져 있으면 변수 할당은 명령어 실행 단계에서 확장된다. 이때 지연된 환경 변수 확장을 사용할 변수는 "%변수%" 대신 "!변수!"를 사용하며, 이때 %변수%도 사용할 수 있지만 지연된 환경 변수 확장의 영향을 받지 않는다.
#>REM 다음은 콘솔에서 테스트 할 수 있는 지연된 환경 변수 확장의 예시이다.
#>CMD /V:ON
#>ECHO 실행 전:%TIME% & TIMEOUT 10 > NUL & ECHO 실행 후:%TIME%
실행 전: 10:16:48.13
실행 후: 10:16:48.13
#>ECHO 실행 전:!TIME! & TIMEOUT 10 > NUL & ECHO 실행 후:!TIME!
실행 전: 10:22:21.85
실행 후: 10:22:31.21

/* 다시 보니까 틀린 부분(명령 실행 전에 변수 확장이 되기 때문에 저렇게 시각적으로 표현하는 것은 부자연스러움)이 있어서 수정이 필요합니다. 가까운 시일 이내로 수정할게요. */

:: 첫 번째 명령은 변수가 구문 분석 단계에서 확장된다. 즉
입력     : ECHO 실행 전: %TIME% & TIMEOUT 10 > NUL & ECHO 실행 후: %TIME%
구문 분석 : ECHO 실행 전: 10:39:32.60   & TIMEOUT 10   1>NUL  & ECHO 실행 후: 10:39:32.60
실행 :
#>ECHO 실행 전: 10:39:32.60
실행 전: 10:39:32.60
#>TIMEOUT 10   1>NUL
#>ECHO 실행 후: 10:39:32.60
실행 후: 10:39:32.60

:: 두 번째 명령은 변수가 명령 실행 단계에서 확장된다. 즉
입력     : ECHO 실행 전:!TIME! & TIMEOUT 10 > NUL & ECHO 실행 후:!TIME!
구문 분석 : ECHO 실행 전:!TIME!   & TIMEOUT 10   1>NUL  & ECHO 실행 후:!TIME!
실행 :
#>ECHO 실행 전:!TIME!
실행 전:10:52:00.05
#>TIMEOUT 10   1>NUL
#>ECHO 실행 후:!TIME!
실행 후:10:52:10.17
  • 이는 주로 FOR 명령 안에서 IF를 사용할때 주로 사용된다.
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}