@echo off : 명령어의 결과만 출력하라. (복창금지)
setlocal enabledelayedexpansion
배치파일에서 IF 문이나 FOR 문은 프로그램의 플로우를 제어하는 제어문이라기 보다는 하나의 명령에 불과한 측면이 있어서 내부의 구문이 처음 실행될 때 한번에 처리되어 버린다. 이게 무슨 말이냐면, 예를 들어서 FOR 문이나 IF문 내부에 %str% 이라는 변수가 있다면, 처음 %str% 구분이 변수의 값으로 치환되어 버린 상태로 전체 FOR, IF 구문이 실행된다는 의미이다.
평소에는 별 문제가 없는데 IF 문이나 FOR 문 안에서 어떤 조건에 따라서 %str% 값이 바뀌는 경우는 이게 문제가 된다. 예를 들어서 str 변수가 FOR, IF 문 내부에서 사용자의 입력을 받도록 되어 있는 경우가 그렇다. 이런 경우를 대비해서 EnableDelayedExpansion 옵션과 변수를 !로 둘러싸는 형태의 표현 구문이 있다.
* EnableDelayedExpansion
- !변수! 형태의 변수는 값의 치환을 선처리하지 않는다.
- 먼저 잘못된 예를 보면, 다음과 같이 for 문은 제대로 동작하지 않는다 (아래의 코드는 현재 디렉토리의 파일 목록을 출력하면서 각 행 앞에 번호를 붙이기 위한 코드이다
[잘못된 코드]
@ECHO OFF
setlocal
set num=0
for %%i in (*.*) do (
set /a num=num+1
echo %num% %%i
)
echo total file: %num%
[기대]
1 list.txt
2 dat.txt
3 test.dat
4 readme.zip
total file: 4
[결과]
0 list.txt
0 dat.txt
0 test.dat
0 readme.zip
total file: 4
- 이 코드가 제대로 동작하기 위해서는 다음과 같이 enabledelayedexpansion 옵션을 주고 변수에서는 % 대신 !를 붙여야 한다.
- !로 둘러쌓인 변수는 치환이 선처리되지 않고 FOR문이 끝날때까지 변수로 취급되므로 프로그램이 정상적으로 작동한다
[올바른 코드]
@ECHO OFF
setlocal enabledelayedexpansion
set num=0
for %%i in (*.*) do (
set /a num=num+1
echo !num! %%i
)
echo total file: %num%
IF 문의 경우에도 마찬가지로 IF 문 내부에서 SET /p 명령을 통해서 입력받은 변수는 사용할 때 !변수! 행태로 사용되어야 한다.
'OS' 카테고리의 다른 글
findstr 명령어 (0) | 2020.06.02 |
---|---|
리눅스 wget 명령어 사용 예제 (0) | 2020.03.29 |
[Linux] MAC time 확인 (0) | 2020.03.12 |
CentOS 6 APM install (소스 설치) (0) | 2020.03.02 |
바이너리 파일에서 문자열 추출하기 (strings 명령어) (0) | 2020.02.26 |