nickjoIT

IF 사용법 본문

PROGRAMING/Batch

IF 사용법

nickjo 2016. 4. 14. 11:15
IF, IF NOT, IF EXIST, IF ERRORLEVEL, ELSE


지금부터가 진짜 배치파일입니다. 위에서 다뤘던 내용들은 그냥 준비운동 정도였고 배치파일에서 가장 많이 사용되는 (저만 가장 많이 사용하는지도 모르지만 ;;;) 구문이 바로 IF, FOR, SET 입니다. 이 3가지 구문이 배치파일의 꽃이라고 저는 생각합니다. 특히 저는 FOR 반복문을 매우 자주 사용하는 편인데, FOR 구문을 잘 활용하시면 "감히 배치파일로 이게 가능한가?" 생각했던 기능들도 훌륭히 만들어낼 수 있습니다.

IF는 말 그대로 "~인지 아닌지" 를 판단합니다. 만약 조건이 참이면 그 뒤에 나오는 명령어를 수행하고 참이 아니면 다음 줄로 넘어갑니다. 

IF 문자열1==문자열2 명령어

예제)
set A=snoopy
if %A%==snoopy echo %A%는 snoopy와 같습니다.
set B=snoopybox
if %B%==snoopy echo %B%는 snoopy와 같습니다.


위 예제에서 첫번째 IF 구문은 조건이 참이기 때문에 "snoopy는 snoopy와 같습니다." 문구를 출력해줍니다. 하지만 두번째 IF 구문은 조건이 거짓이기 때문에 그 뒤에 나오는 echo 명령어는 무시됩니다.

IF 뒤에 /i 를 붙이시면 대소문자를 구분하지 않습니다. 이게 윈도우에선 IF 도움말에 잘못 표기되어 있네요. /i를 붙이면 대소문자 구분이 없고, 안 붙이면 대소문자를 구분합니다. 도움말에는 반대로 나와 있습니다.


숫자 비교에는 아래 비교연산자들이 사용됩니다.

    EQU - 같음
    NEQ - 같지 않음
    LSS - 보다 작은
    LEQ - 작거나 같음
    GTR - 보다 큰
    GEQ - 크거나 같음

예제)
if 5 equ 5 echo 5는 5와 같습니다.
if 5 neq 5 echo 5는 5와 같지 않습니다.
if 5 lss 5 echo 5는 5보다 작습니다.
if 5 leq 5 echo 5는 5보다 작거나 같습니다.
if 5 gtr 5 echo 5는 5보다 큽니다.
if 5 geq 5 echo 5는 5보다 크거나 같습니다.


위 예제에서는 1, 4, 6번째 줄만 참이기 때문에 뒤에 있는 echo가 출력되겠지요? 대충 저렇게 쓴다는 것만 알고 다음으로 넘어갑니다.


IF NOT은 IF와 반대로 생각하면 됩니다. 뒤에 나온 조건이 거짓인 경우에 IF NOT은 참이 되기 때문에 명령을 실행하게 됩니다.

예제)
if not snoopy==snoopy echo 과연 이 메시지가 출력될까?

위 예제를 실행하면 echo 다음에 나오는 메시지가 출력되지 않습니다. IF NOT이니까요. 하지만 만약에 if not snoopy==snoopybox 했다면 뒤에 나오는 명령어는 출력이 되었겠지요?


IF EXIST는 지정한 파일, 폴더가 존재하면 조건을 참으로 받아줍니다. 대략 아래와 같은 예를 만들어 보겠습니다.

예제)
if exist %windir%\syswow64 echo 이 윈도우는 64비트입니다.
if not exist %windir%\syswow64 echo 이 윈도우는 64비트가 아닙니다.


위 예제를 실행하면 64비트 윈도우인 경우 첫번째 echo 구문만 출력될 것이고, 32비트 윈도우인 경우 두번째 echo 구문만 출력될 것입니다. 마찬가지로 IF EXIST 구문도 IF NOT EXIST로 활용할 수 있습니다.


IF ERRORLEVEL 역시 제가 자주 사용하는 구문인데 마지막으로 실행된 프로그램의 종료코드가 무엇인지를 가지고 조건을 판단합니다. 일반적으로 아무런 오류가 없이 잘 실행된 경우에는 종료코드가 0입니다. 오류가 발생하면 종료코드는 1 이상입니다. IF ERRORLEVEL 1  하시면 종료코드가 1보다 크거나 같은 경우 참으로 인식합니다.

