If - 13

그대가 고난에 처해
위급하다면,
나, 그대를 업고,
그 고난을 넘으리.
나, 그대의 기사이기에.

덧붙이는 말

제가 즐겨 쓰는 아이디 Knight과 관련한 내용입니다.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제137번제] 사랑과 고민  (0) 2010.09.23
[제136번제] 꽃말 모음 4  (0) 2010.09.22
[제135번제] 만약... 13  (0) 2010.09.21
[제134번제] 우울  (0) 2010.09.20
[제133번제] 삐삐약어 5  (0) 2010.09.20
[제132번제] 별의 만남 6  (0) 2010.09.19
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 12

그대가 행복하고
영광에 둘린 때 오면,
나, 그대 앞에 무릎 꿇고
사랑을 맹세하리.

덧붙이는 말

이 글은 원래 '만약 11번 글'이었습니다. 최근에 적은 글이 중간에 하나 끼어들어서 뒤로 밀린 셈이죠. 또한 '만약' 시리즈는 거의 다 나왔다고 보시면 됩니다.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제125번제] 삐삐약어 4  (0) 2010.09.14
[제124번제] 가님 빈 아유이브  (0) 2010.09.13
[제123번제] 만약... 12  (0) 2010.09.13
[제122번제] 꽃말 모음 2  (0) 2010.09.12
[제121번제] 삐삐약어 3  (0) 2010.09.11
[제120번제] 사랑이란? 66  (0) 2010.09.10
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 11

그대 웃음이
햇살처럼 맑다면,
나, 옹달샘 맑은 물에
햇살을 비추어 보리.

덧붙이는 말

햇살에 대한 내용이 유독 많은데, 그때 내가 "사랑"을 "따스함" 또는 "빛"으로 정의한 적이 잦았기 때문으로 여겨집니다.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제113번제] 사랑이란? 64  (2) 2010.09.06
[제112번제] 사랑이란? 63  (0) 2010.09.05
[제111번제] 만약... 11  (0) 2010.09.04
[제110번제] 사랑이란? 62  (0) 2010.09.04
[제109번제] 삐삐약어 1  (0) 2010.09.03
[제108번제] 만약... 10  (0) 2010.09.02
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 10

그대 웃음이
햇살처럼 따스하다면,
나, 양지에 누워
단잠에 취해 보리.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제110번제] 사랑이란? 62  (0) 2010.09.04
[제109번제] 삐삐약어 1  (0) 2010.09.03
[제108번제] 만약... 10  (0) 2010.09.02
[제107번제] 애국 2  (0) 2010.09.01
[제106번제] 만약... 9  (0) 2010.09.01
[제105번제] 다이아몬드와 석탄  (0) 2010.09.01
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 9

그대 웃음이
햇살처럼 밝다면,
나, 밤의 어둠을
두려워 않으리.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제108번제] 만약... 10  (0) 2010.09.02
[제107번제] 애국 2  (0) 2010.09.01
[제106번제] 만약... 9  (0) 2010.09.01
[제105번제] 다이아몬드와 석탄  (0) 2010.09.01
[제104번제] 사랑이란? 61 - 이어주는 마음  (0) 2010.08.31
[제103번제] 왜?  (0) 2010.08.31
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 8

그대 손에
물집 잡혀 터진다면,
나, 그대 손을
고이고이 감싸리.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제88번제] 비와 사랑  (0) 2010.08.18
[제87번제] 사랑이란? 52  (0) 2010.08.18
[제86번제] 만약... 8  (0) 2010.08.18
[제85번제] 유일한 표현 방법  (0) 2010.08.17
[제84번제] 내가 사랑하는 사람아! 2  (0) 2010.08.17
[제83번제] 사랑과 불륜  (0) 2010.08.16
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 7

그대 등에
날개가 달린다면,
나, 그대 날개의 이룰
깃털이 되리.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제79번제] 사랑이란? 50  (0) 2010.08.12
[제78번제] 사랑이란? 49  (0) 2010.08.11
[제77번제] 만약... 7  (0) 2010.08.10
[제76번제] 만약... 6  (0) 2010.08.09
[제75번제] 나는 사랑한다.  (0) 2010.08.08
[제74번제] 만약... 5  (0) 2010.08.07
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 6

