kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

OS

배치 파일 명령어 모음(작성중)

까마기 2020. 3. 25. 17:01
728x90
반응형

@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%

[기대]
list.txt
dat.txt
test.dat
readme.zip
total file: 4

[결과]
list.txt
dat.txt
test.dat
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