본문 바로가기
운영체제/Windows

배치파일에서 setlocal, setlocal enabledelayedexpansion 사용법

by eteo 2024. 12. 11.

 

 

 

 

setlocal

 

- setlocal과 endlocal 이란?

setlocal은 배치 파일 내에서 환경 변수나 코드 블록이 현재 세션에서만 적용되도록 설정하는 명령어이고 endlocal은 setlocal에 의해 생성된 지역 환경 설정을 원래 상태로 복구하는 명령어이다.

 

 

- endlocal을 생략할 수 있는 경우

일반적으로 배치 파일이 끝나면서 세션이 종료되면 자동으로 endlocal이 적용되므로, 배치 파일 마지막에서 endlocal을 생략해도 큰 문제가 생기지 않는다. 하지만 배치파일 내에서 다른 배치파일을 호출하거나 연달아 여러 배치파일을 호출하는 경우 각 setlocal에 맞는 endlocal을 명시적으로 추가해주는 것이 안전하다.

 

 

- setlocal을 사용해야 하는 경우?

  • 배치 파일 내에서 다른 배치파일을 호출하거나 여러 배치 파일을 연달아 호출하는 경우 서로 다른 배치 파일에서 동일한 환경 변수를 사용하더라도 서로 영향을 주지 않도록 환경을 분리하고자 할 때
  • 배치 파일 실행 중 특정 경로에서만 작업을 진행하고, 종료 시 원래 경로로 되돌아가도록 할 때
  • 배치 파일 내부에서만 임시로 설정하는 환경 변수가 해당 배치 파일이 끝나고 난 뒤 시스템 전체에 영향을 미치지 않도록 보호하고자 할 때

 

 

@echo off
setlocal

:: PATH를 일시적으로 변경
set "PATH=%PATH%;C:\NewPath"
echo 현재 PATH: %PATH%

:: 여기서 PATH가 변경된 상태로 프로그램 실행
:: ...

endlocal

 

 

 

 

setlocal enabledelayedexpansion

 

- setlocal enabledelayedexpansion 을 사용해야 하는 경우?

기본적으로 배치 파일에서는 변수의 값을 %변수명% 형태로 참조하는데 일반적인 경우에는 변수 값을 갱신한 뒤 %변수명%으로 참조해도 문제가 없다. 하지만 for 루프나 if 문 안에서 변수를 갱신하고 %변수명%으로 참조하면 갱신되기 전의 값이 읽히는 문제가 있다.

이 때는 enabledelayedexpansion을 사용하고 !변수명! 형태로 참조하면 for나 if 구문 안에서 갱신된 변수 값을 실시간으로 참조할 수 있다. 

 

 

@echo off
setlocal enabledelayedexpansion

set "folder_path=.\test_files"
set "keyword=sample"
set "count=0"

for %%f in ("%folder_path%\*") do (
    set "file_name=%%~nxf"
    if "!file_name!"=="%keyword%" (
        set /a count+=1
    )
)

echo Files with keyword "%keyword%": !count!

endlocal