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


FOR 명령을 이용하여 파일 구조 분석이나 변수를 대체하여 사용할 수 있습니다. 이것을 이용하면 직접적으로 접근하기 힘든 것을 환경 변수를 조작할 수 있습니다.

읽기에 앞서

  • 명령어 구문에서 { | }(브레이스와 바, 중괄호와 막대)로 이루어진 부분은 둘 가운데 하나를 선택해야 한다. 예컨대 {%% | %}와 같은 경우 %%와 % 가운데 하나를 선택하여 사용해야 함을 뜻한다.
  • [](대괄호)로 묶인 부분은 그 부분을 쓰지 않아도 무방함을 나타낸다. 필요할 때만 쓰면 된다.

변수 대체

변수 대체란 말 그대로 입력 받은 변수를 다른 형태로 바꾼다는 뜻이다. 이 변수 대체를 이용하면 몇 가지 조작을 할 수 있다.

변수 대체 기본 사용법

  • %~L
    따옴표("")를 제거하는 %L을 확장합니다. 경로 명 등에 쓰인 따옴표를 제거할 때도 쓸 수 있습니다.
  • %~fL
    전체 경로 이름으로 %L을 확장합니다. 아래 그림에서 집합에는 *.txt 를 넣었으며, 경로는 포함하지 않았음에도 %~fL은 그것을 전체 경로로 확장해 주고 있다.

    위 그림의 내용은 C 드라이브 루트디렉터리에 txt 확장자를 가진 파일이 존재하면 그 파일의 전체 경로를 매개변수로 삼아 dir 명령을 실행하라는 뜻이다.
  • %~dL
    드라이브 문자 전용으로 %L을 확장합니다. 다시 말해 집합에 들어 있는 *.txt를 그것이 존재하는 드라이브명과 콜론(: 쌍점)만 취해서 나타내 준다.
  • %~pL
    경로 전용으로 %L을 확장합니다. %~fL에서 %~dL를 뺀 나머지를 돌려준다. 다시 말해 %~fL에서 맨 앞의 드라이브 문자와 콜론(: 쌍점)을 뺀 나머지를 돌려준다.
  • %~nL
    파일 이름 전용으로 %L을 확장합니다. 기본적으로 집합에 입력한 값과 같은 파일이 존재할 때 그 파일명만 읽어올 때 사용합니다. 이것은 어떤 파일이 존재하는지를 알아보고, 그것과 이름이 같으나 확장자가 다른 파일이 있는지를 알고 싶을 때 사용한다.
  • %~xL
    파일 확장명 전용 %L을 확장합니다. 기본적으로 집합에 입력한 값과 같은 파일이 존재할 때 그 확장자만 읽어올 때 사용합니다. 확장자를 읽어올 때 점(. 콤마)를 함께 읽어옵니다.
  • %~sL
    짧은 이름만 포함하도록 경로를 확장합니다. 이것은 도스에서 사용하는 짧은 경로명으로 파일 이름을 나타내 줍니다.
  • %~aL
    파일의 파일 특성으로 %L을 확장합니다. 다시 말해 파일 속성만을 나타내 주며, 이때 윈도의 형식이 아닌 유닉스 형식에 따라 나타내 준다는 점이 특이합니다.
  • %~tL
    파일의 날짜/시간으로 %L을 확장합니다. 이때 날짜는 date /t 의 형식을 따르며, 시간은 time /t 의 형식을 따릅니다.
  • %~zL
    파일 크기로 %L을 확장합니다.
  • %~$PATH:L
    PATH 환경 변수 목록에 나열된 디렉터리를 검색하고 처음으로 찾은 디렉터리의 전체 이름으로 %L을 확장합니다. 환경 변수 이름이 정의되어 있지 않거나 검색으로 파일을 찾을 수 없으면 이 수정자는 빈 문자열로 확장됩니다.

    C 드라이브 루트디렉터리는 PATH 환경 변수에 지정되어 있지 않으므로 %L 환경변수에 대한 %~$PATH:L 환경변수는 공백을 돌려준다.

    C:\WINDOWS 디렉터리는 PATH 환경변수에 지정되어 있으므로 %~$PATH:L 환경변수 확장이 알맞은 값으로 대체하여 보여줍니다.

변수 대체 복합 사용법

FOR 명령 확장에서 변수 대체를 하나만 쓸 수도 있지만 여러 개를 복합하여 사용할 수도 있습니다.

  • %~dpL
    드라이브 문자 및 경로 전용으로 %L을 확장합니다.
  • %~nxL
    파일 이름 및 확장명 전용으로 %L을 확장합니다.
  • %~fsL
    이름이 짧은 전체 경로 이름 전용으로 %L을 확장합니다.
  • %~dp$PATH:L
    %L에서 PATH 환경 변수의 디렉터리 목록에 나열된 디렉터리를 검색하고 처음으로 찾은 드라이브 문자와 경로로 확장합니다.
  • %~ftzaL
    dir과 같은 출력 줄로 %L을 확장합니다.