그대 발이
부르텄다면,
나, 그대 발을 싸맬
발싸개 되리.

덧붙이는 말

원래는 발싸개 대신에 '천'이라고 하려고 했는데, 생각해 보니 발싸개가 꼭 천이라는 법이 없었다. 그래서 발싸개로 낙점.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제78번제] 사랑이란? 49  (0) 2010.08.11
[제77번제] 만약... 7  (0) 2010.08.10
[제76번제] 만약... 6  (0) 2010.08.09
[제75번제] 나는 사랑한다.  (0) 2010.08.08
[제74번제] 만약... 5  (0) 2010.08.07
[제73번제] 만약... 4  (0) 2010.08.06
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 5

그대 몸이
세상 모진 풍파에 곤하다면,
나, 그대 쉴 만한
안식처 되리.

덧붙이는 말

원래는 안식처 대신에 '항구'라고 하려고 했다. 그런데 항구 말고 '만'도 안식처로서 기능을 했다는 사실을 알고서 고쳤다.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제76번제] 만약... 6  (0) 2010.08.09
[제75번제] 나는 사랑한다.  (0) 2010.08.08
[제74번제] 만약... 5  (0) 2010.08.07
[제73번제] 만약... 4  (0) 2010.08.06
[제72번제] 만약... 3  (0) 2010.08.05
[제71번제] 얼마나 사랑하냐고요? 6  (0) 2010.08.04
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 4

그대 얼굴이
굳건한 반석이라면,
나, 그 위에 영광스러운
그대 이름을 새겨 놓으리.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제75번제] 나는 사랑한다.  (0) 2010.08.08
[제74번제] 만약... 5  (0) 2010.08.07
[제73번제] 만약... 4  (0) 2010.08.06
[제72번제] 만약... 3  (0) 2010.08.05
[제71번제] 얼마나 사랑하냐고요? 6  (0) 2010.08.04
[제70번제] 사랑이란? 48  (0) 2010.08.03
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 3

그대 슬픔이
저 하늘이라면,
나, 그 하늘에 희망을 불러오는
무지개를 걸어 놓으리.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제74번제] 만약... 5  (0) 2010.08.07
[제73번제] 만약... 4  (0) 2010.08.06
[제72번제] 만약... 3  (0) 2010.08.05
[제71번제] 얼마나 사랑하냐고요? 6  (0) 2010.08.04
[제70번제] 사랑이란? 48  (0) 2010.08.03
[제69번제] 별의 만남 2  (0) 2010.08.02
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 2

그대 눈물이
하늘에서 떨어지는 빗방울이라면,
나, 그 빗물 받아
갈급한 목을 축이리라.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제56번제] 가장 아름다운 말  (0) 2010.07.20
[제55번제] 사랑이란? 36  (0) 2010.07.19
[제54번제] 만약... 2  (0) 2010.07.18
[제53번제] 만약... 1  (0) 2010.07.17
[제52번제] 사랑 이야기  (0) 2010.07.16
[제51번제] 사랑이란? 35  (0) 2010.07.15
Posted by koc/SALM 트랙백 0 : 댓글 0

If - 1

그대 눈물이 바다라면,
나, 그 바다를 먹물 삼아
그대 슬픔을 노래하리라.

덧붙이는 말

천일번제에는 "사랑이란?"과 함께 가장 많이 등장하는 문구가 바로 "If"(만약)입니다.

'말의 나무 > 천일번제' 카테고리의 다른 글

[제55번제] 사랑이란? 36  (0) 2010.07.19
[제54번제] 만약... 2  (0) 2010.07.18
[제53번제] 만약... 1  (0) 2010.07.17
[제52번제] 사랑 이야기  (0) 2010.07.16
[제51번제] 사랑이란? 35  (0) 2010.07.15
사랑이란? 34 - 사랑고백  (0) 2010.07.14
Posted by koc/SALM 트랙백 0 : 댓글 0

들어가며

IF 명령 확장은 IF 명령이 가진 기능을 추가하고 넓힌다는 뜻으로, IF 명령으로 여러 가지 다른 처리를 할 수 있도록 해 준다. 앞서 나온 IF 문자열에서도 일부 소개하였지만, 윈도XP의 IF 명령은 상당히 뛰어난 기능을 제공하고 있다. 대부분 IF 문자열 기능에 포함되어 있고, 여기에서는 IF 문자열에서 설명하지 않은 부분만을 설명하겠다.

