노무현 대통령 배너
BLOG main image
왕미친놈의 왕미친세상입니다. 미친 소리는 써도 되지만, 근거 없는 소리는 쓰면 안 됩니다.


들어가며

FOR 명령은 IF 명령과 함께 배치파일에서 지원하는 제어 명령이다. 또한 윈도XP는 도스의 그것보다 훨씬 강력한 기능을 제공하고 있다.

말뜻

FOR 명령에 쓰이는 for가 어떤 뜻에서 나왔는지를 알 수 없었다.

FOR 기본 문법

명령줄에서 FOR 사용

if 명령과 마찬가지로 FOR 명령도 명령줄에서 바로 쓸 수 있다.

  1. FOR %I IN (CD PATH VER) DO %I

아주 짧지만 분명히 잘 동작하며, FOR 명령의 기본 사용법을 잘 나타내고 있다.

FOR 명령의 기본 사용법은 다음과 같다.

FOR %변수 IN (집합) DO 명령어 [명령어 매개변수]

그런데 앞서 보인 코드에서는 명령어 부분이 생략되어 있는 특이한 경우이다. 물론 변수를 명령어 대신 사용하고 있기 때문이다.

모든 형식을 갖추어 FOR 명령을 사용한다면 다음과 같은 방법도 가능하다.

  1. FOR %I IN (%PATH%) DO ECHO %I

위의 코드는 PATH를 한 줄에 하나씩 보여준다.

  1. FOR %I IN (CD PATH VER) DO ECHO %I

위의 코드는 집합에 있는 3개 인자(CD PATH VER)을 ECHO 명령으로 출력하는 구문이다.

기본 문법

명령줄에서 다음과 같이 입력하면 기본 사용법을 알 수 있다.

  1. FOR /?

명령줄에서 사용하는 것과 배치파일에서 사용하는 방법에서 조금 차이가 있다.

FOR %변수 IN (집합) DO 명령어 [명령어 매개변수]

위의 사용법은 명령줄에서 사용하는 방법이다. 그런데 배치파일에서는 아래와 같이 사용해야 한다.

FOR %%변수 IN (집합) DO 명령어 [명령어 매개변수]

% 기호가 하나이냐 둘이냐에 따라 사용하는 곳이 달라진다. 이때 %변수는 주로 %I (퍼센트-대문자 아이)로 나타내는 때가 많으며, %I의 경우 대문자와 소문자를 구별하므로 주의해야 한다. 또한 1문자로 된 변수라면 0부터 9까지를 제외하면 모든 영문자를 사용할 수 있다. 대문자와 소문자를 구분하므로 총 52개를 사용할 수 있습니다.

예제

FOR문은 단순한 구조로 반복되는 작업에 자주 쓰인다.
윈도XP 업데이트 파일(핫픽스 파일)을 윈도XP에 통합하려고 할 때에는 그 파일명이 WindowsXP-KB*.exe와 같은 꼴을 이루게 된다. 이럴 때 FOR 구문을 이용하면 쉽게 할 수 있다.

  1. @echo off
  2. SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
  3. ECHO 윈도XP 복사본의 I386이 있는 디렉터리는?
  4. SET /P WORK=
  5. FOR %%I IN (WindowsXP-KB*.exe) DO %%I /integrate:%WORK% /nobackup /overwriteoem

위의 내용대로라면 중간에 한 차례 사용자 입력이 필요하지만, 처음부터 다음과 같이 지정해도 된다.

  1. @echo off
  2. FOR %%I IN (WindowsXP-KB*.exe) DO %%I /integrate:C:\WXP\i386 /nobackup /overwriteoem

이렇게 해도 몇몇 파일은 여전히 통합되지 않고 있으나, 하나하나 작업할 때에 비한다면 작업량이 매우 줄어든다. 더구나 이 배치파일은 나중에 재활용할 수 있다.

만약에 설치본에 통합하는 것이 아니라, 윈도XP를 설치한 뒤에 핫픽스만 따로 설치한다고 가정하면 위의 배치파일을 다음과 같이 고치면 된다.

  1. @echo off
  2. FOR %%I IN (WindowsXP-KB*.exe) DO %%I /nobackup /overwriteoem /quite /norestart

다음 예고

FOR 명령을 대해 좀 더 자세히 알아보자.
FOR 명령은 도스의 경우와 판이하게 달라져서 알면 아주 유용할 수도 있기 때문에 자세히 알아볼 필요가 있다.

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


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