예제)
ren C:\Windows WindowsXP
if errorlevel 1 echo 윈도우 폴더는 이름을 변경할 수 없어요.


위 예제에서 첫번째 줄에 Windows 폴더 이름을 WindowsXP로 변경하라고 합니다. 말이 안 되죠? 당연히 오류가 발생할 수 밖에 없습니다. 따라서 두번째 줄에 있는 IF ERRORLEVEL 1 구문은 바로 위에서 오류가 발생했기 때문에 값이 참으로 지정되어 echo 뒤에 나오는 문구를 출력해줍니다.


ELSE는 IF랑 묶어서 사용하는데 여기서부터는 괄호를 사용하겠습니다. 이 괄호를 보기좋게 잘 써야 프로그램을 체계적으로 짤 수 있고, 나중에 자기가 봐도 흐름이 한 눈에 보입니다. 위에서 예를 들었던 윈도우 64비트 판별을 ELSE로 표현해보자면

예제)
if exist %windir%\syswow64 (
          echo 이 윈도우는 64비트입니다.
) else (
          echo 이 윈도우는 64비트가 아닙니다.
)


그러니까 ELSE는 IF 조건이 거짓인 경우 실행됩니다. IF가 옳으면 IF 구문 뒤에 있는 명령어가 실행되고, 그게 아니면 ELSE 뒤에 있는 명령어가 실행됩니다. 둘중에 하나만 무조건 실행되게 만드는 양자택일 구문이라 보시면 됩니다.


여기까지 대충 IF 구문에 대해 알아봤는데요 실전 예제 몇가지를 소개해봅니다. 아래는 제가 아이폰 4 AVI, MKV 동영상을 MP4로 한방에 변환하기 글에서 사용한 SRT 자막 통합 스크립트입니다.


예제)
set list=자막 통합에 실패한 파일 목록.txt
if exist *.srt (
     if not exist temp md temp
     for %%a in (*.srt) do (
          if exist "%%~na.mp4" (
               Tools\mediainfo "%%~na.mp4" > temp\temp1.txt
               findstr /c:"Codec ID                         : tx3g" temp\temp1.txt > nul
               if errorlevel 1 (
                    Tools\mp4box -add "%%a":lang=ko:hdlr=sbtl "%%~na.mp4"
                    if errorlevel 1 echo %%~na.mp4 >> "%list%"
               ) else (
                   Tools\mp4box -add "%%~na.mp4"#video -add "%%~na.mp4"#audio -add "%%a":lang=ko:hdlr=sbtl "%%~na-new.mp4"
                   if errorlevel 1 echo %%~na.mp4 >> "%list%"
              )
         )
    )
)



list 라는 변수에 "자막 통합에 실패한 파일 목록.txt" 문자열을 할당하라
현 위치에 확장자 SRT 파일이 존재하면 (
     TEMP 폴더가 없다면 TEMP 폴더를 만들어라
     모든 SRT 파일에 대하여 다음 반복문을 실행하라 (
          만약 SRT 파일과 동일한 이름의 MP4 파일이 존재한다면 (
               미디어인포 프로그램으로 MP4 파일의 정보를 TEMP 폴더의 TEMP1.TXT 파일로 저장하라
               TEMP 폴더의 TEMP1.TXT 파일에서 Codec ID : tx3g 문구가 있는지 찾아봐라
               만약 이 문구가 없다면 (
                    기존에 있던 MP4 파일에 자막만 통합하라
                    만약 자막 통합시 오류가 발생했다면 MP4 파일 이름을 LIST 파일에 저장하라
               ) 만약 이 문구가 있다면 (
                    기존 MP4 파일에서 영상과 음성을 추출하고 자막을 통합하여 새로운 MP4 파일을 만들라
                    만약 자막 통합시 오류가 발생했다면 MP4 파일 이름을 LIST 파일에 저장하라
               )
          )
     )
)


말로 설명하려니 좀 지저분한데 아무튼 위 예제에는 IF, IF NOT, IF EXIST, IF ERRORLEVEL, ELSE 모두 다 적절히 잘 활용되어 있습니다.


[참고사이트]

http://snoopybox.co.kr/1404

Comments