말뜻

IF 명령 확장에는 세 문자로 이루어진 비교 연산자(연산자 확장)와 IF CmdExtVersion 구문 및 IF Defined 구문이 있다.

  • 세 문자로 이루어진 비교 연산자는 IF 문자열을 참조하세요.
  • IF CmdExtVersion 수 : 윈도XP의 도움말 및 지원 센터의 설명에 따르면, Cmd.exe의 명령 확장 기능과 관련된 내부 버전 번호가 '수'보다 크거나 같은 경우에만 참인 조건을 지정합니다. 첫째 버전은 '1'이며 의미있는 향상을 명령 확장에 추가할 때 하나씩 증가합니다. 명령 확장을 사용할 수 없게 설정하면 CmdExtVersion 조건은 항상 거짓입니다. 명령 확장이 사용 가능한지를 검사할 때도 사용할 수 있습니다. CmdExtVersion의 정확한 값을 알고 싶다면 명령행에서도 "echo %CmdExtVersion%"라고 입력해 보라.
  • IF Defined 환경변수 : 지정한 환경변수가 정의되어 있으면 참값을, 그렇지 않으면 거짓값을 돌려준다.

IF CmdExtVersion 구문

명령확장을 사용할 수 있는지를 사용할 수 있다. 또한 명령확장의 버전을 검사하여 배치파일 실행 여부를 판단할 때도 쓸 수 있다.

  1. if CmdExtVersion 2 (
  2. echo 윈도XP에서 명령확장을 사용할 수 있습니다.
  3. ) else echo 윈도XP가 아니거나 명령확장을 사용할 수 없습니다.

위와 같은 형식이 가장 기본적이다. echo 문은 예시일 뿐이니, 저 부분에 자신이 실행하기를 바라는 명령을 넣으면 된다.

또한 단순히 명령확장을 사용할 수 있는지를 알려면 다음과 같이 하면 된다.

  1. if CmdExtVersion 0 (
  2. echo 명령확장을 사용할 수 있습니다.
  3. ) else echo 윈도NT 계열이 아니거나 명령확장을 사용할 수 없습니다.

명령확장을 사용할 수 있다면 "if CmdExtVersion 0"은 무조건 참이 되어야 하므로 위의 예제는 명령확장을 사용할 수 있는지를 검증해 주는 코드가 된다.

IF Defined 구문

IF Defined 구문은 IF 문자열 구문의 확장으로 볼 수 있다.

  1. if not * == %var%* echo Variable %var% is defined.
  2. if not * == %var%* echo 환경변수 %var%이(가) 정의되어 있습니다.

위 두 문장은 출력문만 다를 뿐 완전히 같다. 환경변수가 정의되어 있다면 항상 문자열 값을 가지게 되므로 위의 구문에서 참값을 가지게 된다. 결국 "환경변수 %var%이(가) 정의되어 있습니다."라고 출력한다는 뜻이다. 이때 *(별표) 대신 다른 문자를 사용해도 결과는 같으나, %, ^, & 등은 사용하지 않는 것이 좋다. 특히 %와 ^는 배치파일에서 특별한 작용을 하므로 if문에 사용했을 경우 그 효과를 정확히 알고 사용해야 한다.

위의 예제를 Defined 를 이용하여 고치면 다음과 같다.

  1. if Defined %var% echo Variable %var% is defined.
  2. if Defined %var% echo 환경변수 %var%이(가) 정의되어 있습니다.

if Defined 환경변수 구문을 이용하게 되면 세 환경변수―%errorlevel%, %cmdcmdline% 및 %cmdextversion%―를 사용할 수 있게 됩니다. %errorlevel% 환경변수는 마지막으로 실행한 프로그램이 돌려주는 종료코드를 저장하고, %cmdcmdline% 환경변수는 마지막으로 실행한 명령줄을 저장합니다. 그리고 %cmdextversion% 환경변수는 앞서 설명했듯이 명령확장의 버전을 저장하고 있습니다.

과제

지난 번 과제는 다음 구문을 옳게 고치라는 문제였습니다.

  1. rem Compare.cmd
  2. IF /i NOT %1 EQU %2 ECHO %1 is equal %2 ELSE ECHO %1 is not equal %2 .