FOR 명령 확장 2  (3) 2009.07.16
FOR 명령 확장 1  (2) 2009.06.17
GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

아크로에디트snoopy 님윈도우 7 언어팩 통합/삭제 가이드에 나타난 사항을 배치파일로 만들다가 벌레를 하나 발견하였다.

벌레의 유형

단순히 화면 출력을 잘못하는 벌레로 여겨졌다.

하지만 문법 강조에 관한 기능을 살펴본 끝에 대부분 아크로 에디트에 사는 벌레가 아니라, 처음에 문법 강조를 만들 때 해당 문법 강조 설정에 숨어 있던 벌레로 판명났다. 이 설정 파일은 내가 만든 것이 아니라 마소리스 님이 만든 것을 수정해서 쓰고 있었고, 거기에 숨어 있던 벌레였다. 물론 마지막에 가서 아크로에디트에 사는 벌레 하나를 찾을 수 있었다.

벌레 정보

  • 아크로에디트 버전 0.9 / 빌드 0.9.19.84 (2008년 12월 17일자)에서 발견하였고, 이전 버전 확인하지 못하였다.
  • 배치파일 구문 강조에서 나타났다.

벌레의 발견

배치 파일에서 "ECHO Do you want to remove other language package ? [Y/n]"라는 명령문을 입력했다가 다음과 같이 나타나서 벌레가 있음을 알게 되었다.

배치파일 문법 강조 오류

배치파일 문법 강조에서 rem이 나온 행에서 그 뒤로는 모두 주석으로 인식되는 벌레가 있다.

이때 배치파일 문법 강조 설정은 다음과 같다.

배치파일 문법 강조 설정

배치파일 문법 강조 설정.

위에서 보다시피 배치파일 문법 강조에서 행 주석으로 "rem"과 "REM"은 인식하도록 했다(파란색 네모 부분). 그런데 이 부분에서 무언가 잘못된 처리를 하고 있기 때문에 벌레가 나타난다고 여겨진다.

정말로 벌레인가? 1

아무튼 첫 번째 그림에서 129행 부분만을 떼어 내어 여러 가지 측면에서 살펴보았다.

예제 1-1. 맨 처음 발견한 벌레

예제 1-1. 맨 처음 발견한 벌레

예제 1-2. 대문자로 바꾸어도 마찬가지

예제 1-2. 대문자로 바꾸어도 마찬가지