위의 예제에서 %L과 PATH는 다른 유효한 값으로 바꿀 수 있습니다. 유효한 for 변수 이름은 %~ syntax를 종료합니다. %L 같은 대문자 변수 이름을 사용하면 코드를 더 읽기 쉽게 만들고 대소문자를 구분하지 않는 수정자와 혼동을 피할 수 있습니다.

응용 예시

Slave 님께서 질문을 하나 올려주셨습니다.

  1. for %f in (*.txt) do run %f > %f.result

위와 같이 하면 파일명은 항상 파일이름.txt.result라고 나타난다네요. 이것을 파일이름.result라고 바꾸고 싶다고 하셨습니다. 참고로 윈도에서 사용한다면 파일이름.txt.result라고 하는 쪽이 여러모로 좋지만, 파일이름.result를 더 좋게 여기는 사람도 많습니다. 이 부분은 사람마다 취향의 차이이므로 자기가 바라는 대로 출력하고자 하지요.

이 문제는 %~nL 항목을 응용하면 쉽게 바꿀 수 있습니다.

  1. FOR %F IN (*.txt) DO run %F > %~nF.result

배치파일에서 사용한다면 아래와 같이 하면 됩니다.

  1. FOR %%F IN (*.txt) DO run %%F > %%~nF.result

다음 예고

FOR 명령에서 파일 구문 분석에 대해 알아보겠습니다.

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


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

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

FOR 명령과 관련한 여러 가지 쓰임은 상당히 유용하다. 아울러 명령줄에서 직접 제공하지 않는 기능을 FOR 명령 확장을 이용하여 구현할 수도 있다.

읽기에 앞서

  • 명령어 구문에서 { | }(브레이스와 바, 중괄호와 막대)로 이루어진 부분은 둘 가운데 하나를 선택해야 한다. 예컨대 {%% | %}와 같은 경우 %%와 % 가운데 하나를 선택하여 사용해야 함을 뜻한다.
  • [](대괄호)로 묶인 부분은 그 부분을 쓰지 않아도 무방함을 나타낸다. 필요할 때만 쓰면 된다.

디렉터리 전용

집합에 와일드카드(* 및 ?)를 포함하면 지정된 명령은 지정된 디렉터리의 파일 집합 대신 집합과 일치하는 각 디렉터리에 대해 실행됩니다. 구문은 다음과 같습니다.

FOR /D {%% | %}변수 IN (집합) DO 명령 [명령-매개 변수]

예컨대 파일은 그대로 두고 디렉터리의 이름만을 바꾸고 싶다면, 이 디렉터리 전용 옵션은 상당히 유용합니다.

재귀적 사용

[드라이브:]경로를 루트로 하여 디렉터리 트리를 따라 내려가며 FOR 구문을 트리의 각 디렉터리에서 실행합니다. /R 스위치 뒤에 디렉터리가 지정되지 않으면 현재 디렉터리가 사용됩니다. 집합에 마침표(.)가 사용되면 디렉터리 트리만 나열합니다.

FOR /R [[드라이브:]경로] {%% | %}변수 IN (집합) DO 명령 [명령-매개 변수]

이 구문은 명령어가 하위 디렉터리 옵션을 지원하지 않을 경우에 상당히 유용합니다.

값의 범위 반복

반복 변수를 사용하여 시작을 설정한 다음 값이 집합의 을 초과할 때까지 값의 집합 범위를 단계적으로 검사합니다. 집합은 단계별로 증가/감소하는 시작부터 끝까지의 일련의 숫자입니다. 따라서 (1,1,5)는 1 2 3 4 5를 나타내며 (5,-1,1)은 5 4 3 2 1을 나타냅니다.

FOR /L {%% | %}변수 IN (시작,단계,끝) DO 명령 [명령-매개 변수]

이 구문은 프로그래밍 언어에서 사용하는 FOR 구문과 비슷합니다. 실제로 배치파일에서 사용하기 위해 변수와 수치를 대입하면 다음과 같습니다.

  1. @ECHO OFF
  2. SETLOCAL
  3. SET SUM=0
  4. SET SUMTEMP=0
  5. FOR /L %%i IN (1,1,10) DO CALL :COUNT
  6. GOTO :EOF
  7.  
  8. :COUNT
  9. SET /A SUMTEMP=%SUMTEMP%+1
  10. SET /A SUM=%SUM%+%SUMTEMP%
  11. ECHO %SUMTEMP% = %SUM%
  12. GOTO :EOF

참고로 C언어에서는 다음과 같은 구조를 가집니다.

  1. int i, sum;
  2. for (i=1, sum=0; i<=10; i++) {
  3. sum = sum + i;
  4. printf ("\d\n", sum);
  5. }

다음 예고

FOR 명령에서 파일 구조 분석과 변수 대체에 대해 알아보겠습니다.

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


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

FOR 명령 확장 2  (3) 2009.07.16
FOR 명령  (6) 2009.05.16
GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
글쓴이는 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

글 보관함