아래와 같이 하면 된다. 빨간 색 부분을 유심히 살펴보기 바란다.

  1. rem Compare.cmd
  2. IF /i %1 EQU %2 ( ECHO %1 is equal %2 ) ELSE ECHO %1 is not equal %2 .

다음 예고

GOTO문을 설명하기에 앞서 잠시 쉬어가는(?) 시간을 갖도록 하자. 다음에는 환경변수에 대해서 알아보겠다.

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

FOR 명령  (6) 2009.05.16
GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
Posted by koc/SALM 트랙백 0 : 댓글 1

IF 문자열

2009.04.18 22:42 from 스크립트/배치파일

들어가며

IF 문자열 비교 구문은 말 그대로 문자열을 비교하는 구문이다. 이것은 윈도NT 계열에서 추가된 환경 변수 등을 이용하여 여러 가지 작업을 할 수 있도록 해준다. 문자열의 내용을 분석하여 정수(십진수, 팔진수, 십육진수)로 변환하여 계산해 주기도 한다.

말뜻

IF 문자열 비교 구문에서는 일반적으로 등호를 두 개 겹쳐서 쓰게 된다.

  1. if [not] 문자열1==문자열2 명령 [else 구문]

위와 같은 형식을 이루게 된다. 이때 큰괄호( [ ] )로 묶인 부분은 반드시 쓸 필요는 없고 필요할 때 쓰면 된다. 또한 문자열에 공백을 포함하지 않았다면 따옴표를 사용하지 않아도 된다.

문자열 비교 구문의 명령 확장

확장 1

명령 확장이라고 말하기는 했으나, 사실 /i 선택자는 cmd.exe에 포함된 if 명령에서는 기본 선택자이다. 다만 도스의 if 명령과 호환성이 없기 때문에 확장이라고 칭했을 뿐이다.

문자열 비교 구문에서 /i 선택자를 쓰게 되면 그 기능을 확장할 수 있다. 이것은 대문자와 소문자를 무시하고 문자열을 비교하게 됩니다.

  1. IF STRING==string ECHO STRING is string.

위의 문자열 비교 구문은 거짓을 돌려주므로 화면에 아무것도 보여주지 않는다. 그러나 아래 문자열 비교 구문은 참을 돌려주므로 화면에 "STRING is string."이라는 문자열을 출력해 준다.

  1. IF /i STRING==string ECHO STRING is string.

확장 2

문자열 비교 구문에서는 세 문자로 이루어진 비교 연산자를 사용할 수 있다. 이것은 /i 선택자를 사용하여 융통성을 가지는데, 예컨대 숫자로만 이루어진 문자열은 수로 변환하여 비교해 준다.

세 문자로 이루어진 비교 연산자에는 다음과 같은 것이 있다.

  • EQU (같음)
  • NEQ (같지 않음)
  • LSS (보다 작음)
  • LEQ (작거나 같음)
  • GTR (보다 큼)
  • GEQ (크거나 같음)

비교 연산자는 언뜻 보아서는 숫자로 이루어진 문자열에만 쓰일 듯이 보이지만 로마자 등으로 이루어진 문자열에도 쓰일 수 있다.

예제 1

  1. IF /i 22 EQU 026 ECHO 22 is 026.

위의 코드는 10진수 22와 8진수 026을 비교하는 구문이다. 당연히 두 값은 크기가 같으므로 화면에 문자열을 출력해 준다.

  1. IF /i 026 EQU 0X16 ECHO 026 is 0X16.

위의 코드는 8진수 026과 16진수 0x16을 비교하는 구문이다. 당연히 두 값은 크기가 같으므로 화면에 문자열을 출력해 준다. 

두 예제는 /i 선택자가 문자열을 확장하여 "일반적으로 해석"하는 예시이다. 다시 말해 문자열 22는 10진수 22로 해석해 주며, 026은 8진수로, 0x16은 16진수로 해석해 준다. 10진수는 0으로 시작할 수 없으며, 0으로 시작하는 수는 8진수이거나 16진수가 된다. 또한 0으로 시작하는 문자열 가운데 0x로 시작하는 문자열은 16진수로 여기게 된다.

