들어가며
IF 명령은 FOR 명령과 함께 배치파일에서 지원하는 제어 명령이다. 또한 윈도XP는 도스의 그것보다 훨씬 강력한 기능을 제공하고 있다. 이때 if 명령은 가정문을 만들고, for 명령은 반복문을 만드는 데 쓰인다.
말뜻
IF는 말 그대로 "만약"이라는 뜻을 가지고 있다. 그러므로 이 명령어를 발견하면 영어를 읽듯이 읽어가면 된다.
- 참고 : 프로그래을 짜다 보면 프로그래밍 언어의 어순은 영어의 그것과 아주 비슷함을 알 수 있다. 또한 수학의 수식이 배열되는 순서도 영어의 어순과 많이 닮아 있다.
if 기본 문법
명령줄에서 if 사용
if를 명령줄에서 쓸 수도 있지만, 주로 배치파일 안에서 쓰인다.
위 그림을 보면 분명히 명령줄에서 if 명령을 사용하고 있다. 처음 명령은 현재 디렉터리 아래에 aa 디렉터리가 존재하지 않는다면 Not found를 출력하는 명령이며, 둘째 명령은 c:\2 디렉터리가 존재하면 Found를 출력하는 명령이다.
기본 문법
명령줄에서 다음과 같이 입력하면 기본 사용법을 알 수 있다.
if /?
일단 if 명령은 조건문에서 나타나는 결과에 따라 명령어를 수행하게 됩니다. 이때 조건문은 다음과 같은 세 가지입니다.
- 에러레벨문 : IF [NOT] ERRORLEVEL 숫자 명령어
- 문자열 비교문 : IF [NOT] 문자열1==문자열2 명령어
- 파일 존재 검사문 : IF [NOT] EXIST 파일이름 명령어
if 문은 위 세 가지 경우에 각 조건문이 참값을 가지면 뒤따르는 명령어를 실행시킵니다. 또한 세 가지 모두 "NOT"을 사용하여 조건문이 거짓인 경우에 명령어를 실행시킬 수도 있습니다. if, not, errorlevel, exist 등은 대/소문자를 가립니다. 대문자와 소문자를 구별하지 않으려면 /i 선택사항을 이용하면 됩니다. 다만 이 /i 선택사항은 명령 확장을 이용해야 한다. 다시 말해 도스의 if 명령과 호환성이 없다.
이 기본 문법에서는 명령 확장을 제외한 사항만 다룹니다.
말뜻
- NOT은 영어 뜻 그대로 풀이하면 됩니다. 다시 말해 "~이 아니면"이라고 해석하면 됩니다.
- ERRORLEVEL은 마지막으로 실행된 프로그램이 실행 결과로서 사용자에게 반환하는 마침 코드를 가리킵니다. 흔히 반환값이라고 부르며, 0부터 255 사이의 값을 가집니다. 일반적으로 "error level"이라고 띄어 쓰지만, 배치파일에서는 "errorlevel"이라고 자주 붙여 씁니다. 또한 ERRORLEVEL과 %ERRORLEVEL%은 서로 다르므로 주의해야 합니다. 마침코드가 뒤따르는 수보다 크거나 같으면 조건을 참으로 지정합니다.
- 문자열은 "문자의 배열"이라는 뜻입니다. 쉽게 말하자면 화면에 보이는 글자의 모임 또는 묶음이거나, 기억장치에 저장된 문자의 모임 또는 묶음입니다. 명령줄에서 문자열은 <Enter>가 입력될 때까지 명령줄에 나타난 문자의 모임입니다. 또한 환경변수에 저장된 값은 기본적으로 문자열입니다. 이렇듯이 가리키는 대상에 따라 문자열은 조금씩 다르지만, 문자의 모임 또는 문자의 묶음이라는 점에서는 항상 같습니다.
- 문자열의 비교 : 문자열을 비교할 때는 등호를 두 번 써서 비교합니다. 다시 말해 "문자열1==문자열2"와 같은 꼴로 비교하게 됩니다.
- EXIST는 "존재한다"라는 뜻입니다. 이것은 항상 뒤따르는 파일이나 디렉터리가 존재하는지를 묻고, 존재하면 조건을 참으로 지정합니다.
- ELSE는 "~이 아니면"이라는 뜻입니다. 이것은 앞서 나온 IF 명령이 조건을 거짓으로 지정할 경우에 실행하게 됩니다. IF 기본 명령에서는 다루지 않습니다.
예제
ERRORLEVEL문
마침 코드를 검사하여 알맞은 문장을 보여줍니다.
- @echo off
- rem 파일명 : GBackup1H2P.cmd
- rem 지은이 : koc2000/SALM
- rem 저작권 : GPL v3
- rem 예제 11-1.
- rem 고스트 작업이 정상적으로 끝났는지를 알려준다.
- rem 첫 번째 하드디스크 첫 번째 파티션에서
- rem 첫 번째 하드디스크 두 번째 파티션으로 백업한다.
- GHOST.exe -CLONE,MODE=PDUMP,SRC=1:1,DST=1:2\GHOST.GHO -Z9 -AUTO -SURE -RB
- REM ERRORLEVEL 값이 1보다 작으면 NOERROR로 이동한다.
- IF NOT ERRORLEVEL 1 GOTO NOERROR
- ECHO ##############################################
- ECHO ## 백업 도중 오류가 발생했습니다. ##
- ECHO ##############################################
- GOTO END
- :NOERROR
- ECHO ##############################################
- ECHO ## 백업 작업을 정상적으로 마쳤습니다. ##
- ECHO ##############################################
- :END
- REM 배치파일을 종료할 때 마침 코드를 되돌려준다.
- REM 이때 %ERRORLEVEL% 환경변수는 일종의 SET 명령 확장에 해당한다.
- EXIT /B %ERRORLEVEL%
시만텍 사의 프로그램은 오류가 발생하지 않으면 마침 코드로 0을 돌려주고, 오류가 발생하면 1 또는 1보다 큰 값을 돌려준다. 그것을 이용하여 고스트가 제대로 작업을 마쳤는지를 사용자에게 알려줄 수 있다.
- 참고 : 위 GBackup1H2P.cmd 배치파일은 실패작이다. 배치파일을 실행할 환경을 고려하지 않고 작성한 탓에 도스에서도 윈도에서도 디스크를 백업한다는 본래 목적대로 실행이 되지 않는다. 물론 ERRORLEVEL문을 시험하는 예제라는 의미에서는 잘 작동한다.
문자열 비교문
if 명령을 이용하여 문자열을 비교할 수 있다. 도스에서는 문자열에 공백이 들어가는 경우가 없으나, 윈도에서는 공백이 들어갈 수도 있다.
앞서 만든 HelloWho2.cmd 파일을 참조하여 매개변수를 출력하는 배치파일을 만들었다.
- @ECHO OFF
- REM 파일명 : ViewPara.bat
- REM 지은이 : koc2000/SALM
- REM 저작권 : GPL v3
- REM 예제 11-2.
- REM 매개변수를 한 줄에 하나씩 보여준다.
- REM 가장 먼저 %0을 보여준다.
- ECHO %0
- REM for 명령을 쓰지 않고 순환문을 만든다.
- :LOOP_START
- REM %1 매개변수가 없으면 순환문을 끝낸다.
- IF * == %1* GOTO :LOOP_END
- REM %1 매개변수를 출력한다.
- ECHO %1
- REM %(N) 매개변수를 %(N-1) 매개변수로 자리 이동한다.
- SHIFT
- GOTO :LOOP_START
- :LOOP_END
- :END
GOTO 명령은 배치파일 내부에서 레이블이 있는 곳으로 CMD.EXE 명령줄을 옮기는 역할을 한다. 레이블은 앞에 콜론( : )을 붙여 구분하고 있다.
또한 SHIFT 명령은 %0부터 %9까지의 매개변수의 순서를 바꾸어 주는 역할을 한다. 다시 말해 %9는 %8이 되고, %8은 %7이 된다. 그렇게 하나씩 이동하며 %1은 %0이 된다. 또한 %9 바깥에 있던, 지금까지 표현하지 못했던, %10의 위치에 있던 값을 %9로 옮겨 준다.
ViewPara.bat 배치 파일은 윈도와 도스에서 모두 실행할 수 있으나, 실행 결과는 항상 같지 않다.
위는 윈도XP의 명령 프롬프트이며, 아래는 버추얼박스에서 도스 v6.22를 실행한 화면이다. 다른 경우는 모두 같지만, 따옴표로 묶인 부분을 처리하는 방법이 다르다. 다시 말해 윈도XP에서는 따옴표로 묶인 부분은 하나의 문자열로 보았지만, 도스에서는 따옴표는 무시하고 화이트스페이스(공백문자)로 나뉜 부분을 문자열로 보았다.
또한 이 문자열 비교문은 운영체제의 환경변수를 비교할 때도 쓸 수 있다.
파일 존재 검사문
배치파일은 작업에 앞서 파일이나 디렉터리가 존재하는지를 알아볼 수 있는 방법을 제공한다. 바로 "if exist"라는 구문이다.
- @ECHO OFF
- REM 파일명 : FindFile.cmd
- REM 지은이 : koc2000/SALM
- REM 저작권 : GPL v3
- REM 예제 11-3.
- REM 명령줄에서 지정한 파일이 현재 경로에 있는지를 알려준다.
- REM 판별 : %1이 없으면 도움말을 보여준다.
- IF * == %1* GOTO :ViewHelp
- REM 판별 : %1이 있으면 그 파일이 있는지를 보여준다.
- IF EXIST %1 GOTO :Found
- ECHO File %1 was Not Found.
- ECHO.
- GOTO :END
- :Found
- ECHO File %1 was Found.
- ECHO.
- GOTO :END
- REM 도움말
- :ViewHelp
- ECHO FindFile v0.0.1
- ECHO Syntax : FindFile FileName
- ECHO.
- :END
명령줄에서 매개변수로 파일명을 입력받아, 그 파일명에 해당하는 파일이 존재하는지를 알려준다.
다음 예고
IF 명령을 하나씩 짚어보자. (1)
이 글은 스프링노트에서 작성되었습니다.
'스크립트 > 배치파일' 카테고리의 다른 글
IF EXIST (0) | 2009.04.15 |
---|---|
IF ERRORLEVEL에 쓰이는 종료코드 (12) | 2009.04.14 |
배치파일에 매개변수 전달하기 2 (5) | 2009.04.04 |
배치파일에 매개변수 전달하기 (0) | 2009.04.01 |
배치파일 멈추기 (1) | 2009.03.29 |