2009년 3월 31일 화요일

배치파일에 매개변수 전달하기

들어가며

앞서 매개변수의 의미와 자기자신(?)을 출력하는 배치파일을 소개했다.

이 글에서는 매개변수를 활용하여 프로그램을 작성해 보자.

말뜻

매개변수, 곧 파라미터(parameter)는 도스와 윈도의 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다. 명령줄에서 명령어 뒤에 죽 나열하는 문자열은 대개 매개변수이다.

또한 매개변수 전달이란 명령줄에 입력한 명령과 매개변수를 프로그램에서 사용할 수 있는 형태로 알려주는 일을 가리킨다. 이를 위해 배치파일은 %n의 꼴을 사용한다.

  1. @echo Hello %0!

앞서 사용했던 저 한 줄짜리 코드 마지막에 붙은 %0와 같은 꼴로 쓰인다는 뜻이다.

매개변수를 정확히 알기

매개변수 %0과 %*

지금까지 말한 매개변수는 정확하지 않다. 물론 그와 같은 설명이 틀렸다는 말이 아니다. 그러나 엄밀히 말하면 옳지는 않다.

  1. @rem HelloWho.cmd
  2. @echo Hello %0, %*!

첫줄은 주석이므로 적든지 말든지 알아서 하기 바란다. 둘째 줄이 실제 실행 코드이다.

아무튼 아래 그림을 보고 여러 가지로 적용해 보기 바란다.

위의 그림을 보면 매개변수 %0은 배치파일 자신이 아님을 알 수 있다. 만약 매개변수 %0으로 자신을 가리키게 했다면 매번 다른 결과가 나오지 않아야 하기 때문이다. 다른 의미로 매개변수 %0은 명령줄에 입력된 첫번째 인자를 가리킨다는 뜻이다. 컴퓨터에서 첫번째 인자를 0번으로 표기하는 일이 잦으므로 그다지 놀라운 일은 아니다.

또한 위의 코드에서 %0과 %*를 나누어 썼다는 점에서 한 가지를 알 수 있다. %0은 일반적인 매개변수와는 다르게 취급된다는 점이다. %*는 "명령줄에 입력된 모든 매개변수"라는 뜻임에도 불구하고 %0을 제외하고 있음에서 그것을 알 수 있다.

다른 매개변수

매개변수는 앞서 말했듯이 %n의 꼴로 나타낸다. 이때 n은 일반적으로 숫자이고, 특별한 경우에 *(별표)가 올 수 있다. 이 말은 곧 %10과 같은 매개변수는 존재하지 않는다는 뜻이다. 숫자와 수를 구별하자. 10은 수이지만, 숫자는 아니다. 그에 따라 %n의 꼴로 나타낼 수 있는 매개변수는 %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %*, 이렇게 열한 개이다.

하지만 위에서는 분명히 "%10"에 해당하는 매개변수를 전달 받았다. 물론 그것은 사실이다. 다만 %10과 같은 매개변수가 존재하지 않을 뿐이고, 명령줄에서 입력받는 매개변수는 컴퓨터의 기억장치 어딘가에 저장되어 있다는 뜻이다. %*는 자신이 가진 특별한 기능, 곧 %0을 제외한 모든 매개변수를 불러오는 기능을 사용해서 처리했을 뿐이다.

  1. @rem HelloWho2.cmd
  2. @echo Hello %0, %*!
    @echo Hello %0, %1 %2 %3 %4 %5 %6 %7 %8 %9!

두 코드의 차이를 보이기 위해 한꺼번에 작성했다.

다른 매개변수를 넣어서 시험해 보기 바란다.

%* 정확히 알기

아까 알려주고는 뭘 또 정확히 알자고 그러냐고? 아까 그것은 %0과 함께 알려준 내용이고, %*은 다른 매개변수와는 조금 다른 점이 있다는 말씀!

%*을 편의상 별 매개변수라고 부르자.

이 별 매개변수는 매개변수 자체를 다루지 않는다. 헉! 무슨 헛소리를 하느냐고? 정말이다. 이 별 매개변수 녀석이 다루는 것은 명령줄 자체이다.

윗줄은 분명히 별 매개변수를 이용하여 출력하였고, 아랫줄은 %n의 꼴로 출력하였다. 별 매개변수가 명령줄을 다룬다는 뜻은 위와 같이 매개변수 사이에 있는 공백까지 문자(공백문자)로 인식하여 전달 받았음을 뜻한다. 반면에 %1, %2 등은 공백문자로 나뉜 각각의 매개변수를 전달 받아 이용하고 있다.

매개변수 활용

예제 5에서 윈도 폴더를 보여주는 배치파일을 만들었다. 그것을 고쳐서 사용자가 지정하는 폴더(엄밀히 말하면 디렉터리)를 보여주는 배치파일을 만들자.

D:\Usr\LCP\바탕 화면\배치파일>dir /?
디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.

DIR [드라이브:][경로][파일 이름] [/A[[:]특성]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]정렬 순서]] [/P] [/Q] [/S] [/T[[:]시간 필드]] [/W] [/X] [/4]

  [드라이브:][경로][파일 이름]
              나타낼 드라이브, 디렉터리 및/또는 파일을 지정합니다.

  /A          지정된 특성을 가진 파일을 보여줍니다.
  특성        D  디렉터리                   R  읽기 전용 파일
              H  숨김 파일                  A  기록 파일
              S  시스템 파일                -  부정을 뜻하는 접두사
  /B          최소 형식을 사용합니다 (머리말 정보나 요약 없음).
  /C          파일 크기에 1000단위로 분리 기호를 보여줍니다. 이것은 기본값
              입니다. 분리 기호를 표시하지 않으려면 /-C를 사용하십시오.
  /D          /W와 같으나 세로로 배열하여 보여줍니다.
  /L          소문자를 사용합니다.
  /N          파일 이름이 제일 오른쪽에 오도록 새로운 긴 목록 형식을
              사용합니다.
  /O          파일을 정렬된 순서로 보여줍니다.
  정렬순서    N  이름순(문자 순서)    S  크기순(작은 것 먼저)
              E  확장명순(문자 순서)  D  날짜/시간순(가장 이전 것 먼저)
              G  그룹 디렉터리 먼저         -  순서를 반대로 하는 접두 기호
  /P          정보가 한 화면에 꽉 차면 잠깐 멈춥니다.
  /Q          파일 소유자를 보여 줍니다.
  /S          지정한 디렉터리와 하위 디렉터리를 포함하여 보여줍니다.
  /T          정렬에 사용할 시간 필드를 지정합니다.
  시간필드   C  작성한 시간
              A  마지막 액세스한 시간
              W  마지막 기록한 시간
  /W          이름만 가로로 배열하여 보여줍니다.
  /X          8.3 파일 이름이 아닌 파일에 대한 짧은 이름을 보여줍니다.
              이 형식은 긴 이름 앞에 짧은 이름이 추가된 것으로 /N 형식과
              같습니다. 짧은 이름이 없으면 공백을 보여줍니다.
  /4          4자리수 연도를 표시합니다.

스위치를 DIRCMD 환경 변수로 미리 설정할 수 있습니다. 하이픈(-)을
스위치 앞에 접두 기호로 주면 미리 설정된 스위치에 우선합니다. (예, /-W)


D:\Usr\LCP\바탕 화면\배치파일>

우선 명령줄에서 dir /? 라고 명령을 주면 위와 같은 내용을 보여준다. "/문자"의 꼴로 나타나는 것이 매개변수 가운데 선택사항(옵션)이다.

이 가운데 우리가 사용할 선택사항은 /a /p /4 이다. 더 추가하고 싶으면 스스로 선택하기 바란다. 셸 내장 명령어는 선택사항을 줄 때 대부분 대문자/소문자를 가리지 않는다. 그래서 앞의 세 선택사항은 /A /P /4 와 같은 의미이다.

  1. @echo off
  2. rem 예제 10 : 사용자가 지정하는 폴더를 보여주는 배치파일
  3. rem 파일명 : exam10.cmd
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6. echo 예제 10.
  7. echo 사용자가 지정하는 폴더를 보여준다.
  8. echo 보다가 종료하려면 Ctrl+Pause 키나 Ctrl+C를 누르시오.
  9. PAUSE
  10. echo.
  11. DIR /A /P /4 %1

맨 마지막 줄이 이 배치파일의 핵심이다. 사실 저 한 줄만 있어도 실행에는 전혀 지장이 없다. 저대로 실행해 보고 나서 의문이 생긴다면 글 남기세요.

과제

다들 싫겠지만, 약간의 과제를 내겠다.

  • ECHO 명령을 이용하여 화면에 OFF라는 세 글자를 출력하시오. 예시 화면은 다음과 같다.