하지만 089 등의 문자열은 올바르지 않으므로 오류가 발생하게 된다. 이는 8진수에 8과 9와 같은 숫자는 존재하지 않기 때문이다. 마찬가지로 0x9G 등의 문자열도 올바르지 않다고 여긴다. 이럴 경우 문자열을 수로 확장해 주지 않고, 문자열 자체(리터럴 문자열)로서 비교하게 된다. 참고로 순수한 문자열을 리터럴 문자열(literal string), 수치로서 변환되는 문자열을 숫자 문자열(number string / numeric string)이라고 부른다.

한편 다음에 오는 두 비교문은 서로 다른 결과를 가진다.

  1. IF /i 22 EQU 026 ECHO 22 is 026.

위의 비교문은 수치 비교문으로 참값을 돌려주므로 "22 is 026."을 출력한다.

  1. IF /i 22 == 026 ECHO 22 is 026.

위의 비교문은 리터럴 문자열 비교문으로 거짓값을 돌려주므로 아무것도 출력하지 않는다.

다시 말해 숫자로 이루어진 문자열을 숫자 문자열로서 비교하려면 반드시 문자로 이루어진 비교 연산자를 사용해야 한다.

또한 다음과 같이 사용할 수도 있다.

  1. IF /i abc EQU ABC ECHO abc is ABC.

또는

  1. IF /i NOT abc EQU ABC ( ECHO abd is ABC ) ELSE ECHO abd is not ABC .

앞서 말했듯이 세 문자로 이루어진 비교 연산자로 숫자 문자열뿐만 아니라 리터럴 문자열까지 비교할 수 있다.

  1. IF /i abc NEQ ABC ( ECHO abd is ABC ) ELSE ECHO abd is not ABC .

위의 비교문도 정상 작동한다.

예제 2

그렇다면 작거나 같음을 비교할 때는 어떻게 동작할까? LSS (보다 작음), LEQ (작거나 같음), GTR (보다 큼), GEQ (크거나 같음)과 같은 세 문자로 이루어진 비교 연산자를 이용하여 대문자와 소문자를 비교해 보자,

  1. IF /i 22 LSS 027 ECHO 22 is less than 027.

위 예제는 10진수 22가 8진수 027보다 작으면 뒤따르는 문자열을 출력하라는 문자열 비교문입니다.

그러면 다음과 같은 두 가지 예문은 어떻게 작동할까?

  1. IF /i abc LSS ABC ECHO abc is less than ABC.
  2. IF abc LSS ABC ECHO abc is less than ABC.

우선 1행은 아무런 출력이 없다. 왜냐하면 /i 선택자 때문에 대문자와 소문자를 무시하고 비교했기 때문이다. 그러나 2행은 소문자 abc가 대문자 ABC보다 더 작은 값으로 해석되어 문자열 "abc is less than ABC."을 출력해 준다.

  1. IF ABC GTR abc ECHO ABC is greater than abc.

마찬가지로 위의 코드는 대문자 ABC가 소문자 abc보다 더 큰 값으로 해석되어 "ABC is greater than abc."라는 문자열을 출력해 준다.

위와 같이 대문자와 소문자 비교에서 대문자가 소문자보다 더 크다고 판정함을 알 수 있다.

예제 3

그 다음으로 문자간 비교를 해볼 수 있다.

  1. IF d GTR a ECHO D is greater than A.

위의 예제는 문자여을 출력해 준다. 다시 말해 문자열 d가 문자열 a보다 더 큰 값을 가진다고 판단함을 알 수 있다. 반대로 아래와 같은 비교문도 성립한다.

  1. IF a LSS d ECHO a is less than d.

로마자 알파벳을 비교할 때 순서가 빠른 문자를 더 작다고 판단함을 알 수 있다.

  1. IF 가 LSS 나 ECHO 가 is less than 나.

한글 문자열을 비교할 때도 성립한다.

  1. IF 가 LSS d ECHO 가 is less than d.

한글을 로마자보다 더 작다고 판정하고 있다.

과제

아무도 검사하지 않는 과제가 또 나왔습니다. 헤헤 ^^a

  1. rem Compare.cmd
  2. IF /i NOT %1 EQU %2 ECHO %1 is equal %2 ELSE ECHO %1 is not equal %2 .