예제 1-3. 큰따옴표(

예제 1-3. 큰따옴표(

예제 1-4. 작은따옴표(' ')로 묶어도 마찬가지

예제 1-4. 작은따옴표(' ')로 묶어도 마찬가지

예제 1-3과 1-4에서는 조금 뜻밖이었다. 보통 큰따옴표나 작은따옴표로 묶이면 문자열로 인식하고, 그럼으로써 행 주석 기호가 인식되지 않아야 하기 때문이다. 그래서 현재의 배치파일 문법 강조 설정에서 문자열 시작 문자(빨간색 네모 부분)에 "' (큰따옴표와 작은따옴표를 연속으로 입력)라고 지정함으로써 예제 1-3과 1-4를 해결하였다. 그 그림은 다음과 같다.

예제 2-1. 작은따옴표로 문자열 처리

예제 2-1. 작은따옴표로 문자열 처리

예제 2-1. 큰따옴표로 문자열 처리

예제 2-1. 큰따옴표로 문자열 처리

결국 예제 1-1과 1-2는 벌레로 여겨지지만, 예제 1-3과 1-4는 벌레가 아니었다.

정말로 벌레인가? 2

앞서 벌레로 여겨진 예제 1-1과 1-2를 다시 살펴보자.

예제 1-1. 맨 처음 발견한 벌레

예제 1-1. 맨 처음 발견한 벌레

여기에서 하나 짚고 넘어가야 할 문제가 있었다. 바로 배치파일에서 행 주석을 나타내는 지시어인 REM명령어라는 사실이다. 이게 왜 중요하냐고? 명령어 다음에 한 칸 이상의 공백이 있어야 하기 때문에 중요하다.

수정한 배치파일 문법 강조 설정

수정한 배치파일 문법 강조 설정.

위의 그림처럼 행 주석을 "rem"과 "REM"에서 "rem "과 "REM "(뒤에 공백 한 칸 있음)로 바꾸었다.

예제 3-1.

예제 3-1.

예제 3-2.

예제 3-2.

에제 3-2에서는 왜 주석으로 인식될까? 이는 당연하다. 명령어처럼 인식하도록 뒤에 공백을 넣었지만, 실제로 명령어 인식되지는 않았기 때문이다. 아크로에디트를 수정하지 않고 문법 강조 설정을 수정해서는 여기가 한계인 셈이다.

아무튼 예제 3-2에서 아크로에디트가 가진 벌레 하나를 찾을 수 있었다.

또 다른 상황

아크로에디트 구문 강조 오류 문서에서 살펴본 벌레를 상기하자. 그 글에서는 아크로에디트에서 rEm 등이 주석으로 처리되지 않는 벌레가 있음을 보였다. 여기에서도 그 벌레가 적용되는지를 살펴보았다.

예제 4-1.

예제 4-1.

예제 4-2.

예제 4-2.

벌레와 벌레가 만나자 한쪽은 작동하지 못하게 되었다.

파일

마소리스 님이 만든 배치파일 문법 강조 파일은 더 이상 유효하지 않다고 생각하여 이번에 수정한 파일을 첨부한다.

  • batch.stx (5174 바이트)
  • CRC32 : 857C74D9
  • MD5 : ac9cc62baa2f4d56330eef3449b45101
  • SHA : ab6d03405ff9c649f15ec5bb65745ad2006ff66b

제작자/제공자의 답변

2009년 5월 16일 현재 AcroEdit - 질문 및 답변에 글을 올린 상태이다.

관련 문서

내부 문서

외부 문서

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


글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

말뜻

배치파일에서 이용할 수 있는 명령어란 배치파일에서 불러들여 실행할 수 있는 내부 명령어 또는 외부 명령어를 일컫는다. 내부 명령어는 명령어 셸에 내장된 명령어를 가리키고, 외부 명령어는 실행 파일과 같은 파일로서 존재한다.

실행 파일은 주로 .COM, .EXE, .BAT와 같은 것이 있으며, 윈도NT 계열에서는 .CMD 파일도 쓰인다. 그밖에 윈도 스크립트인 .VBS, .SCF 파일도 실행이 가능하다.

배치파일에서 이용할 수 있는 명령어는 명령 프롬프트에서 "set" 명령을 입력하고 <Enter>를 누르면 보이는 목록에서 PATHEXT를 찾으면 확인할 수 있다.

윈도용 파일 실행

도스를 수박 겉핥기 식으로 배운 사람은 배치파일에서 윈도용 프로그램을 실행할 수 없다고 생각할 수도 있다. 그럼 간단한 실험을 하자.

명령 프롬프트를 열고 다음과 같이 입력한다.

copy con note.cmd <Enter>
notepad.exe <Enter>
pause <Enter>
<Ctrl-Z>

이제 note.cmd를 입력하면 노트패드, 곧 "메모장"이 실행되어야 한다. 둘째 줄에 입력한 pause는 "잠시 멈춤"을 뜻하는 내부 명령어이다. 메모장이 실행되지 않는다면 컴퓨터에서 notepad.exe가 없거나 경로 설정이 되어 있지 않다는 뜻이다.

스크립트 파일 실행

우리가 가장 쉽게 접할 수 있는 스크립트 파일은 explorer.scf 파일이다. 이 파일은 윈도 폴더에 있다.
위의 PATHEXT에는 없지만 SCF 파일도 실행이 가능하다.

명령 프롬프트를 열고 다음과 같이 입력한다.

copy con exp.cmd <Enter>
explorer.scf <Enter>
pause <Enter>
<Ctrl-Z>

자신의 윈도XP가 정상이라면 윈도 탐색기가 실행되어야 한다.

또한 .SCF 스크립트 외에 .MSC 파일도 실행할 수 있다.

copy con df.cmd <Enter>
dfrg.msc <Enter>
pause <Enter>
<Ctrl-Z>

역시 자신의 윈도XP가 정상이라면 디스크 조각 모음이라는 애플릿이 실행되어야 한다. 이때 .MSC 파일은 스크립트 파일은 아니다. 노트패드에서 읽어 들이면, 그 파일은 XML 파일임을 알 수 있다. 윈도가 특별하게 작동시키는 파일이다.

다음 예고

주석 다는 법과 화면에 메시지 출력하는 법을 알아보기로 하자.

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

배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
그밖에 출력  (2) 2009.03.26
주석 및 화면 출력  (3) 2009.03.23
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

카테고리

분류 전체보기 (1005)
스크립트 (22)
벌레와 팁 (126)
소프트웨어 (240)
하드웨어 (6)
이야기 (24)
말의 나무 (506)
미쳐보자 (22)
일기 (48)
아이폰 (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

글 보관함