OFF의 위치나 대/소문자 등은 자신이 좋아하는 위치와 형태를 따르면 된다. 위와 같이 세 번 나타낼 필요는 없다. 1회만 출력하면 된다. 저것을 입력하기 위해 배치파일에 Echo off 라고 하면 아무것도 출력되지 않는다. 어떻게 해야 출력할 수 있는지는 스스로 탐구해야 한다. 이 문제도 알고 나면 너무 쉽다. 다만 O F F 처럼 띄어쓰기를 하면 안 된다.

  • DIR 명령을 이용하여 원하는 폴더(디렉터리)의 내용을 폴더(디렉터리)만 보여주도록 한다. /A /P 선택사항을 반드시 사용할 것. 예시 화면은 다음과 같다.

다음 예고

IF 이용하기

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

벌레 잡는 알약, 벌레에 먹히다 2

읽기에 앞서

네트워크와 관련한 부분은 알약의 벌레가 아니었음을 밝힙니다. 시스템의 내장 랜 모듈에 과부하가 걸려 일시적으로 정지되는 현상이었음을 확인하였습니다.

벌레의 유형

  • 벌레를 발견한 프로그램 및 버전 : 알약 1.32 버전(2009년 3월 12일자)에서 나타난 벌레이다. 그 이전 버전에서는 확인하지 못하였다.
  • 사용한 선택사항 : 검사하기 >> 정밀 검색
  • 벌레의 위험도/중요도 : 2단계 (중요) / 기초적인 벌레
  • 벌레의 특징 : 이 벌레는 기본기가 허술한 알약의 약점을 찌르고 있다.

벌레의 발견

알약이 가진 벌레는 크게 두 가지이다.

  • 특정 경로에서 알약이 압축파일을 열려고 하면, 알약을 얼려 버리는 벌레.

    • 그와 함께 알약이 얼면 네트워크를 죽여 버리는 벌레.
    • 또한 얼어버린 알약을 종료하면 화면에서만 사라지고, 실제로는 백그라운드에서 동작하고 있다.
  • 바이러스 검사가 끝난 뒤 결과 화면에서 다른 메뉴를 선택하면, 바이러스 검사 결과를 먹어치워서 없애 버리는 벌레

앞서 알약 웹페이지에 3월 27일 글을 올려서 그날 바로 답장을 받았다. 그러나 좀 더 정확한 사항을 알기 위해 다시 질문을 올렸으나 아직 답변을 받지 못했다. 아마도 주말이라서 해당 업무를 보지 않았기 때문으로 여겨진다. 아무튼 그날의 답변만을 올리겠다.

이것을 하나하나 분석하면 다음과 같다.

  • 압축 파일 자체는 이상이 없었다. : 이것은 나도 같은 의견이다.
  • 검사 중 이상 현상은 발견하지 못했다. : 그런데 내 컴퓨터에서는 발생했다. 알약의 프로그램 오류 여부는 답변 없음.
  • 검사 완료 후 다른 메뉴로 이동하는 경우 검사가 초기화 되니 다시 하라. : 설마 4시간 동안 검사했던 것을 다시? 조금 어이없는 답변이다.
  • 광고창은 일시적인 전송 실패이다. : 그런데 왜 네트워크 기능 전체를 죽이는지? 답변이 없었다.
  • 쿠키 삭제 등을 했으나 그대로였다. : 삭제 전 1메가에서 삭제 후 900킬로바이트였다. 다시 말해 쿠키 등을 삭제해도 결과는 같았다.
  • 지속적으로 발생하여 추가 문의하였다. : 이것에 대해서는 3월 31일 현재 답변이 없다.

과정 재현

우선 검사 과정을 재현해 보자.

분명히 정밀검사를 선택했다.

검사 시작 3분 만에 잡은 화면이다.