위의 배치 파일이 정상적으로 작동하도록 고쳐 보자.

다음 예고

IF 명령을 하나씩 짚어보자. (4) : IF 명령확장

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
Posted by koc/SALM 트랙백 0 : 댓글 4

IF EXIST

2009.04.15 12:43 from 스크립트/배치파일

들어가며

IF EXIST 구문은 단순히 어떤 디렉터리나 파일이 존재하는지를 알려줄 뿐이다. 응용하기에 따라서는 상당히 유용한 기능을 제공한다. 또한 속성의 영향을 받지 않기 때문에 숨김 속성의 파일이나 시스템 속성의 파일도 찾아낼 수 있다. 또한 윈도 탐색기에서 접근하지 못하도록 레지스트리 등을 조작하여 감춰둔 드라이브도 접근할 수 있다.

IF EXIST 구문에는 기본 문법 외에 명령 확장이 존재하지 않는다. 정확히 말해 명령 확장을 이용할 수는 있지만, 그와 같은 명령 확장은 if 명령 전체에 적용되는 명령 확장이고, IF EXIST 구문에만 쓰이는 명령 확장이 아니다. 또다른 명령 확장으로 set 명령 확장이 있으나, 이것 역시 IF EXIST 구문에만 쓰이는 명령 확장이 아니다. 그러므로 여기에서는 설명하지 않겠다.

말뜻

EXIST는 말 그대로 "있다" 또는 "존재한다"라는 뜻을 가지고 있다. 그러므로 IF EXIST 구문은 무엇인가가 존재하는지를 묻는 구문이 된다. 존재하면 참값을, 존재하지 않으면 거짓값을 돌려준다.

예제

실제로 적용하기에는 무리가 있지만, 간단한 배치파일을 작성하였다.

  1. @echo off
  2. rem 파일명 : ExistSys.bat
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 13.
  7. rem SYSTEM 파일로 운영체제를 가리는 배치파일
  8. rem 사용법 : ExistSys
  9.  
  10. rem c:\ 디렉터리에 존재하는 파일에 따라 시스템을 판별한다.
  11. IF EXIST c:\ntldr GOTO :WinNT
  12. IF EXIST c:\io.sys GOTO :DOS
  13.  
  14. :WinNT
  15. echo The system is Windows NT/2000/XP.
  16. goto :END
  17.  
  18. :DOS
  19. echo The system is DOS or Windows 95/98/ME.
  20. goto :END
  21.  
  22. :END

예제 13은 C 드라이브 루트디렉터리에 있는 파일을 기준으로 운영체제를 판별하는 배치파일이다. 이 배치파일은 정확한 동작을 보장하지 않지만, 대부분의 경우 올바르게 작동한다. 따라서 실제로 이용하기에는 무리가 있으나, 파일 존재 구문(IF EXIST 구문)을 시험하기에는 안성맞춤이다.

위에서 IF EXIST 구문이 두 번 나오는데, 순서를 바꾸면 오류가 난다. 왜냐하면 윈도XP를 비롯한 윈도NT 계열의 운영체제에도 C 드라이브 루트디렉터리에 io.sys와 msdos.sys, config.sys 및 autoexec.bat 파일이 존재하기 때문이다. 이것은 윈도95 계열에서도 마찬가지로 존재한다. 그러므로 윈도NT 계열에서만 존재하는 파일을 찾아야 하는데, 그것이 ntldr(NT Loader) 파일이다. 따라서 위의 배치파일은, 엄밀히 말해, 윈도NT 계열과 비윈도NT 계열을 판별하는 배치파일인 셈이다. 이때 io.sys 파일과 ntldr 파일이 숨김 속성과 시스템 속성을 함께 가지고 있지만, 문제 없이 접근하고 있다.

그러나 PC-DOS의 경우 위의 배치파일은 정상 작동하지 않는다. 왜냐하면 PC-DOS에서는 io.sys 파일 대신에 ibmio.sys 파일이 존재하기 때문이다. 그에 대한 적용은 여러분이 직접 해 보기 바란다.

감춰둔 폴더 접근

폴더 감추기는 윈도 셸인 탐색기에 적용되는 사항으로, cmd.exe 명령에는 적용되지 않는다. 또한 탐색기에서 모습을 찾을 수 없도록 감추었을 뿐 정확한 경로를 알고 있다면 얼마든지 사용할 수 있다.

