Tuesday, August 01, 2006
배치파일 종료시 변수 자동으로 지우기, 변수 중복 방지, 변수 지역화: SETLOCAL / ENDLOCAL
※ 여기서 소개하는 SETLOCAL / ENDLOCAL 문은, 윈도98이나 MS-DOS 6.0 등의 16비트 도스 환경에서는 쓸 수 없습니다. 윈도2000이나 윈도XP이상의 OS에서만 가능합니다. (단, 4DOS 를 사용할 때에는 16비트 도스에서도 가능)
배치 파일을 종료하더라도 배치 파일 안에서 정의한 변수들은, 자동으로 지워지지 않고, 환경 변수에 계속 남아 있습니다. 지저분하기도 하고, 위험할 수도 있습니다. 그래서 배치 파일 안에서 변수들을 직접 지워 주어야 합니다. 그런데 사용한 변수들의 개수가 많다면 이 작업이 번거롭습니다. 변수들을 자동으로 지우는 방법이 있습니다.
변수를 정의하는 부분 앞에, setlocal 문을 놓는 것입니다.
이러면 배치파일을 종료할 때 %TEST% 라는 변수가 자동으로 사라집니다. 그러나 변수를 정의하는 부분 뒤에 놓으면 그 변수는 자동으로 지워지지 않습니다. setlocal 은 자신의 뒤에 있는 문장들에게만 적용됩니다.
이것은 배치 파일 안에서, 기존의 PATH 라는 환경변수를 재정의해서 사용하는 것을 예로 든 예제입니다:
이 배치 파일 내에서만 PATH 는 D:\Games 이고, 배치 파일 밖의 PATH는
C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem
이렇게 여전히 원래의 값입니다. 그리고 배치 파일을 종료하더라도, PATH의 값은 변함이 없습니다. 이것은 setlocal 문의 작용 때문입니다.
만약 위의 예제에서 setlocal문이 없다면, 이 배치 파일을 한번 실행한 후에는 시스템의 PATH 환경변수의 내용들이 D:\Games 로 고정되어 버려서, 다른 프로그램들이 제대로 실행되지 않게 됩니다. 즉 변수들이 충돌하는 것입니다.
여기서는 PATH 라는 환경변수를 예로 들었지만, 복잡한 배치를 작성할 때에는, 배치 파일 밖의 같은 이름의 변수 때문에 에러가 생기는 경우가 많습니다. 원래 배치 파일의 독자적인 변수가 없고, 시스템의 변수를 함께 공유하기 때문에 이런 문제가 생기는데, 이때 setlocal 은 배치 파일 속의 변수들을 시스템의 변수들과 완전히 분리시키는 역할을 합니다. 따라서 setlocal문 뒤에 정의된 변수들은 그 배치 파일 안에서만 작용하는 독자적인 변수가 됩니다. 즉 변수의 지역화가 이루어집니다.
좀더 쉽게 요약하자면,
배치 파일 내에서 정의한 어떤 변수가, 배치 파일 밖의 기존의 변수와 이름이 같을 경우, 또는 이름이 같을 가능성이 높을 경우, 변수를 정의하기에 앞서 setlocal 을 사용하면 됩니다.
setlocal문 뒤에서부터는 변수의 지역화가 이루어집니다. 즉 배치 파일 속의 변수가, 배치 파일 밖의 변수와 이름이 같더라도 공유되지 않고 전혀 무관해집니다. 그런데 배치 파일 내의 특정 부분에서 지역화를 끝내야 할 때가 있습니다. 이때 endlocal 을 사용하면 됩니다. endlocal 뒤에서부터는 setlocal의 효력이 사라지고, 다시 배치 파일 속의 변수들은 시스템의 변수들과 같은 공간을 공유하게 됩니다.
▶▶ 배치 파일에서의 변수 사용 [배치 파일 작성법] - DOS Batch Variable
변수 자동으로 지우기
배치 파일을 종료하더라도 배치 파일 안에서 정의한 변수들은, 자동으로 지워지지 않고, 환경 변수에 계속 남아 있습니다. 지저분하기도 하고, 위험할 수도 있습니다. 그래서 배치 파일 안에서 변수들을 직접 지워 주어야 합니다. 그런데 사용한 변수들의 개수가 많다면 이 작업이 번거롭습니다. 변수들을 자동으로 지우는 방법이 있습니다.
변수를 정의하는 부분 앞에, setlocal 문을 놓는 것입니다.
@echo off
setlocal
set TEST=foo
echo %TEST%
setlocal
set TEST=foo
echo %TEST%
이러면 배치파일을 종료할 때 %TEST% 라는 변수가 자동으로 사라집니다. 그러나 변수를 정의하는 부분 뒤에 놓으면 그 변수는 자동으로 지워지지 않습니다. setlocal 은 자신의 뒤에 있는 문장들에게만 적용됩니다.
변수 중복 방지하기
이것은 배치 파일 안에서, 기존의 PATH 라는 환경변수를 재정의해서 사용하는 것을 예로 든 예제입니다:
@echo off
setlocal
set PATH=D:\Games
echo %PATH%
setlocal
set PATH=D:\Games
echo %PATH%
이 배치 파일 내에서만 PATH 는 D:\Games 이고, 배치 파일 밖의 PATH는
C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem
이렇게 여전히 원래의 값입니다. 그리고 배치 파일을 종료하더라도, PATH의 값은 변함이 없습니다. 이것은 setlocal 문의 작용 때문입니다.
만약 위의 예제에서 setlocal문이 없다면, 이 배치 파일을 한번 실행한 후에는 시스템의 PATH 환경변수의 내용들이 D:\Games 로 고정되어 버려서, 다른 프로그램들이 제대로 실행되지 않게 됩니다. 즉 변수들이 충돌하는 것입니다.
여기서는 PATH 라는 환경변수를 예로 들었지만, 복잡한 배치를 작성할 때에는, 배치 파일 밖의 같은 이름의 변수 때문에 에러가 생기는 경우가 많습니다. 원래 배치 파일의 독자적인 변수가 없고, 시스템의 변수를 함께 공유하기 때문에 이런 문제가 생기는데, 이때 setlocal 은 배치 파일 속의 변수들을 시스템의 변수들과 완전히 분리시키는 역할을 합니다. 따라서 setlocal문 뒤에 정의된 변수들은 그 배치 파일 안에서만 작용하는 독자적인 변수가 됩니다. 즉 변수의 지역화가 이루어집니다.
좀더 쉽게 요약하자면,
배치 파일 내에서 정의한 어떤 변수가, 배치 파일 밖의 기존의 변수와 이름이 같을 경우, 또는 이름이 같을 가능성이 높을 경우, 변수를 정의하기에 앞서 setlocal 을 사용하면 됩니다.
ENDLOCAL 문에 대해
setlocal문 뒤에서부터는 변수의 지역화가 이루어집니다. 즉 배치 파일 속의 변수가, 배치 파일 밖의 변수와 이름이 같더라도 공유되지 않고 전혀 무관해집니다. 그런데 배치 파일 내의 특정 부분에서 지역화를 끝내야 할 때가 있습니다. 이때 endlocal 을 사용하면 됩니다. endlocal 뒤에서부터는 setlocal의 효력이 사라지고, 다시 배치 파일 속의 변수들은 시스템의 변수들과 같은 공간을 공유하게 됩니다.
▶▶ 배치 파일에서의 변수 사용 [배치 파일 작성법] - DOS Batch Variable
tag: batch
배치파일 | DOS CMD BATCH .BAT
<< Home