2009년 5월 16일 토요일

FOR 명령

들어가며

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 명령은 도스의 경우와 판이하게 달라져서 알면 아주 유용할 수도 있기 때문에 자세히 알아볼 필요가 있다.

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


댓글 6개:

  1. for문을 이용해서 어떤 파일을 다른 디렉토리로 이동을 시키는데 문제는

    파일 이름이 그날 그날 날짜별로 바꾸면서 이동이나 복사를 한다면 그것도

    배치 파일로 작성이 가능할까요?

    예를 들어 C 드라이브에 A라는 파일이 있는데 배치 파일을 돌리면 그날 날짜에 맞게 A_20090517이란 이름의 파일로 이동이나 복사 시켜야 한다는거죠.

    답글삭제
  2. @바다내음 - 2009/05/19 17:47
    (1) FOR 문을 이용하여 이름 바꾸기는 간단하죠.

    FOR %%N IN (%FileList%) DO REN %%N %%N_%FileDate%

    위와 같이 하시면 됩니다.

    하지만 위와 같이 하면 나중에 분명히 문제가 생깁니다. 물론 바다내음 님이 써주신 조건은 만족합니다.

    (2) 그리고 %FileDate% 변수의 값이 미리 지정되어 있어야 합니다. 아래와 같이 하시면 됩니다.

    set FileDate=%date:-=%

    답글삭제
  3. 아 감사합니다~

    간단하게 셀스크립트로 작성한걸

    도스 명령어로 바꿀려니 고민좀 했던 부분입니다.

    하다가 또 안되는 부분이 있으면 질문좀 드려도 될까요?

    답글삭제
  4. @바다내음 - 2009/05/20 14:37
    예. 저도 잘 알지는 못하지만, 공부한다 생각하고 답변해 드리겠습니다.

    답글삭제
  5. for 루프의 이름은 영어 표현 “For …, do …”(…동안 …를 하라)에서 유래하였다. 라고



    위키백과에 써있네요

    http://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84

    답글삭제
  6. @진만고양이 - 2010/04/09 19:39
    예. 그렇지요. for 루프는 배치파일에서만 쓰이는 것이 아니라서 대부분 비슷한 이유에서 유래하고 있습니다.

    답글삭제