오른쪽은 원래의 드라이브 구성이고, 왼쪽은 윈도 레지스트리를 조작하여 감춘 구성이다.

이 경우 주소표시줄에 직접 D:\ 와 같이 입력하면 D 드라이브의 루트 폴더에 접근할 수 있다. 앞서 말했듯이 감춰두었을 뿐 막은 게 아니기 때문이다. 그러나 사람들은 눈에 안 보이면 사용하지 못한다고 여기기 때문에 이렇게 드라이브를 감추는 작업은 유용할 때가 많다.

한편 명령 프롬프트에서는 애초에 모든 드라이브가 감춰진 상태이다.

달랑 자신의 홈디렉터리만 보여준다. 홈디렉터리는 유닉스 계열이나 명령 프롬프트에서 쓰는 개념이고, 윈도에서는 프로필폴더이다. 명령 프롬프트에서 다음과 같이 입력하면 된다.

  1. cd %USERPROFILE%

USERPROFILE 환경 변수에 자신의 홈디렉터리(프로필폴더)에 대한 정보를 가지고 있다. 정확히 어디인지를 보려면 다음과 같이 입력하면 된다.

  1. echo %USERPROFILE%

그밖에 HOMEDRIVE, HOMEPATH 등의 환경변수가 지정되어 있다. 위의 경우 홈드라이브(HOMEDRIVE)는 D: 문자열이, 홈패스(HOMEPATH)는 \Usr\LCP 문자열이 지정되어 있으며, 명령 프롬프트에서 set 명령을 입력하면 확인할 수 있다.

보통의 경우 USERPROFILE 환경 변수는 C:\Documents and Settings\USERNAME 문자열을 가지게 된다. 이때 이탤릭체로 표시한 USERNAME은 사용자마다 다르다.

아무튼 위의 두 "내 컴퓨터" 화면처럼 존재하는 폴더를 감추더라도 명령 프롬프트에서는 무리 없이 접근할 수 있다. 이것을 이용하는 것은 여러분의 몫이다.

다음 예고

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
Posted by koc/SALM 트랙백 0 : 댓글 0

들어가며

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문

마침 코드를 검사하여 알맞은 문장을 보여줍니다.

  1. @echo off
  2. rem 파일명 : GBackup1H2P.cmd
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 11-1.
  7. rem 고스트 작업이 정상적으로 끝났는지를 알려준다.
  8.  
  9. rem 첫 번째 하드디스크 첫 번째 파티션에서
  10. rem 첫 번째 하드디스크 두 번째 파티션으로 백업한다.
  11. GHOST.exe -CLONE,MODE=PDUMP,SRC=1:1,DST=1:2\GHOST.GHO -Z9 -AUTO -SURE -RB
  12.  
  13. REM ERRORLEVEL 값이 1보다 작으면 NOERROR로 이동한다.
  14. IF NOT ERRORLEVEL 1 GOTO NOERROR
  15.     ECHO ##############################################
  16.     ECHO ##      백업 도중 오류가 발생했습니다.      ##
  17.     ECHO ##############################################
  18.     GOTO END
  19.  
  20. :NOERROR
  21.     ECHO ##############################################
  22.     ECHO ##    백업 작업을 정상적으로 마쳤습니다.    ##
  23.     ECHO ##############################################
  24.  
  25. :END
  26. REM 배치파일을 종료할 때 마침 코드를 되돌려준다.
  27. REM 이때 %ERRORLEVEL% 환경변수는 일종의 SET 명령 확장에 해당한다.
  28. EXIT /B %ERRORLEVEL%

시만텍 사의 프로그램은 오류가 발생하지 않으면 마침 코드로 0을 돌려주고, 오류가 발생하면 1 또는 1보다 큰 값을 돌려준다. 그것을 이용하여 고스트가 제대로 작업을 마쳤는지를 사용자에게 알려줄 수 있다.

  • 참고 : 위 GBackup1H2P.cmd 배치파일은 실패작이다. 배치파일을 실행할 환경을 고려하지 않고 작성한 탓에 도스에서도 윈도에서도 디스크를 백업한다는 본래 목적대로 실행이 되지 않는다. 물론 ERRORLEVEL문을 시험하는 예제라는 의미에서는 잘 작동한다.