6분 만에 잡은 화면 일부. 오른쪽 아래에 보이는 시간과 요일을 잘 기억해야 한다. (전체화면은 http://salm.springnote.com/pages/3015544/attachments/1352626 또는 오른쪽 작은 그림 클릭) 

55분을 앞두고 드디어 문제의 파일 등장! 벌써 새벽 2시잖아. 난 언제 자냐? 그냥 자자. (전체 화면은 http://salm.springnote.com/pages/3015544/attachments/1352628 또는 오른쪽 작은 그림 클릭)

잠 자고 일어나도 똑같은 그 파일! 문제의 네트워크 죽이기 현상도 발생했다. (전체화면은 http://salm.springnote.com/pages/3015544/attachments/1352630 또는 오른쪽 작은 그림 클릭)

여기까지 보고는 그냥 종료했다. 오른쪽 위의 X 표시를 클릭하여 종료하는 방법을 택했다. (밥 먹고 왔다.)

이때 돌발 상황이 발생했다. 아무리 봐도 CPU 사용량이 너무 많았다. 거의 50%에 육박하고 있지 않은가?

위의 그림에서 오른쪽 아래에 보면 아이콘이 5개 보인다. 그 가운데 윗줄 가운데가 작업 관리자로서 CPU 사용률을 보여주고 있다. 현재 연두색 막대가 절반쯤 보이므로 약 50%임을 짐작할 수 있다. 그런데 실행된 프로그래은 오픈캡처 하나뿐? 못 믿겠다는 사람은 전체화면을 보라. (전체화면은 http://salm.springnote.com/pages/3015544/attachments/1352642 또는 오른쪽 작은 그림 클릭)

이미 종료되었어야 할 알약이 살아남아서 CPU 점유율 50%를 꿋꿋히 지키고 있었다. 알약은 불사신이라 말인가?

알약을 얼리는 벌레→파일 열기 벌레

이 알약의 벌레가 치명적이라 여겼는데, 그보다 한 단계 낮추어 2단계(중요)로 보았다. 왜냐하면 네트워크 기능을 죽이지 않는 한 정상 작동한다고 여겼기 때문이다. 그런데 이때 기본적인 벌레를 발견할 수 있었다.

일단 지난 번에 awardeco.arj 파일에서 수십 분에서 몇 시간에 걸쳐 검사가 중지된 벌레를 소개했다. 그것을 유심히 살펴보다가 아주 황당한 사실을 하나 발견했다. 설마 이런 벌레가 아직까지 멸종하지 않고 살아남았다는 사실에 경의를 표하고 싶어질 정도로 황당한 벌레였다. 위에서 유심히 살펴보면 유독 awardeco.arj 파일에서 문제가 발생하고 있다. 그런데 이 파일은 아무런 문제가 없는 파일이었다. 이것은 이스트소프트에서도 인정했다.

그럼 도대체 무엇이 문제였을까?

우선 지난번에 보았던 화면을 다시 게시하겠다.

20090327-filelist.png

위에서 보면 경로명이 유난히 길고, 폴더의 중첩이 심함을 알 수 있다. 아래 그림을 보자.

위에서 보면 무려 9단계에 이르고 있다. 이때 awardeco 폴더를 C:\ 로 옮기면 아무런 문제가 생기지 않고, 바이러스 검사도 무사히 마쳤다.

조금 오래전부터 준비하던 기사 내용이 머릿속을 번개처럼 스치고 지나갔다. 2009/03/30 - [배치파일&스크립트] - 이런저런 이야기 참조.

  • 도스에서는 디렉터리를 7단계까지 만들 수 있다. 윈도에서는 255자 한계 안에서 얼마든지 만들 수 있다. 예컨대 C:\A11\B22\C33\D44\E55\F66\G77\H88\FILE.EXT 파일은 도스에서는 읽지 못할 수도 있다. 그러나 윈도에서는 문제 없이 읽을 수 있다.
  • 도스에서는 파일이름을 포함한 경로가 66자이거나 그보다 짧아야 한다.

그렇다. 도스에서는 디렉터리를 7단계까지 만들 수 있다. 그런데 이 황당한 벌레는 도스와 윈도를 착각하고, 윈도에서도 버젓히 살아남아 버렸다.

어이, 이스트소프트! 도대체 왜 이 벌레를 키웠단 말이더냐?! 윈도95가 나온 지 벌써 14년인데, 아직까지 이게 멸종을 안 했다니 놀라울 따름이다.

벌레의 원인 및 퇴치

벌레가 생긴 원인은 알 수 없었다. 다만 위에서 말한 지나치게 긴 경로명이 문제가 되었고, 다른 하나는 이스트소프트에서 배포하는 프로그램 폴더에 있었다.

알툴즈 설치 폴더는 보통 %ProgramFiles%\ESTsoft 이다. 내 경우에는 D:\Bin\ESTsoft 폴더이며, 보통은 C:\Program Files\ESTsoft 폴더이다. 이때 알약 프로그램 폴더는 %ProgramFiles%\ESTsoft\ALYac 이다.

이 벌레를 퇴치하고자 이것저것 만지다가 레지스트리를 날려보기도 했다. 물론 실행될 턱이 없으니 백업본을 이용해서 바로 복구시켰다. 폴더를 다른 곳에 복사해놓은 뒤에 하나씩 지워보기도 했다. 그러다가 알게 된 사실은 전혀 엉뚱하게도 알약 프로그램이 아닌 알툴즈 전체의 업데이트 프로그램 또는 폴더에서 발생했거나, 적어도 이 벌레와 관련이 있다는 사실을 알게 되었다.

이것을 쉽게 발견하지 못한 데에는 이유가 있었다. 바로 그 폴더 또는 파일에 손상을 입었음에도 알약 프로그램의 업데이트를 정상적으로 수행했다. 다시 말해 3월 12일에 엔진 업데이트도 정상적으로 수행했고, 그 뒤에 여러 차례 수행한 DB 업데이트도 정상적으로 수행했기 때문에 그 폴더가 원인이라는 사실을 알 수 없었다. 하지만 그것이 직접적인 원인인지는 여전히 알 수 없다. 다만 어떤 이유에서인지 업데이트 프로그램이 있는 %ProgramFiles%\ESTsoft\ALUpdate 폴더가 손상되었고, 그에 따라 알약도 이상 증상을 보였음을 알게 되었을 뿐이다.

아무튼 그 폴더를 아예 지워버린 뒤 알약을 실행시키면 알아서 복구를 해준다. 그 뒤로는 이 벌레를 만날 수 없었다.

또한 업데이트 프로그램 폴더를 삭제한 뒤 복구되면, 업데이트를 수동으로 해 두었더라도 자동으로 바뀌는 경우가 있었다. 수동으로 해놓았던 사람은 반드시 확인하기 바란다.

또한 업데이트 프로그램 또는 폴더에 이상이 생겨서 발생했으리라는 유추가 가능하므로, 아예 알약 프로그램을 제거했다가 다시 설치해도 정상 작동하리라는 추측이 가능하다. 그러나 그냥 업데이트 폴더만 지우기를 권장한다. 간혹 업데이트 받는 데 시간이 오래 걸릴 수도 있기 때문이다.

너무 황당하게 벌레가 잡히는 바람에 재현조차 못하였다. 그래서 업데이트 폴더를 지운 뒤의 자료 화면만 첨부한다.

결과적 이 벌레는 두 가지가 복합적으로 작용하여 발생했다.

  1. 업데이트 프로그램 또는 폴더(%ProgramFiles%\ESTsoft\ALUpdate)가 손상될 경우
  2. 경로의 단계가 7단계를 넘어서는 경우
  3. 그리고 위의 두 상황이 동시에 발생해야 한다.

검사 결과를 먹어치우는 벌레

이 벌레에 대해서는 이스트소프트 측에서는 다음과 같이 답변했다.

검사 결과에 등록되는 내역은 검사 후 치료된 결과를 나타냅니다.
사용하시는 검사 과정의 로그를 남기진 않음을 알려 드립니다.

그런데 에브리존의 터보백신이나, 안철수 바이러스연구소의 V3 등에서는 모두 "검사 과정의 로그"를 남겼다. 치료를 하지 않은 경우에는 검사 과정 자체가 정보라는 사실을 깨닫지 못한단 말인가? 아무튼 기본적으로 검사 과정의 로그를 남기는 터보백신이나 V3가 이상한 것일까? 아니면 해달라고 해도 남기지 않는다는 말을 버젓히 하는 알약이 이상한 것일까?

이스트소프트에서 보내온 답변으로는 그것은 벌레가 아니라, 처음부터 그렇게 설계되었기 때문이다. 하지만 그것 때문에 사용자 불편을 겪고 있는 마당에 위와 같은 답변은 조금 문제가 있다고 생각한다.

네트워크를 죽이는 벌레+허깨비 벌레

네트워크 기능을 죽이는 벌레는 이번에도 나타났다. 그와 함께 알약을 종료했음에도 그 프로세스가 남아서 여전히 CPU 점유율을 50% 이상으로 유지시키는 희한한 벌레마저 등장했다. 아마도 지난번에 내가 발견하지 못하고 지나쳤나 보다.

아울러 위와 같은 현상의 원인도 업데이트 폴더(%ProgramFiles%\ESTsoft\ALUpdate)와 관련이 있음을 알게 되었다. 몇 시간 지나면 알아서 꺼져 버리던 네트워크 기능이 잘 살아 있었기 때문이다. (물론 바이러스 검사를 그렇게 오래 할 일이 다시 생기지 않았기 때문일 수도 있다.)

허깨비 현상의 원인은 아주 확실히 알약에 숨어 있는 벌레였다.

위와 같이 기본 실행모드에서는 트레이에 아이콘 표시가 뜨기 때문에 실행 여부를 판단할 수 있었다.

위의 두 그림 가운데 하나처럼 나타난다. 왼쪽의 빨간 알약과 연두색 알약은 동작하고 있다는 표시이고, 오른쪽의 회색 V3는 현재 동작을 하지 않고 있다는 표시이다.

문제는 최소 실행모드에서 발생한다. 저 알약 아이콘이 모두 사라져 버린다. 기본 실행모드에서는 바이러스를 검사하고 있다가 오른쪽 위의 X 표시를 클릭하여 종료해도 트레이에 아이콘이 그대로 남아 있으므로 아직 종료하지 않았다고 알게 되지만, 최소 실행모드에서는 전혀 알 수가 없다. 말그대로 허깨비가 되어 버린다.

결국 허깨비 벌레를 퇴치하려면, 반드시 종료할 때 바이러스 검사를 먼저 종료한 뒤에야 알약 프로그램을 종료해야만 한다. 그렇지 않다면, 나중에 다시 알약을 실행시켰을 때 아까 종료했던 화면으로 시작하게 된다. 이것은 백그라운드에서 계속하여 바이러스를 검사를 하고 있기 때문에 생기는 현상이다. 이것에 대해서는 아무런 도움말을 얻을 수 없었다. 결국 프로그램 종료에 대한 처리 오류 때문에 발생한 벌레인 셈이다.

제작자/제공자의 답변

추가 질문에 대한 답변은 아직 없다.

관련 문서

 

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

2009년 3월 30일 월요일

티스토리 파일 첨부 창 잘라먹기

읽기에 앞서

이 문제는 티스토리 시스템의 문제가 아님을 확인하였다. 이 글에 나타난 현상을 겪는 사람은 자신의 불여우에 확장 기능 MR Tech's Link Wrapper 가 설치되어 있는지를 먼저 살피기 바란다. 혹시 그것을 설치하였다면, 삭제하기 바란다. 그 확장 기능은 한메일 및 티스토리 시스템과 약간의 충돌을 보이고 있다.

벌레의 유형

티스토리 파일 첨부 창이 파이어폭스에서 제대로 표시되지 않는 문제가 있다.

좀 짓궂게 이야기하면 파일 첨부 창을 잘라먹는 벌레로서, 과식을 자주 하는 듯이 보인다.

벌레의 발견

벌레 정보

티스토리에 가입한 뒤 곧바로 발견할 수 있었다. 그때는 티스토리 그림 파일 업로드 벌레 건에 매달려 있던 때라 이것은 그다지 신경을 쓰지 않았다. 그러나 매번 그림을 올릴 때마다 파일 첨부 창을 아래로 늘여야 하기에, 귀찮음이 더해져서 결국 올리게 되었다.

우선 이 벌레가 익스플로러에서 발견된 적은 없다. 한메일 프리징 현상처럼 파이어폭스에 특정 확장 기능을 잘못 설치하여 나타나는 문제도 아니었다. 다시 말해 파이어폭스를 설치한 뒤 3.0.4판부터 3.0.7판까지 나타나는 문제이며, 아무 확장 기능도 설치하지 않았을 때에도 발생했다. 참고로 3.0.8판에서는 확인하지 못하였다.

벌레 찾기

아래는 티스토리 글쓰기 화면이다. 오른쪽 파일첨부를 클릭하여 파일 첨부 창을 보이게 한다.

아래 파일 첨부 창은 아래 부분이 조금 이상하다. 맨 마지막 줄에서 "음원 필터링 시스템은 저작권 침해로 인한 문제로부터 회원 여러분을 보호하"라고 나온 뒤 잘려 있다. 오른쪽 아래 파란 화살표가 가리키는 부분을 클릭한 뒤 아래로 드래그 하면 파일 첨부 창이 늘어남을 알 수 있다.

아래 그림은 파일 첨부 창을 아래로 늘인 모습이다. 결국 아래 그림처럼 되어야 하는데, 위의 그림처럼 아랫부분을 잘라먹고 있었던 셈이다.

제작자/제공자의 답변

4월 7일 현재 회사 측으로부터 답변이 왔다. 회사 측에서는 이 문제를 재현하지 못하였으나, 지속적으로 개선안을 찾고 있다고 하였다. 아울러 이 문제가 발생하는 원인으로는 창의 크기을 변화시키는 스크립트를, 창을 읽어들인 나서 불러오기 때문에 일어난 문제로 보고 있었다.

관련 문서

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

2009년 3월 29일 일요일

이런저런 이야기

들어가며

혼동하기 쉬운 여러 가지를 말하고자 합니다.

명령줄과 명령 프롬프트가 같은 뜻일까요? 아니면 다른 뜻일까요? 배치파일에서는 어떻게 윈도용 프로그램을 실행시킬 수 있을까요? 이와 같은 질문을 생각해 본 적이 있는 사람은 궁금하겠지요.

하나씩 차근차근 알아보기로 하죠.

명령줄? 명령 프롬프트?

명령줄과 명령 프롬프트는 자주 섞어쓰거나 헷갈리지만 분명히 다릅니다.

커맨드 라인(Command Line), 곧 명령줄은 모니터 화면에서 사용자가 명령을 입력하도록 되어 있는 행을 뜻합니다. 덧붙여 그러한 명령이 기억되는 기억장치의 영역도 명령줄이라고 한다네요. 흔히 '명령행'이라고 부릅니다. 한편 CLI(Command Line Interface)를 커맨드 라인이라고 부르기도 합니다.

명령 프롬프트(Command Prompt)는 명령줄에서 명령을 받을 준비가 되었음을 알리는 특별한 문자를 가리킵니다. 이를 확장하여 명령줄에서 명령을 받을 준비를 하고, 명령을 받은 뒤에 결과를 사용자에게 보여주는 일련의 환경을 명령 프롬프트라고 부르지요. 흔히 프롬프트라고 합니다.

이 때문에 컴퓨터를 운영하는 환경을 말할 때에는 한 줄짜리 명령줄은 존재하지만, 한 줄짜리 명령 프롬프트는 존재할 수 없답니다. 명령줄은 명령을 받음으로써 그 역할을 다하지만, 명령 프롬프트는 결과를 사용자에게 보여주어야 하기 때문입니다.

Windows Registry Editor Version 5.00

 

[HKEY_CLASSES_ROOT\Applications\Hwp.exe\shell\open\command]

@="D:\\Bin\\HNC\\Hwp65\\Hwp.exe \"%1\""

위의 파일은 한글과컴퓨터 사의 한/글/2005의 레지스트리 일부입니다. 그 내용은 "명령줄을 레지스트리 안에 어떻게 집어넣을 것인지"를 서술하고 있습니다.

다시 말해 HKEY_CLASSES_ROOT\Applications\Hwp.exe\shell\open\command 라는 키를 찾아서 기본값( @ )으로 문자열(따옴표로 묶인 부분을 문자열로 해석한다) "D:\\Bin\\HNC\\Hwp65\\Hwp.exe \"%1\""을 입력하라는 내용입니다. 이때 문자열의 내용은 지금까지 배치파일에서 다루었던 명령줄 방식을 그대로 따르고 있습니다.

혼동하지 않도록 그림 하나 올립니다.

명령 프롬프트와 명령줄의 차이

명령 프롬프트와 명령줄의 차이

배치파일과 윈도용 프로그램

윈도용 프로그램을 배치파일에서 실행할 수 있게 된 것은 언제인지 모른다. START.EXE 파일을 이용해서 윈도용을 실행한 것은 윈도95가 처음으로 알고 있다. 하지만 명령줄에서 바로 실행하게 된 것은 언제인지 모르고 있다. (아는 사람은 댓글 좀 달아 주세요.)

아무튼 윈도2000과 윈도XP(이하 '윈도')에서는 명령줄에서 바로 윈도용 프로그램을 실행할 수 있다.

왜?

그것은 윈도에 내장된 CMD.EXE 파일이 명령 프롬프트를 구동해 주는 파일인 동시에 윈도의 명령어 셸 가운데 하나이기 때문이다.

명령어 셸은 운영체제에서 지원하는 명령어를 처리하는 프로그램이다. 도스에서는 COMMAND.COM, 윈도 95에서는 도스 모드에서는 COMMAND.COM, 윈도 모드에서는 EXPLORER.EXE였다. 윈도2000 이후로는 주로 EXPLORER.EXE를 쓰며, CMD.EXE도 쓸 수 있다.

아무튼 이 명령어 셸에는 사용자가 쓸 수 있는 명령어가 내장되어 있다. 우리가 마우스를 움직여 파일을 복사하는 등의 명령이 이미 정의되어 있다는 뜻이다. 그런데 특이하게 명령 프롬프트용 명령어 셸인 CMD.EXE가 윈도의 메인 명령어 셸로 쓰일 수 있다. 윈도2000용 PE(사전 설치 환경)가 처음 선보였을 때 명령어 셸로 쓰인 프로그램은 EXPLORER.EXE 프로그램이 아니라 CMD.EXE 프로그램이었다.

또한 윈도의 안전모드에서 명령 프롬프트 사용을 선택하면 CMD.EXE를 셸로 선택하는 환경을 구성한다.

윈도XP 고급 옵션

윈도XP 고급 옵션

그때 윈도의 창모드 명령어를 사용할 수 있다. 그 말은 이미 CMD.EXE 안에 창모드 프로그램을 실행할 수 있게 구성되어 있다는 뜻이다.

그리고 그것을 이용하여 윈도용 프로그램 가운데 창모드 프로그램까지 배치파일에서 불러와서 실행할 수 있게 된다.

쉽게 말해, 윈도에서 CMD.EXE를 통해 모든 프로그램을 실행할 수 있게 만들었다고 생각하면 된다.

도스에서 작성한 배치파일

도스에서 작성한 배치파일을 윈도에서 실행할 수 있을까?

먼저 그것이 윈도에서도 정상 작동하지 않을 수도 있음을 충분히 이해해야 합니다. 아니, 심지어 심각한 문제가 발생할 수도 있다. 각각의 명령어가 가지고 있는 뜻을 잘 이해해야 하며, 또한 각각의 배치파일 팁이 가진 진정한 의미를 숙지하고 있어야 합니다.

다음과 같은 배치파일 팁은 도스 6.2x 이하에서는 정상 작동하지만 윈도95부터는 정상 작동을 보장하지 않습니다.

  1. @ECHO OFF
  2. REM 파일명 : UPPER.BAT
  3. REM 매개 변수를 입력 받아 대문자로 바꾸어 _UPPER 환경 변수에 넣어서 돌려준다.
  4. REM 도스에서는 실행 경로 환경 변수인 PATH는 항상 대문자만을 저장한다는 점을
  5. REM 이용하여 입력 받은 매개 변수를 대문자로 바꾼다.
  6.  
  7. REM 실행 경로를 _TEMP 환경 변수에 저장한다.
  8. SET _TEMP=%PATH%
  9.  
  10. REM 매개 변수를 PATH 환경 변수에 저장한다.
  11. SET PATH=%1 %2 %3 %4 %5 %6 %7 %8 %9
  12.  
  13. REM PATH 환경 변수에 저장된 문자열을 _UPPER 환경 변수에 복사, 저장한다.
  14. SET _UPPER=%PATH%
  15.  
  16. REM PATH 환경 변수를 복원한 뒤 _TEMP 환경 변수를 지운다.
  17. SET PATH=%_TEMP%
  18. SET _TEMP=

위 배치파일 UPPER.BAT는 단순히 환경 변수만을 다루어 피해가 거의 없다. 하지만 최종적으로 윈도 폴더 등을 다루는 배치파일이 있었다면 끔직한 결과가 발생할 수도 있다.

게다가 주요 명령줄 명령어는 윈도에도 존재하기 때문에 그것을 사용할 수 있다. 참고로 윈도에서 사용할 수 있는 명령어 목록은 다음과 같다. (명령줄에서 HELP 명령을 내리면 알 수 있다.)

특정 명령어에 대한 자세한 내용이 필요하면 HELP 명령어 이름을 입력하십시오.
ASSOC    파일 확장명 연결을 보여주거나 수정합니다.
AT       명령어와 프로그램의 실행을 스케줄합니다.
ATTRIB   파일 속성을 표시하거나 바꿉니다.
BREAK    확장된 CTRL+C 검사를 설정하거나 지웁니다.
CACLS    파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.
CALL     한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.
CD       현재 디렉터리 이름을 보여주거나 바꿉니다.
CHCP     활성화된 코드 페이지의 번호를 표시하거나 설정합니다.
CHDIR    현재 디렉터리 이름을 보여주거나 바꿉니다.
CHKDSK   디스크를 검사하고 상태 보고서를 표시합니다.
CHKNTFS  부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.
CLS      화면을 지웁니다.
CMD      Windows 명령 인터프리터의 새 인스턴스를 시작합니다.
COLOR    콘솔의 기본색과 배경색을 설정합니다.
COMP     두 개 또는 여러 개의 파일을 비교합니다.
COMPACT  NTFS 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.
CONVERT  FAT 볼륨을 NTFS로 변환합니다. 현재 드라이브는
        변환할 수 없습니다.
COPY     하나 이상의 파일을 다른 위치로 복사합니다.
DATE     날짜를 보여주거나 설정합니다.
DEL      하나 이상의 파일을 지웁니다.
DIR      디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
DISKCOMP 두 플로피 디스크의 내용을 비교합니다.
DISKCOPY 플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.
DOSKEY   명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.
ECHO     메시지를 보여주거나, 명령어 반향을 켜거나 끕니다.
ENDLOCAL 일괄 파일에서 환경 변경의 지역화를 끝냅니다.
ERASE    하나 이상의 파일을 지웁니다.
EXIT     CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.
FC       두 파일 또는 파일의 집합을 비교하여 다른 점을
        표시합니다.
FIND     파일에서 텍스트 문자열을 찾습니다.
FINDSTR  파일에서 문자열을 찾습니다.
FOR      파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.
FORMAT   Windows에서 사용할 디스크를 포맷합니다.
FTYPE    파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.
GOTO     Windows 명령 인터프리터가 일괄 프로그램에서 이름표가 붙여진
        줄로 가게 합니다.
GRAFTABL Windows가 그래픽 모드에서 확장 문자 세트를 표시할
        수 있게 합니다.
HELP     Windows 명령어에 관한 도움말을 제공합니다.
IF       일괄 프로그램에서 조건 처리를 수행합니다.
LABEL    디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.
MD       디렉터리를 만듭니다.
MKDIR    디렉터리를 만듭니다.
MODE     시스템 장치를 구성합니다.
MORE     출력을 한번에 한 화면씩 표시합니다.
MOVE     하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.
PATH     실행 파일의 찾기 경로를 보여주거나 설정합니다.
PAUSE    일괄 파일의 처리를 보류하고 메시지를 보여줍니다.
POPD     PUSHD 명령으로 저장된 디렉터리로 바꿉니다.
PRINT    텍스트 파일을 인쇄합니다.
PROMPT   Windows 명령 프롬프트를 바꿉니다.
PUSHD    현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.
RD       디렉터리를 지웁니다.
RECOVER  불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.
REM      일괄 파일 또는 CONFIG.SYS에서 주석을 기록합니다.
REN      파일 이름을 바꿉니다.
RENAME   파일 이름을 바꿉니다.
REPLACE  파일을 대체합니다.
RMDIR    디렉터리를 지웁니다.
SET      Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.
SETLOCAL 일괄 파일에서 환경 변경의 지역화를 시작합니다.
SHIFT    일괄 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.
SORT     입력을 정렬합니다.
START    지정된 프로그램이나 명령을 별도의 창에서 시작합니다.
SUBST    경로를 드라이브 문자로 지정합니다.
TIME     시스템 시간을 보여주거나 설정합니다.
TITLE    CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.
TREE     드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.
TYPE     텍스트 파일의 내용을 보여줍니다.
VER      Windows 버전을 보여줍니다.
VERIFY   파일이 디스크에 올바로 쓰였는지 검증할지
        여부를 지정합니다.
VOL      디스크 볼륨 이름과 일련 번호를 보여줍니다.
XCOPY    파일과 디렉터리 트리를 복사합니다.

저 가운데 파일 형태로 존재하는 명령도 있고, CMD.EXE 셸에 내장된 명령어도 있다. 또한 도스 명령어와 명령어는 같지만, 그 내용에서 현저한 차이를 보이는 SET이나 IF, FOR 등의 명령어는 다시 공부할 필요가 있다.

도스와 윈도의 차이

도스와 윈도2000/XP의 차이는 많지만 몇 가지만 밝히겠다. 내가 아는 것만. ^^a 도스는 명령줄 기반이고, 윈도 그래픽 환경 기반이라는 점과 같은 차이가 아니라 배치파일을 운용할 때 주의해야 할 차이점을 나열하였다.

  1. 도스에서는 파일이름이 파일명.확장자 형태로 8자, 3자였다. 윈도에서는 파일명과 확장자를 합해서 255자까지 만들 수 있다.
  2. 도스, 즉 MS도스에서는 배치 파일 확장자가 .BAT였으나, 윈도에서는 .BAT는 물론이고 .CMD도 있다.
  3. 도스에서는 디렉터리를 7단계까지 만들 수 있다. 윈도에서는 255자 한계 안에서 얼마든지 만들 수 있다.[footnote]다만 이것이 디렉터리 경로 전체 길이에 대한 제한인지는 모르겠다. 너무 오래 되어 기억이 가물가물하다.[/footnote] 예컨대 C:\A11\B22\C33\D44\E55\F66\G77\H88\FILE.EXT 파일은 도스에서는 읽지 못할 수도 있다.[footnote]읽지 못하면 정상이고, 읽을 수 있다면 편법을 동원해서라도 읽을 수 있게 해 놓은 것이다.[/footnote] 그러나 윈도에서는 문제 없이 읽을 수 있다.
  4. 도스에서는 파일이름을 포함한 경로가 66자이거나 그보다 짧아야 한다.
  5. 도스에서는 파일이름에 공백을 포함할 수 없다. 윈도에서는 공백을 포함할 수 있다.
  6. 도스에서는 NUL, PRN 등의 이름을 가진 파일을 만들 수 없다. 윈도에서는 그러한 이름도 허용된다. 다만 약간 다른 방법이 써야 한다. QAOS : LPT1과 같은 다른 예약된 이름을 삭제할 수 없는 경우 참조.
  7. 도스에 환경 변수 이름은 항상 대문자로 나타나지만, 윈도에서 소문자 환경 변수도 있다. 예컨대 윈도에서 windir 환경 변수는 소문자로 이루어져 있다. 이때 소문자 환경변수를 대문자로 입력하더라도 인식한다. 다시 말해 ECHO %WINDIR% 명령은 적법하다.

그밖에 내가 모르는 차이가 있을 수도 있다.

배치파일로 악성 코드를 만들 수 있나?

당연한 말이겠지만, 만들 수 있다고 한다.

이는 배치파일로 배치파일을 만들 수 있고, 그에 따라 복제 가능한 코드도 만들어낼 수 있다. 또한 시스템에 위해를 끼치는 코드를 만들 수 있다. 이와 같은 상황을 종합하면, 자기 자신을 복제할 수 있으며 시스템에 위해를 끼칠 수 있는 배치파일을 만들 수 있다는 뜻이 된다.

이것은 매우 예외적인 경우이다. 하지만 컴퓨터 바이러스 프로그램이 도스 2.0판에서 처음 제공된 PRINT 프로그램을 연구하여 만들었다는 사실에 비추어 보자면, 배치파일로 악성 코드를 만드는 일도 불가능하다고 볼 수는 없다.

다시 예외가 겹쳐서 사소한 실수로 그런 코드를 만들어낼 수도 있으므로 주의를 기울일 필요가 있다. 물론 윈도XP 등에서는 중요한 파일은 시스템 차원에서 보호하고 있기는 하다. 그럼에도 불구하고 boot.ini, ntldr, NTDETECT.COM 등의 파일을 삭제하거나 수정하는 실수를 내포하는 배치파일이 만들어질 수 있으므로 주의해야 한다.

특히 ntldr 파일과 NTDETECT.COM 파일이 손상되면 부팅이 되지 않을 수도 있으므로 다시 한 번 주의하자.

실행 경로란?

실행 경로란 흔히 "패스"라고 부른다. 명령어 PATH로서 알아볼 수 있으며, 정확한 명칭은 실행 파일의 검색 경로이다. PATH 환경 변수에 그 값이 문자열로 저장되어 있다.

PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Bin\Windows Imaging\;c:\1\TC UP\PLUGINS\Library

위와 같을 때 내가 명령 프롬프트에서 명령어를 입력했을 때 가장 먼저 현재 경로에서 찾게 된다. 현재 경로는 대개 커서가 깜박이는 자리의 왼쪽으로 나타나게 된다. 위에서 말했듯이 실행 경로는 대문자와 소문자가 쓰이며, 실제 윈도에 존재하는 경로명과 문자 크기가 달라도 상관없다. 예컨대 실제 경로명이 C:\WINDOWS라고 할 때 PATH 환경 변수에는 c:\windows라고 소문자로 기록되어도 된다는 뜻이다.

아무튼 위의 예시에 나타난 순서를 보면, C:\WINDOWS\system32 디렉터리(폴더)에서 실행파일을 가장 먼저 찾고, 그 다음이 C:\WINDOWS, C:\WINDOWS\System32\Wbem, D:\Bin\Windows Imaging, c:\1\TC UP\PLUGINS\Library 와 같은 순서로 찾게 된다. 이때 주의할 점은 명령어 셸 내장 명령어를 현재 경로보다 먼저 찾게 된다는 사실이다. 지금까지 자주 사용했던 ECHO 명령도 CMD.EXE 파일에 내장된 명령어이다.

정리하면 명령어 셸 내장 명령어를 가장 먼저 찾고, 그 뒤에 현재 경로에서 실행파일을 찾고, 마지막으로 PATH 환경 변수에 저장된 경로에서 실행파일을 찾게 된다. 그래도 못 찾으면 다음과 같은 메시지를 보여준다.

'XXXXX'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는

배치 파일이 아닙니다.

실행 파일이란?

그렇다면 실행 파일은 무엇일까? 위의 예시에 나타난 "외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일"을 통틀어 실행 파일이라고 부른다. 이것은 PATHEXT 환경 변수에 저장되어 있는 값으로서 배치파일에서 이용할 수 있는 명령어에서 설명한 내용이 그것이다. 그때 좀 부정확하게 설명했었다. 배치파일에서 이용할 수 있는 명령어를 설명하면서 SCF 등의 파일도 설명했으나, 사실 그것을 명령어로 보기에는 무리가 있었다. 아무튼 PATHEXT는 특별한 확장자를 가진 파일을 실행할 수 있다는 의미를 가지고 있다.

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

확장자가 .COM, .EXE, .BAT, .CMD, .VBS, .VBE, .JS, .JSE, .WSF 및 .WSH일 때 실행할 수 있다는 뜻이다. 이때 실행하는 순서는 .COM 파일이 가장 먼저이고, 그 다음으로 .EXE 등의 순서를 따른다.

이때 .BAT 파일을 .CMD 파일보다 먼저 찾게 된다. 이 말은 Hello.bat 파일과 Hello.cmd 파일이 존재한다면 Hello 라고 명령을 주었다면 Hello.bat 파일이 실행된다는 뜻이다. Hello.cmd를 실행하고 싶다면 반드시 명령행에서 Hello.cmd를 입력하기 바란다.

프로그래밍에서는 왜 Hello World를 가르칠까?

대부분 처음 배우는 프로그램이 Hello World 문자열 출력이다. 왜 그것을 가르칠까? 설마 아무 생각 없이 가르치고, 또한 아무 생각 없이 배웠다면 지금 생각해 보기 바란다.

왜 그것을 가르칠까?

아주 당연한 말이지만, 컴퓨터 프로그램은 일반적으로 사용자에게 결과를 보여주어야 하기 때문이다.

Hello World 화면 출력을 가르침으로써 프로그래밍의 근본 목적(사용자에게 결과 보여주기)을 가르칠 수 있다는 뜻이다. 아울러 잊지 말아야 할 점, 곧 사용자는 항상 자신이 프로그램을 통해서 한 일을 알고 싶어한다는 점을 기억하게 만들 목적에서 그것을 가르치게 된다.

혹시 자신이 만든 프로그램이 사용자에게 아무런 정보도 주지 않는다면, 지금이라고 고치기 바란다. 정보를 주지 않는 프로그램은 외면받기 쉽상이기 때문이다.

다음 예고

매개 변수를 배치파일에 전달하는 방법에 대해서 알아보겠다.

위에서 다루지 못한 사항은 질문을 하기 바란다. 나중에 다시 이런저런 이야기2를 만들어 이야기하겠다.

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

2009년 3월 28일 토요일

배치파일 멈추기

들어가며

배치파일에서 프로그램을 실행할 때 경우에 따라서는 잠시 멈추거나, 때에 따라서 완전히 종료해야 할 수도 있다.

그러한 경우는 주로 배치파일의 일부에서 오동작이 생겨서 배치파일 전체에 영향을 주는 때나 진행 화면을 잠시 멈춘 뒤 보고 싶을 경우 등이 이에 해당한다.

잠시 멈추기

키를 눌러 잠시 멈추기

윈도 폴더를 보여주는 배치파일을 만들어 보자.

  1. @echo off
  2. rem 예제 5 : 윈도 폴더를 보여주는 배치파일
  3. rem 파일명 : exam05.bat
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6.  
  7. echo 예제 5.
  8. echo 윈도 폴더를 보여준다.
  9. echo 보다가 잠시 멈추려면 Pause 키나 Ctrl+S를 누르시오.
  10. echo.
  11. dir C:\WINDOWS /s /a
  12. echo 끝.

배치파일을 만들 때에는 안내문을 보여줄 수 있게 하려고 했는데, 뭔가가 번개같이 지나가 버려 전혀 알아볼 수가 없었다. 본의 아니게 번갯불에 콩 볶는 모습을 보여준 격이 되었다.

 <예제5 결과 화면>

<예제5 결과 화면>

이번에는 명령 프롬프트에서 exam05 라고 명령을 내린 뒤에 얼른 <Pause> 키를 누르도록 하자. <Pause> 키는 키보드의 왼쪽 위, 숫자 패드의 왼쪽 위에 있다.

<예제5 잠시 멈춘 화면>

<예제5 잠시 멈춘 화면>

이때 <Pause> 키는 잠시 멈추라는 기능을 가지고 있다. 물론 윈도에서는 거의 동작하지 않지만, 이렇듯이 명령 프롬프트나 도스 상태에서 잘 작동한다. 도스 상태에서도 게임 등에서는 마찬가지로 거의 동작하지 않는다.

멈춤 명령

물론 도스에서도 명령행에서 멈추게 하는 명령어가 있다.

  1. @echo off
  2. rem 예제 5-1 : 윈도 폴더를 보여주는 배치파일
  3. rem 파일명 : exam05-1.bat
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6.  
  7. echo 예제 5-1.
  8. echo 윈도 폴더를 보여준다.
  9. echo 보다가 잠시 멈추려면 Pause 키나 Ctrl+S를 누르시오.
  10. echo 다시 재개하려면 아무 키나 누르십시오.
  11. echo.
  12. echo 윈도 폴더를 보여줍니다.
  13. pause
  14. echo.
  15. dir C:\WINDOWS /s /a
  16. echo 끝.

위에 추가된 PAUSE 명령이 그것이다.

위의 명령을 실행시키면 아래처럼 일단 한 번 멈춘다.

<예제5-1 잠시 멈춘 화면>

<예제5-1 잠시 멈춘 화면>

강제 중단

방금 만든 exam06.cmd 파일을 다음과 입력하여 저장하자.

  1. @echo off
  2. rem 예제 6 : 시간과 날짜를 보여주는 도중에 잠시 멈추고
  3. rem          강제 종료에 대해 알려준다.
  4. rem 파일명 : exam06.cmd
  5. rem 지은이 : koc2000/SALM
  6. rem 저작권 : GPL v3
  7.  
  8. echo 예제 6.
  9. echo 날짜를 보여주고 멈춥니다.
  10. echo.
  11. echo 날짜를 바꾸려면 알맞은 날짜를 형식에 맞추어 넣으시오.
  12. echo 날짜를 바꾸지 않으려면 Enter를 누르시오.
  13. echo.
  14. date
  15. echo.
  16. echo 시간을 보여주고 멈춥니다.
  17. echo 종료하려면 Ctrl+C 또는 Ctrl+Break를 누르시오.
  18. pause
  19. echo.
  20. echo 시간을 바꾸려면 알맞은 시간을 형식에 맞추어 넣으시오.
  21. echo 시간을 바꾸지 않으려면 Enter를 누르시오.
  22. echo.
  23. time
  24. echo.
  25. echo 끝.

줄 수는 많지만, 실제 코드는 얼마 되지 않는다. 굳이 실행 화면은 보이지 않겠다. 실제로 실행해 보면 몇 가지 의문이 생길 터이다. 그때 질문을 올리기를 바란다. 위에서 보이고자 하는 바는 명령줄에서 <Ctrl+C> 또는 <Ctrl+Break>를 누르면 강제 중단하는 기능이 있다는 데 있다.

매개 변수

이번에는 지난 번에 예고했던 "파라미터"를 배치파일에 전달하는 방법에 대해서는 다루지 않겠다. 차례로 보면 그것을 알려줘야 하지만, 그것이 무엇인지만 설명하고 넘어가겠다.

파 라미터(parameter)는 도스와 윈도에서 매개 변수로 불린다. 이것은 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다.

  1. cls
  2. echo Hello World!
  3. pause

맨 처음 소개했던 clear.bat 파일의 내용이다.

위에서 CLS, ECHO, PAUSE는 명령어이고, ECHO 다음에 오는 Hello World! 부분은 매개 변수이다. 이때 명령어 자신도 매개 변수에 포함된다. 이것은 아주 특별한 경우이다.

  1. @echo Hello World!

위와 같이 입력하고 Hello.cmd 라고 저장하자. 단 한 줄이지만, 엄연히 배치파일이며, 프로그램이다. (색깔은 구분하기 위해 넣은 것이다. 내용만 제대로 입력하면 된다.)

실행시켜 보면 다음과 같이 나온다.

<Hello.cmd 실행 화면>

이대 내용을 약간 바꾸어 HelloMe.cmd 라고 저장하자. 끝에 %0 은 퍼센트 기호와 숫자 0 (영)이다.

  1. @echo Hello %0!

실행 결과는 직접 보고 느끼기 바란다. 그것까지 알려주면 식상할 듯 여겨져 올리지 않았다.

배치파일 이름을 바꾸어서 실행해 보기 바란다. 뒤에 확장자를 붙여 실행해 보고, 붙이지 않고 실행해 보기 바란다.

이때 명령어 자신도 매개 변수에 포함된다. 이것은 아주 특별한 경우이다.

저 말이 무슨 뜻인지 확실히 알게 되리라 생각한다.

아무튼 매개변수를 배치파일에 전달하라고 지정한 적은 없다. 그러나 명령어 해석기 안에는 이미 명령어 자신을 매개변수로 인식하도록 프로그램되어 있다는 점을 기억하자.

요약

  • 명령줄에서 잠시 멈출 때는 <Ctrl+S> 또는 <Break> 키를 누르면 된다.
  • 명령줄에서 강제 종료할 때는 <Ctrl+C> 또는 <Ctrl+Break> 키를 누르면 된다.
  • 파라미터(parameter)는 도스와 윈도에서 매개 변수로 불린다. 이것은 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다.

    • 명령어 자신도 매개변수이다.

지금까지 만들었던 배치파일을 압축하여 묶었다. 몇몇 파일은 강좌에서는 없었던 것도 있지만 시험 삼아 만든 파일이다.

  • 파일 : batch001.zip (3,877 바이트)
  • CRC32 값 : C1D834F1
  • MD5 값 : 7758c952ca718a16c65bb31793d10841

다음 예고

이번에는 지난 번에 예고했던 매개 변수를 배치파일에 전달하는 방법에 대해서는 좀 더 나중에 다루겠다.

일단 다음 강좌에서는 쉬어가는 시간을 마련했다. 기초가 끝났으므로 이것저것 잡다한 이야기를 하겠다.

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

2009년 3월 27일 금요일

블로그, 첫 한 달

이제 곧 한 달이 된다. 그런데 몇 가지 생각과는 다른 일이 생겼다.

현실과 생각은 다르다.

우선 나는 블로그 왕미친세상을 만들 때 배치파일을 주제로 삼아 만들었다. 그런데 정작 배치파일을 주제로 글을 올린 적은 가장 적다. 물론 아직 글이 하나도 달리지 않은 좋은 사이트도 있지만, 논외로 하자. 그 이유는, 아마도, 나 스스로가 배치파일을 안다고 생각하는 글이 아니라, 함께 배운다거나 복습해 본다는 생각으로 글을 쓰기 때문이라고 생각한다. 그러다 보니 배치파일 소스를 간단하게 열 줄도 안 되게 만들더라도 그것을 고치기만 서너 차례나 더 하게 된다. 최종적으로 채택되는 경우는 그 짓을 한두 차례 더 한 뒤이다. 그러다 보니 순수하게 글을 쓰는 시간은 30분도 채 걸리지 않지만, 소스 파일을 만들어 정리하는 데 들어가는 시간만 하루 꼬박 걸리거나 아니면 이삼일은 걸리게 된다.

화면 구성에서 검은 바탕에 하얀 글씨/회색 글씨가 잘 보이리라 생각했다. 물론 내 모니터에서는 잘 보였으나, PC방 등에서 LCD 모니터에서는 조금 문제가 있었다. 반사광 때문인지 화면 전체가 검게 나오면서 글씨가 보이지 않았다. 결국 하얀 바탕에 검은 글씨를 심각하게 고려하고 있다. 다행이라면, 글씨가 커서 그나마 보인다는 점이다. 작은 글씨였다면 진짜 암울하다. 전혀 보이지 않았을는지도 모른다.

집중!

그 다음 문제는 내가 좀 오지랖이 넓다는 데 있었다. 배치파일 하나만 해도 시간이 모자랄 판에 프로그램 버그도 찾겠다, 유틸리티도 소개하겠다 등등 잡다한 데 손을 뻗고 있었다. 결국 오늘 잡학사전과 개똥철학은 삭제했다. IT 블로그는 IT만! (일기는 논외로 하자.)

좋은 점도 있다.

직업 작가는 아니지만, 소설을 쓰고 있다. 그런데 최근 약간의 난조를 보였는데, 블로그에 글을 쓰면서 조금씩 회복세를 보이고 있다. 아마도 자꾸 글을 쓰다 보니 소설과 관련이 없더라도 무언가 도움이 되나 보다.

 

할일

결국 앞으로 해야 할 일은 스킨을 밝게 바꾸든가, 아니면 나에게 맞게 간소한 스킨을 만들든가 하는 거다. 일단 밝은 스킨으로 바꾸고, 그 다음에 나에게 맞는 스킨을 만들려고 생각하고 있다.

 

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

저작권 템플릿 (GFDL)

저작권 GFDL 템플릿 : 최대한 단순하게 만들었다.

 

저작권 GFDL 템플릿 1

CCL 배너를 보고는 만들었다.

* *

GNU 자유 문서 사용 허가 (GFDL / 한국어)

이 저작물은 GFDL #.#판에 따라 이용하실 수 있습니다. 저작자를 표시해야 하며, 변경과 배포가 자유로우며, 변경한 저작물도 GFDL #.#판을 따라야 합니다.

* *

<table style="border: 3px solid blue;" border="0" cellpadding="0" cellspacing="0"> <tbody><tr> <td style="" valign="middle"> <p style="border-left: 10px none; border-right: 10px none;">GNU 자유 문서 사용 허가 (<a href="http://www.gnu.org/licenses/#FDL" target="_blank">GFDL</a>)</p> </td> <td rowspan="2" style="" valign="middle" width="50"> <p style="border-left: 10px none; border-right: 10px none;"><a href="http://www.gnu.org/licenses/#FDL" target="_blank"><img src="http://www.gnu.org/graphics/heckert_gnu.small.png" border="0" height="48" width="48"></a></p> </td> </tr> <tr> <td style="" valign="middle"> <p style="border-left: 10px none; border-right: 10px none;">이 저작물은 <a href="http://www.gnu.org/licenses/#FDL" target="_blank">GFDL</a>에 따라 이용하실 수 있습니다. 저작자를 표시해야 하며, 변경과 배포가 자유로우며, 변경한 저작물도 GFDL을 따릅니다.</p> </td> </tr> </tbody></table>

 

사용방법 : 위 표를 복사해서 붙이면 됩니다.

주의사항 :

  • #.# 부분을 버전 번호로 바꾸어 주십시오.
  • 모르면 "GFDL #.#판을"라는 부분을 "GFDL을"이라고 바꾸면 됩니다.
  • 가장 좋은 방법은 스프링노트에서 지정해 준대로 CCL을 따르는 것입니다. 확실히 아는 사람만 GFDL로 바꾸기를 권합니다.

저작권 GFDL 템플릿 2

아래 표는 극도로 단순하게 만든 저작권 표시이다.

*

GNU 자유 문서 사용 허가 (GFDL / 한국어) : 원저작자표시-사용제한금지-동일조건변경허락

*

<table style="border: 3px solid blue; border-collapse: collapse;"><tbody><tr><td><p><strong>GNU 자유 문서 사용 허가 (<a title="http://www.gnu.org/licenses/fdl.html" class="external" href="http://www.gnu.org/licenses/fdl.html">GFDL</a> / <a title="http://korea.gnu.org/people/chsong/copyleft/fdl-1.2.ko.html" class="external" href="http://korea.gnu.org/people/chsong/copyleft/fdl-1.2.ko.html">한국어</a>) : 원저작자표시-사용제한금지-동일조건변경허락</strong></p></td></tr></tbody></table>

참고사항

  • 이 틀들은 시험판입니다. 언제라도 더 나은 양식이 있다고 여겨지면 예고 없이 변경됩니다.
  • 이 틀들과 틀 문서 또한 GFDL로 배포됩니다.

 

 

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

Total Commander

토탈커맨더(Total Commander)는 윈도용 파일 관리자로서, 최고라고 여겨지고 있습니다. 몇 달 전에 설정을 날려먹어서 지금은 다시 하나하나 만들어 가고 있습니다. 파일 관리자로서 기능도 좋지만, 아이콘이나 메뉴 등을 바꾸어서 아기자기하게 바꾸는 맛도 있는 프로그램입니다.

프로그램 정보

  • 저작권자/제작자 : 크리스천 기슬러(Christian Ghistler)[footnote]다만 프로그램 본체와 일부 플러그인에 한정한다.[/footnote]
  • 운영체제 : 윈도
  • 버전 : 7.04a (2008년 8월 8일자)
  • 홈페이지 : http://www.ghisler.com/
  • 다운로드 페이지 : http://www.ghisler.com/download.htm
  • 저작권/라이선스 : 공유소프트웨어 (셰어웨어)[footnote]다만 프로그램 본체와 일부 플러그인에 한정한다.[/footnote]
  • 평가 : @@@@@@@@@@ ( 9 / 10 )
  • 실행 화면 :
    • <기본 실행 파일>
    • <확장 언어팩 적용 실행 파일>
    • <토탈커맨더의 사용자 설정 모음집인 TCUP 화면>

  • 설명 :
    • 토탈커맨더는 프로그램 자체의 완성도가 높을 뿐만 아니라 플러그인을 이용하여 여러 기능을 추가할 수 있다.
    • 전형적인 2패널 방식의 파일 관리자이다. 이는 토탈커맨더가 NC(노턴커맨더)를 본따 만들었기 때문으로 여겨진다.
    • 플러그인을 통해 사용자가 직접 기능을 만들어 추가할 수 있다.
  • 기타 :
    • 다국어 지원에서 미흡한 점이 있다. 이는 유니코드가 지원되지 않아서이며, 7.5판에서 해결될 예정이다.
    • 실행 시 등록을 요구하면서 번호를 클릭하게 하는 내그스크린(Nag Screen : 등록 요청 화면)[footnote] nag (내그)는 잔소리라는 뜻이 있다. 셰어웨어에서 등록하라는 말은 돈 내라는 말이므로, 그게 꼴 보기 싫어서 붙인 이름으로 여겨진다. [/footnote]을 내보이지만, 등록하지 않아도 쓰는 데는 지장이 없다.

    관련글

    아직 없음.

     

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


2009년 3월 26일 목요일

벌레 잡는 알약, 벌레에 먹히다

벌레의 유형

  • 벌레를 발견한 프로그램 및 버전 : 알약 1.32 버전(2009년 3월 12일자)에서 나타난 벌레이다. 그 이전 버전에서는 확인하지 못하였다.
  • 사용한 선택사항 : 검사하기 >> 정밀 검색
  • 벌레의 위험도 : 1단계 (매우 위험)
  • 벌레의 특징 : 이 벌레는 매우 독특하다. 벌레 잡는 알약에 숨어서 알약을 잡아먹고 있기 때문이다. 그밖에 자잘한 벌레도 거느리고 있다.

벌레의 발견

알약이 가진 벌레는 크게 두 가지이다.

  • 알약이 압축파일을 열려고 하면, 알약을 얼려 버리는 벌레.

    • 알약이 얼면 네트워크를 죽여 버리는 벌레.
  • 바이러스 검사가 끝난 뒤 결과 화면에서 다른 메뉴를 선택하면, 바이러스 검사 결과를 먹어치워서 없애 버리는 벌레.

알약을 얼리는 벌레

일단 다른 벌레도 있는데, 알약의 벌레를, 특히 이 벌레를 먼저 소개하는 이유는 매우 치명적이라고 여겼기 때문이다.

20090325ALYac_err10.png

5시간 52분 경과! 그런데 화면에서 보이는 저 파일( awardeco.arj )에서만 50분째다. 저 파일이 크냐? 그것도 아니다. 겨우 수십 킬로바이트이다. 1메가도 안 된다는 말이다. 

20090327-filelist.png

44,668 바이트짜리 awardeco.arj 파일을 50분이 넘게 처리하고 있다니.

일단 문제를 알게 되었으니 바이러스 파일만 먼저 치료하기로 하고 정지 뒤 종료했다. 이때 실수로 다른 메뉴(시스템 정리)를 클릭했다가 다시 검사하기를 누르니 검사 결과가 사라져 버렸다. 검사 결과를 먹어치우는 벌레 참조.

 

일단 엔진에도 문제가 있다고 생각하여 업데이트를 하였다. D 드라이브만 검사하기 >> 정밀검사를 시켰다.

그리고 6시간 뒤... 

20090325ALYac_err11.png

아까 압축을 풀어 두었기 때문에 압축파일에서는 안 걸렸지만, 그 압축 파일 안에 있던 저 파일에서 저대로 멈추어 버렸다. 참고로 내가 사용한 컴퓨터 바이러스 백신 프로그램에서는 저 파일을 바이러스로 잡은 백신은 없었다. (하우리, 안철수, 에브리존 모두 바이러스가 아니었다.)

문제는 저 오른쪽이다. 원래는 광고가 떠야 했지만, 어쩐 일인지 저렇게 되어 버렸다. 물론 인터넷이 되지 않았다. 아니 아예 네트워크 기능 전체가 죽어 버렸다.

도대체 바이러스 잡으라니까 파일 열다가 얼어 버린 주제에 왜 네트워크 기능은 죽여 버린단 말인가?

참고로 업데이트를 했지만, 엔진은 그대로였고, DB만 3월 25일자로 바뀌었다.

검사 결과를 먹어치우는 벌레

위의 벌레에 비하면 치료 결과를 먹어치우는 벌레는 애교라고 생각한다. 하지만 이것 역시 위험하기는 마찬가지이다.

C 드라이브만 검사하였다. 드디어 검사가 끝나고, 혹시나 하는 마음에 화면을 잡았다...이면 좋겠다만, 아래 화면은 바이러스 검사를 한 번 더 실행하여 잡은 화면이다. 치료는? 또 4시간을 기다리라고? 그냥 내가 직접 그 폴더에 있는 파일을 지우고, 그 레지스트리를 지웠다.

일단 화면을 보라. 내가 클릭한 메뉴는 결과보기 >> 검사하기 >> 결과보기, 이런 순서이다.

20090325ALYac_err01.png 20090325ALYac_err02.png 20090325ALYac_err03.png 20090325ALYac_err04.png

보면 알겠지만, 일단 검사가 끝난 뒤 검사 결과는 저장하지 않고 있다. 물론 바이러스가 있다면 바로 치료하면 된다고 할 수도 있으나, 클릭 실수가 발생할 수도 있으니, 검사 결과 자체를 저장해 둘 필요도 있다는 점을 간과하지 않았나 생각한다.

그렇다고 검사 결과 저장이 매우 많은 용량을 차지하지도 않는다. 치료 결과에 병합하여 저장하면 되기 때문에 그다지 데이터가 늘지도 않는다. 그저 치료 결과에 저장하되, "발견했지만, 치료하지 않았음"이라고 해도 되기 때문이다.

추가

네트워크 기능을 죽이는 벌레는 나타날 때도 있고 나타나지 않을 때도 있다. 위에서 보듯이 첫째 검사화면과 셋째 검사화면에서는 나타나지 않았지만, 둘째 검사화면에서만 나타났다. 그렇다고 중요도가 낮다고 볼 수도 없는 벌레이다. 왜냐하면 이게 알약의 기능(일정 시간이 지나면 네트워크 자체를 차단하는 기능)인지, 아니면 외부 바이러스가 알약의 보안버그를 틈타 침투한 것인지 알 수 없기 때문이다. 물론 항상 발생하는 현상이 아님을 볼 때 보안버그일 가능성이 더 높다.

제작자/제공자의 답변

알약 웹페이지에 3월 27일 글을 올려서 그날 바로 답장을 받았다. 그러나 좀 더 정확한 사항을 알기 위해 다시 질문을 올렸으나 아직 답변을 받지 못했다. 아마도 주말이라서 해당 업무를 보지 않았기 때문으로 여겨진다. 아무튼 그날의 답변만을 올리겠다.

하나하나 분석하면 다음과 같다.

  • 압축 파일 자체는 이상이 없었다. : 이것은 나도 같은 의견이다.
  • 검사 중 이상 현상은 발견하지 못했다. : 그런데 내 컴퓨터에서는 발생했다.
  • 검사 완료 후 다른 메뉴로 이동하는 경우 검사가 초기화 되니 다시 하라. : 설마 4시간 동안 검사했던 것을 다시?
  • 광고창은 일시적인 전송 실패이다. : 그런데 왜 네트워크 기능 전체를 죽이는지?
  • 쿠키 삭제 등을 했으나 그대로였다. : 삭제 전 1메가에서 삭제 후 900킬로바이트였다.
  • 지속적으로 발생하여 추가 문의하였다.

현재 벌레 잡는 알약, 벌레에 먹히다 2를 준비하고 있는 중이다.

관련 문서

 

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

네이버의 나눔고딕코딩 선문자 오류

벌레의 유형

고정폭 글꼴의 너비를 잘못 설정하여 발생한 오류로 여겨진다.

벌레의 발견

네이버에서 배포한 나눔고딕코딩 1.650 버전(2009년 2월 3일자)에서 나타나는 벌레이다.

20090323NGCtest.png

위의 그림은 나눔고딕코딩 12포인트일 때의 화면이다. 눈에 확 띄지는 않지만 선문자가 어긋나 있음을 알 수 있다.

또한 나눔고딕코딩은 모든 크기에서 선문자가 어긋나고 있음을 확인하였다.

제작자/제공자의 답변

2009년 3월 26일 현재 오류를 보고한 상태이다.

관련 문서

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

아크로에디트 구문 강조 오류

벌레의 유형

단순히 화면 출력을 잘못하는 벌레이다.

벌레의 발견

벌레 정보

아크로에디트 버전 0.9 / 빌드 0.9.19.84 (2008년 12월 17일자)에서 발견하였고, 이전 버전 확인하지 못함.

배치파일 구문 강조에서 나타났다.

벌레 찾기

20090321ae01.png
그림1. 주석 명령어 REM을 5번 사용하였으나 2번만 주석이 달렸다. 또한 @도 문법 강조가 되지 않고 있다.

강좌를 올리려고 배치파일을 찾아서 편집하다가 우연히 알게 된 벌레이다.

위에서 보면 배치파일에서 주석을 나타내는 지시자는 REM이다. 엄밀히 말하자면 REM 명령어이다. 이때 배치파일은 대문자와 소문자를 가리지 않으므로 rem, REM, Rem, rEm, reM 등은 모두 주석으로서 작동해야만 한다. 실제로 설정에서도 다음 그림처럼 rem과 REM이 적용되어 있다.

20090321ae03.png
그림2. 행 주석 표시자로 REM을 지정하고 있다.

한편 @ (at)에 대한 문법 강조도 이루어지지 않고 있다.

20090321ae02.png 20090321ae04.png
그림3 / 그림4. 단어 구분 기호에 대한 문법 강조 설정

위 그림에 보면 단어 구분 기호로서 @을 사용하고 있고, 그 색상은 빨간색이다.

그러나 위 그림 1을 보면 문법 강조가 되어 있지를 않다.

제작자/제공자의 답변

AcroEdit - 질문 및 답변에 글을 올린 상태이다. 현재 제작자가 검토를 하고 있는 중이다.

관련 문서

 

 

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