문자열 비교문

if 명령을 이용하여 문자열을 비교할 수 있다. 도스에서는 문자열에 공백이 들어가는 경우가 없으나, 윈도에서는 공백이 들어갈 수도 있다.

앞서 만든 HelloWho2.cmd 파일을 참조하여 매개변수를 출력하는 배치파일을 만들었다.

  1. @ECHO OFF
  2. REM 파일명 : ViewPara.bat
  3. REM 지은이 : koc2000/SALM
  4. REM 저작권 : GPL v3
  5.  
  6. REM 예제 11-2.
  7. REM 매개변수를 한 줄에 하나씩 보여준다.
  8.  
  9. REM 가장 먼저 %0을 보여준다.
  10. ECHO %0
  11.  
  12. REM for 명령을 쓰지 않고 순환문을 만든다.
  13. :LOOP_START
  14.     REM %1 매개변수가 없으면 순환문을 끝낸다.
  15.     IF * == %1* GOTO :LOOP_END
  16.  
  17.     REM %1 매개변수를 출력한다.
  18.     ECHO %1
  19.  
  20.     REM %(N) 매개변수를 %(N-1) 매개변수로 자리 이동한다.
  21.     SHIFT
  22.  
  23.     GOTO :LOOP_START
  24. :LOOP_END
  25.  
  26. :END

GOTO 명령은 배치파일 내부에서 레이블이 있는 곳으로 CMD.EXE 명령줄을 옮기는 역할을 한다. 레이블은 앞에 콜론( : )을 붙여 구분하고 있다.

또한 SHIFT 명령은 %0부터 %9까지의 매개변수의 순서를 바꾸어 주는 역할을 한다. 다시 말해 %9는 %8이 되고, %8은 %7이 된다. 그렇게 하나씩 이동하며 %1은 %0이 된다. 또한 %9 바깥에 있던, 지금까지 표현하지 못했던, %10의 위치에 있던 값을 %9로 옮겨 준다.

ViewPara.bat 배치 파일은 윈도와 도스에서 모두 실행할 수 있으나, 실행 결과는 항상 같지 않다.


위는 윈도XP의 명령 프롬프트이며, 아래는 버추얼박스에서 도스 v6.22를 실행한 화면이다. 다른 경우는 모두 같지만, 따옴표로 묶인 부분을 처리하는 방법이 다르다. 다시 말해 윈도XP에서는 따옴표로 묶인 부분은 하나의 문자열로 보았지만, 도스에서는 따옴표는 무시하고 화이트스페이스(공백문자)로 나뉜 부분을 문자열로 보았다.

또한 이 문자열 비교문은 운영체제의 환경변수를 비교할 때도 쓸 수 있다.

파일 존재 검사문

배치파일은 작업에 앞서 파일이나 디렉터리가 존재하는지를 알아볼 수 있는 방법을 제공한다. 바로 "if exist"라는 구문이다.

  1. @ECHO OFF
  2. REM 파일명 : FindFile.cmd
  3. REM 지은이 : koc2000/SALM
  4. REM 저작권 : GPL v3
  5.  
  6. REM 예제 11-3.
  7. REM 명령줄에서 지정한 파일이 현재 경로에 있는지를 알려준다.
  8.  
  9. REM 판별 : %1이 없으면 도움말을 보여준다.
  10. IF * == %1* GOTO :ViewHelp
  11.  
  12. REM 판별 : %1이 있으면 그 파일이 있는지를 보여준다.
  13. IF EXIST %1 GOTO :Found
  14. ECHO File %1 was Not Found.
  15. ECHO.
  16. GOTO :END
  17.  
  18. :Found
  19. ECHO File %1 was Found.
  20. ECHO.
  21. GOTO :END
  22.  
  23. REM 도움말
  24. :ViewHelp
  25. ECHO FindFile v0.0.1
  26. ECHO Syntax : FindFile FileName
  27. ECHO.
  28.  
  29. :END

명령줄에서 매개변수로 파일명을 입력받아, 그 파일명에 해당하는 파일이 존재하는지를 알려준다.

 

다음 예고

IF 명령을 하나씩 짚어보자. (1)

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
Posted by koc/SALM 트랙백 0 : 댓글 6

티스토리 툴바