배치파일 FOR 문

돌아다니면서 구한 자료로 공부하는 공간입니다..

틀린부분이 있다면 말씀해주시면 수정하도록 하겠습니다.

※ 남을 비방하거나 욕 / 정치적인 글은 삭제 대상이 됩니다. ※

배치파일 FOR 문

배치 파일의 FOR문으로 파일들에 와일드카드만 적용시킬 수 있는 것이 아니라, 텍스트 파일의 각 행들도 일괄처리할 수 있습니다.


우선, 이것은 이 게시물에서 사용할 테스트용 텍스트 파일입니다. test.txt 라는 이름으로 저장합니다. 

foo

이 파일은 테스트용 파일입니다.

FOO FOO FOO FOO FOO FOO FOO FOO FOO FOO FOO

Google Goooooooooooogle

ㅎㅎ

fooFoo

<foo>

안녕하세요. 반갑습니다.




 

텍스트 파일을 한줄씩 처리하는 예제


다음 예제를 0.bat 등의 이름으로 저장합니다. 

@echo off


for /f "delims=" %%i in (test.txt) do echo 결과입니다: %%i




그런 후, 도스창에서 0.bat 이라고 실행하면 

D:\Z>0.bat
결과입니다: foo
결과입니다: 이 파일은 테스트용 파일입니다.
결과입니다: FOO FOO FOO FOO FOO FOO FOO FOO FOO FOO FOO
결과입니다: Google Goooooooooooogle
결과입니다: ㅎㅎ
결과입니다: fooFoo
결과입니다: <foo>
결과입니다: 안녕하세요. 반갑습니다.



이런 결과가 나옵니다.

배치 파일의 for문이, test.txt 파일을 열어서 각 행마다
echo 결과입니다: %%i
이런 명령을 적용한 결과입니다.

도스창의 각 명령어들은, *.* 등의 와일드카드(Wildcard)를 사용하여 여러 개의 파일들을 한꺼번에 처리할 수 있지만, 한 번에 1개씩만 처리할 수 있는 명령어나 프로그램들이 가끔 있습니다. 그럴 때는 각 파일에 한번씩 명령어를 적용해 주느라 아주 힘들게 됩니다. 다루어야 할 파일이 수천 개라면 알바를 고용해야 할지도 모릅니다. 이때 for 문을 사용하면, 와일드카드가 지원되지 않는 명령어/프로그램에 와일드카드를 적용시킬 수 있어 편리합니다.

즉, 배치파일의 for문은, 와일드카드가 적용되지 않는 명령어/프로그램에 와일드카드를 만들어 주는 것입니다.

 

for문 예제


가장 간단하고 쉬운 예제입니다. 다음의 코드를 0.bat 등의 이름으로 하드에 저장하고 실행합니다. 

@echo off


for %%i in (*.*) do attrib "%%i"


이 예제는, 현재 디렉토리의 모든 파일의 속성을 화면에 한꺼번에 출력하는 것입니다. (attrib 명령은 파일이나 디렉토리의 속성을 보거나 변경하는 것인데, 와일드카드가 지원되어 한꺼번에 여러 개의 파일을 바꿀 수 있지만, 여기서는 예를 들기 위해, 그런 기능이 없다고 가정합니다. 즉 한 번에 1개의 파일만 처리할 수 있다고 생각합니다.)


실행 결과: 

D:\Z>0.bat
A          D:\Z\.bashrc
           D:\Z\.bash_profile
A          D:\Z\.inputrc
A          D:\Z\0.bat
A          D:\Z\0.cpp
A          D:\Z\0.htm
A          D:\Z\0.pl
A          D:\Z\0.txt
           D:\Z\1.txt
           D:\Z\ddd Foo.java
           D:\Z\Foo.class
           D:\Z\Foo.java
     R     D:\Z\test.jpg

D:\Z>


이렇게 한꺼번에 출력되었습니다.


 

for문의 문법 설명

 

for %%i in (*.*) do attrib "%%i"



for 다음에 있는 변수는 %%i 이렇게 퍼센트 기호를 앞에 2개 붙여야 합니다. for문의 변수명은 대소문자를 구분합니다. %i와 %I는 다릅니다. 변수는 대체로 %%i 이렇게 지정하면 됩니다.

in 다음의 (*.*)은 모든 파일을 작업 대상으로 하라는 와일드카드입니다. 이 부분을 (*.txt) 이렇게 하면, 현재 디렉토리(폴더)의 "모든 .txt 확장자를 가진 파일"만 대상으로 합니다.

do 다음에는, 각 파일에 대해 실행할 명령어와 옵션을 적어주면 됩니다.

맨 마지막의 "%%i" 는, 각 파일명들이 명령어에 자동으로 대입되는 부분입니다. 큰따옴표로 둘러싸야만, "공백 있는 파일명"을 다룰 수 있습니다.


 

for 와 %%i 사이에 넣는 옵션들


다음 옵션들을 for 뒤에 적어 주면 작업 방식을 변경할 수 있습니다.

/D : 파일이 아닌 디렉토리들을 작업 대상으로 함

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

/R : 하위 디렉토리의 파일들까지 처리합니다.

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

 

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

   집합은 단계별로 증가/감소하는 시작부터 끝까지의 일련의 숫자입니다.
   따라서 (1,1,5)는 1 2 3 4 5를 나타내며 (5,-1,1)은 5 4 3 2 1을
   나타냅니다.

 

/F:

FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ("문자열") DO 명령어 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ('명령어') DO 명령어 [명령-매개 변수] 

 

   파일-집합은 하나 이상의 파일 이름입니다. 파일-집합의 각 파일은 다음 파일로 이동하기 전에 열기 또는 읽기 등의 작업이 진행됩니다.
   파일을 읽어서 문자열을 한 행씩 분리하고 각 행을 0개 이상의토큰으로 구문 분석하는 과정으로 되어 있습니다. For 루프의 본문은
   발견된 토큰 문자열에 설정된 변수 값(들)과 함께 호출됩니다.
   기본값으로 /F는 파일의 각 행으로부터 분리된 토큰을 첫 번째 공백에 전달합니다. 빈 행은 건너뜁니다. "옵션" 매개 변수를 지정하여
   기본 구문 분석 동작을 무시할 수 있습니다. 이것은 다른 구문 분석 매개 변수를 지정하는 하나 이상의 키워드를 갖는 인용 부호로
   묶인 문자열입니다.
   키워드는 아래와 같습니다.

        eol=c           - 행 끝 설명 문자를 지정합니다 (하나만)
        skip=n          - 파일의 시작 부분에서 무시할 행의 개수를 지정합니다.
        delims=xxx      - 구분 문자 집합을 지정합니다.  이것은 공백 또는탭에 대한 기본 구분 문자 집합을 바꿉니다.
        tokens=x,y,m-n  - 각 줄에서 어떤 토큰이 각 반복에 대한 For 구문으로 전달될지를 지정합니다.
                          이 작업은 추가 변수 이름이 할당되도록 됩니다.
                          m-n 형식은 m에서부터 n까지를 나타냅니다.
                          토큰=문자열 내에 있는 마지막 문자가 별표(*)이면
                          추가 변수가 할당되고, 분석된 마지막 토큰
                          뒤에 남아 있는 텍스트를 받습니다.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k


    위의 예제에서는 myfile.txt의 모든 행을 구문 분석하지만 세미콜론으로 시작하는 행은 무시하고, 각 행의 두 번째와 세 번째 토큰을 컴마 및/또는 공백으로 구분되는 토큰으로 For 본문으로 전달합니다. 두 번째, 세 번째, 나머지 토큰을 가져오려면, For 본문 내용의 %i, %j, %k를 참조하십시오.공백을 포함한 파일 이름의 경우, 파일 이름에 큰따옴표(")를 적용하십시오. 큰따옴표를 적용하려면 "usebackq" 옵션을
    사용해야 합니다. 그렇지 않으면, 큰따옴표는 분석할 문자로 취급됩니다. %i는 구문에서 정의되며, %j와 %k는 "tokens=" 옵션에서
    정의됩니다. "tokens=" 행에서는 26개의 토큰까지 정의할 수 있으나 'z'나 'Z' 보다 큰 변수를 정의할 수는 없습니다. FOR 변수는 하나의 문자이며 대/소문자를 구분하며, 글로벌 변수로  한 번에 52개 이상을 사용할 수 없습니다.괄호 사이에 있는 파일 이름 세트에 작은따옴표(')를 사용하면, 해당 문자열에서 FOR /F 구문 분석을 사용할 수 있습니다. 이와 같은 경우, 하나의 행으로 취급되며 분석됩니다.

    괄호 사이에 있는 파일 이름 세트에 억음 악센트 기호(`)를 사용하면, 해당 명령에 대한 결과를 분석하는데 FOR /F 명령을
    사용할 수 있습니다. 이와 같은 경우, CMD.EXE로 전달된 명령줄로 취급되며, 결과는 메모리에 저장되고 파일처럼 분석됩니다.

    다음 예제는 현재 환경의 환경 변수 이름을 나열합니다.


for문은 배치 파일의 고급 테크닉에 사용되는 것입니다. 그래서 잘못 사용하면 위험하기도 합니다. 어떤 파일들이 처리 대상이 될지 잘 파악해야 하고, 임시 파일들을 만들어 충분히 테스트해 보아야 합니다.



도스창에서,
for /?
라고 하면, for문에 대한 더 자세한 도움말이 나옵니다.
 

======================================================== 

 

 

 

우선 기본 문법..

for /? 처보면

 

for %변수 in (집합) do 명령어

 

이게 맨처음 뜬다. 사실 여기에는 함정이 도사리고 있다.

 

변수 라는것이 보통 배치화일에서는 %변수면% 이렇게 해야 하지만 for 문에서는 기준은 %변수명

이것이다.

 

또한 이 변수명은 a b c d e f g 이런식의 영문자 한자만 써야 한다.

%a %b %c 이런식이다.

 

거기다가 옵션으로 % 이게 붙으무로 사실상 변수는 %%변수명 이것이다.

올바른 방법은

 

for %%i in (집합) do 명령어

이것이라는것이다.

 

실질적으로 for %%i in (*) do 명령어 이명령어를 실행시키면

 

@echo off

for %%i in (*) do echo %%i

 

현재 폴더의 파일 목록을 보여준다.

그럼 우리가 알수 있는것은?

() 이안에는 파일명 처리 해주는것을 알수있다.

 

for %I in ( *.bak *.old *.tmp ) do del %I

이것을 실행 할경우

DEL *.BAK

DEL *.OLD

DEL *.TMP 를 수행할 것 입니다.

 

그다음 for /d %%i in (*) do echo %%i

현재폴더에서 디렉토리 내용을 보여준다.

 

그다음 for /r %%i in (*) do echo %%i

현재폴더에서 모든 화일 출력 

for /r %%i in (.) do echo %%i

현재 폴더에서 폴더를 출력

 

for /L %%A in (1,1,100) do echo %%A

1부터 100까지 출력한다.

for /L %%A in (100,-1,1) do echo %%A

100부터 1까지 거꾸로 출력한다.

 

응용..

for /L %%A in(1,1,3) do MD DIR%%A

이러면 DIR1~3개의 폴더를 생성한다.

 

for /L %%A in(1,1,3) do RD DIR%%A

이러면 DIR1~3의 폴더를 삭제한다.

 

이걸 보면 폴더를 생성하는건 아주 우수은 일이 되어버린다.

 

FOR /F "옵션" %%I IN (집합) DO 명령어

주로 파일 처리때 쓰며, 아마도 배치화일 작성할떄 가장 많이 쓰여진다. 왜?

파일을 읽어 드릴수가 있기 떄문이다.

 

분명 FOR /? 을 해보면 엄청나게 많은 내용을 설명하고 있지만.. 설명이 어러워..

이게 당췌 뭐하는 놈인지 알수가 없다는거다.

 

우선 집합을 살펴보자... 옵션은 4가지가 있다.

 

(파일)

("문자열")

('명령어')

(`문자열`)

이 4가지로 분류가 된다.

 

EOL 행끝 문자열을 지정

FOR /F "eol=S" %%F IN ("SDFDSF_SDFDSF") DO ECHO %%F

 

이게 FOR /? 치면 행끝 문자열 지정이라고 하지만.. 들어보면 행을 끝내주는 것에 대하여 체크를 하는것인지...

아니면 이렇다할 어떤 수식도 없다는것에 대하여.. 참 엿같다. 물론 자세히 읽어보면 설명은 되있지만..

명확하지가 않다라는것이다.

EOL 은 첫글자가 S 로시작하는 모든 데이터를 십는다라는 거다..

그 뜻이다.

EOL로 등록된 한글자로 시작되는 행은 모두 십는다라는 뜻이다.

중간이건 뒤에 붙건 암 상관없이..

 

SKIP 설명이다.

FOR /F %%F IN ('DIR') DO ECHO %%F

이 명령어를 처보면.. C,볼륨 C:\ 이런 것이 매위에 있다.. 물론 3라인을 걸처서 말이다.

 

즉 파일이 아닌 DIR 명령어 출력중 내용이라는것을 알수있다. 그다음이 파일 날자이고..

FOR /F "SKIP=4" %%F IN ('DIR') DO ECHO %%F

이렇게 처보면 윗단의 출력 내용들은 삭잘려서 나가게 된다.

물론.. 지금 DIR 을 처서 나왔는데 어다가 써먹을떄가 없다. 왜? 파일명이 아닌 날짜만 주룩 나와서

멀 해먹겠냐?

 

잘 생각해보면.. DIR 에 /B를 치면 화일명만 뽑을수가 있다라는것..

FOR /F "SKIP=4" %%F IN ('DIR /B') DO ECHO %%F

 

그다음 delims 딜마인즈.. 이것 간간히 자주 쓴다.. ㅋㅋ 이게 정말 행끝 처리 문이다.

FOR /F "delims=." %%F IN ('DIR /B') DO ECHO %%F

이러면.. 파일명중 이름 부분만 돌려 준다.

. 이전 것들만 보여준다. 물론 명확히 말해서 폴더량 파일이량 다 보여주는것이지만..

이론상 이렇다는것이다. 물론 폴더만 뽑는다고 해서..

네임 "." 처리 이것으로 폴더명 뽑는것은 아니라는것이다.

 

우리가 예전에는 dir *.  이러면 폴더명이 나왔지만..

요즘은 개념이 없는 파일들이 많아서 확장자 자체가 없는것들이 수두룩 하기 때문에.. 이렇게 뽑으면

난감할수있다. 이것에 대하여서는 나중에 이야기 해본다.

 

그다음 tokens 이것.. 아주 중요하고 아주 많이 써먹고 그러나 현실은 잘모르는..

tokens=x,y,m-n 당췌 이게 무슨 뜻이냐??????????

for /? 이렇게 처보면 알듯 말듯 괴상하게 설명 해놓고.. 이해 불가능할정도로 사람

헷갈리게 만들어 놨다.

 

tokens 는 한마디로 출력시 자릿수를 말하는것이다.

FOR /F "tokens=1" %%F IN ('DIR') DO ECHO %%F

시간

FOR /F "tokens=2" %%F IN ('DIR') DO ECHO %%F

AM/PM 표시

FOR /F "tokens=3" %%F IN ('DIR') DO ECHO %%F

시간

:

:

자리수를 뽑는것이다

그다음..

 

tokens=1,5 는 무슨 뜻이냐? 난 처음에.. 1에서 5까지 출력 해주겠지..

변수에 넣어주는것 아닐까라고 생각했다. 그럼 5개 변수를 써서.. h부터 시작하면 h i j k l 이런형식으 변수가

필요 하는? 떙이다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

이건.. 순전히 1번 라인 5번 라인만 뽑겠다라는 것이다.

즉..

 

FOR /F "tokens=1,3,5" %%f IN ('DIR') DO ECHO %%f %%g %%h

이러면 날짜 시간 파일명 이순이다.

아니 토큰에다가 3갤 쓰던 4갤 쓰던.. 자리수 공략한다는것이다.

 

자 그럼.. 또하나 가본다..

 

tokens=1* 이건 무슨뜻이냐?

FOR /F "tokens=1*" %%f IN ('DIR') DO ECHO %%f

이것과

FOR /F "tokens=1*" %%f IN ('DIR') DO ECHO %%f %%g

이것을 비교 해보면 %%f 는 첫번쨰 자리를 가지는 것을 알수있다.

그 뒤의 %%g는 ? 그다음에 들어오는 모든 자리수를 열과 관계 없이 모두 포함 하겠다라는 뜻이다.

FOR /F "tokens=1*" %%f IN ('DIR') DO ECHO %%g

고로 이렇게 내리면 날짜를 빼버리고 그외 것들이 표시 되게 된다.

즉 넘버* 실지로 변수가 2개로 늘어나게 된다. %1은 지정한 자리수 * 은  그다음 영문자 변수에  %%g 에 활당되어진다.

 

자 다음..

FOR /F "tokens=1,3*" %%f IN ('DIR') DO ECHO %%f %%g

이러면 날자와 시간이 나올것이다. 중간 am/pm 은 빠졌다.

 

그럼 첫번째 자리와 3번쨰 자리를 가지고 그외 변수는 뒤에 모든것을 가진다. 즉 3* 이후의 변수에 모든 걸 담는다라는 뜻이다.

%%f %%g %%h

   1     3       *

이렇게 되는것이다.

 

FOR /F "tokens=1,3*" %%f IN ('DIR') DO ECHO %%f %%g %%h

이걸 실행하게 되면

2번 행열만 빼고 모두 출력하게 된다라는 뜻이다.

 

그다음 m-n 이것..-_-)a

 

FOR /F "tokens=3-4*" %%f IN ('DIR') DO ECHO %%f %%g %%h

그냥 * 이것 까지 전부 설명 빼면 * 활당이 사라진다. 즉 %%h는 없어진다.

3열과 4열은 f와 g에 활당되고 * 그뒤 변수인 h에 활당한다.

 

usebackq

 

 

FOR /F "usebackq" %%f IN ("'DIR'") DO ECHO %%f

FOR /F "usebackq" %%f IN ("DIR") DO ECHO %%f

파일로 인식

 

FOR /F "usebackq" %%f IN (`DIR`) DO ECHO %%f

FOR /F %%f IN ('DIR') DO ECHO %%f

FOR /F "usebackq" %%f IN (`"DIR"`) DO ECHO %%f

dir을 실행 결과 값을 계산

 

FOR /F "usebackq" %%f IN ('"DIR"') DO ECHO %%f

"DIR" 문으로 인식

 

FOR /F "usebackq" %%f IN ('DIR') DO ECHO %%f

FOR /F %%f IN ("DIR") DO ECHO %%f

DIR 문자열로 인식

 

FOR /F "usebackq" %%f IN (`'DIR'`) DO ECHO %%f

 

 

dir 자체를 명령어로 실행하여 그값을 가져 온다.

 

여기까지 해보면 아무 의미가 없어진다.

왜? 이유가 없으니깐...

 

명령어를 구지 이렇게 힘들게 쓸이유가 있을까?

외국에서는 그럴수가 있지만 국내 한글 윈도우즈에서는 상당히 유용한 명령어이다.

 

문제는 dir에서 국한 된다면 상당히 별문제가 없지만.. 종종 소스를 짜다보면 생기는 문제들이 있다.

공백이 들어있는 파일경로라든가? 명령어 안에 "" 를 선언하는경우..

 

ipconfig|find /c "192.169.1.1" 이런 구문이라든가..

find /c "1234" dd.txt 라든가..

dir c:\temp\12313 1313 1231313\

종종 우리는 이러한 문제에 봉착하게 된다.

 

for 문 in 에 들어가게 되면 어떻게 될까? 명령어 인식을 하기 위하여..

'dir "c:\temp\1231 1231 131231\"'

이러면 될까?

 

'ipconfig^|find /c "192.169.1.1"'

이렇게 하면 될까?

 

물론 될수도 하지만...usebackq 를 쓰게 된다면.. 이런 기교가 필요가 없어진다.

 

FOR /F "usebackq" %%f IN ('find /c "1234" dd.txt') DO ECHO %%f

FOR /F "usebackq" %%f IN ('dir "c:\temp\12313 1313 1231313\') DO ECHO %%f

이런식으로 처리하면 되니깐.. '' 로 명령어를 정하고 "" 을 써야할경우..

일반적으로 아무것도 없을시 파일로

"" 문자열

'' 명령어 로 처리하지만..usebackq로 쓰게 되면..

``(1자 옆에) 문자열

'' 명령어

"" 파일 집합 으로 처리하게 된다.

즉 파일명이..

 

우리 나라 좋은 나라.txt 라면?

 

for /f "delims=" %%f in (우리 나라 좋은 나라.txt) do echo %%f

100% 에러 난다는거다.

for /f "delims=" %%f in ("우리 나라 좋은 나라.txt") do echo %%f

이건 그냥 문자열 우리 나라 좋은 나라.txt 4개 토큰으로 잘라저 %%f 문자열 토큰으로 처리하게 된다.

for /f "delims=" %%f in ('우리 나라 좋은 나라.txt') do echo %%f

이럴경우 그딴 명령어가 없다고 나올것이고...

 

for /f "usebackq delims=" %%f in ("우리 나라 좋은 나라.txt") do echo %%f

이렇게 하면 인제 정상적으로 파일을 인식하여, 불러오게 된다.

결론은 우리나라 환경에서는 usebackq 를 소스를 짤때 반드시 넣어주는걸 추천한다.

 

 

 

 

 

인제 정규식이다. 정규식 만큼 정말 for 을 다중 for을 그냥 한큐로 만들수있는 귀중한 내용이다.

%~i 따옴표를 제거 해준다. 즉 알맹이로 만들어 준다는건데..

주로 윈도우에서 공간이 들어간 파일명에 대하여 "" 처 줘야 하는데.. 이것이 배치화일에 들어가면

상당히 까다롭게 굴때가 많다. 특히 만약 for문에 들어가게 되면.. "xxxxxx" 화일이 아닌 명령어로 들어가게 되어버린다.

 

FOR %%f IN ("asdasd" "adasd" "ada" "adada") DO echo %%f - %%~f

ex 만들기 더럽게 힘드넹..-_-)a 따옴표가 제거된 것이 출력된다. 써먹을때는?

파일 리다이렉션 할때 즉 파일에 글쓰기 할때 "" 제거 하기 위해서 쓴다.

자주 쓰고 많이 쓰고 유용하게 쓴다. 반드시 기억 하자.. 매우 중요한 정규식이다.

 

 

인제부터는 설명하러면 dir의 거의 신기에 가까운 수준으로 작업 해야한다.ㅠ_ㅠ;;;

%~fi

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~fg"

 

dir /a-d/b 이러면 폴더 제외하고 파일만 뽑아온다.

( 아 정말 옛날 같았으면.. 파일명 뽑아오는데 폴더 제거하는데.. 거의 몇십줄의 코딩을.. ㅋㅋㅋㅋㅋ)

그럼 FI 옵션을 붙이면 어떻게 되냐?

해당 파일을 찾아보고 있으면 해당 파일에 대하여 전체 경로를 부여 해서 출력 해준다.

어떻게?

C:\AUTOEXEC.BAT 이런식으로..

DIR /B를 붙이면 그냥 AUTOEXEC.BAT 가 나오지만..

FI 옵션이 붙게되면 전체 경로를 표시하여 출력 해준다.

 

그다음 %~di 골빼먹는 옵션인데..

해당 파일의 드라이브명을 돌려준다.

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~dg"

c: 이런식으로 해당 파일의 드라이브를 돌려줌..

보통 현재 실행하고 있는 파일 경로를 찾을때 도움이 될듯 싶은데..

더간단한게 있지요..

%cd% 이래버리면.. -_- 현재 폴더명 반환..되기 때문에..그닥.. 않쓰는..

 

pi 드라이브 뺴고 파일명 빼고 확장.. 골아파.. 경로만 쓰일 일이 거의 만무하기 때문에.. 혼자 쓰여지진 않을꺼다.

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~pg"

 

ni 확장자 뛰고 순수 파일명만..

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~ng"

 

xi 파일명 뛰고 확장자만

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~xg"

 

si

FOR /f %%g IN ('dir /ad /b /s') DO echo "%%~sg"

이러면 8.3 경로로 폴더를 보여줄것이다. 물론 파일명이 긴것이 있으면 쓰면 좋지만..

-_- 나는 루트에 긴파일명이 없기때문에 폴더를 열어 본것이다.

 

ai

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~ag"

FOR /f %%g IN ('dir /ad /b /s') DO echo "%%~ag"

파일 속성이나 폴더 속성을 알수가 있다. 구지 attrib 를 그냥 실행 시켰을때량 비슷한 속성값을 알려주는..

 

ti

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~tg"

파일의 날짜와 시간으로만 확장 차라리 그냥 dir 해서 토큰으로 처리하는게..--)a 물론 잡다한것 안나온다는게.. 매리트가 큰..

 

zi

FOR /f %%g IN ('dir /a-d /b') DO echo "%%~zg"

용량으로 확장 시켜줌..

 

path는 안써봤으므로.. 캔슬..하고 싶으나..

 

-_-)a 패스는 어케 쓰는지 나도 모름..윈도우에서 path를 쓸일이 있어야지..ㅠ_ㅠ;

일단 나왔으니..강제로 설명을..

아주 쩌는 명령어..

path=%path%;c:\
FOR /f %%g IN ('dir /a-d /b') DO echo %%g---"%%~dp$path:g"

 

패스를 c:\ 를 걸어주니. 이파일의 실행경로명이 나오는데?

이걸 보니..-_-)a 잼난게 생각이 났는데...

ㅋㅋㅋ 아놔 나 왜이렇케 잔인한지..ㅋㅋ

 

@echo off
setlocal
set dd=c:\tt\
FOR /f %%g IN ('dir /a-d /b') DO echo %%g---"%%~$dd:g"
endlocal

 

(일단 실행에 앞서 tt 폴더를 c:\tt\를 만들어주고 c:\에 있는 몇몇 파일을 tt로 복사한다.)

 

tt폴더와 현재폴더 사이에 같은 파일이 있는지 없는지 찾는..ㄷㄷㄷㄷㄷㄷ 벌써 파일 서츠 엔진이? -_-)a

고로 path 만 들어간다는 이야기가 아니라는 이야기란 잡설..

이게 dir 이라서 그렇치 다른 변수값 응용하면 무궁 무진한..ㅠ_ㅠ 처리가 될듯 싶은데..

 

기타 예제

그대들의 허접한 능력을 한단계 더 발전시킬수 있는 for 예제들..

 

for /r "C:\" %%f in ("*.TXT") do call :NameSizeToTemp "%%~ff"

for /f "delims=" %%a in ('sort /r "%temp%\temp.dir"') do (

for /f "tokens=1-3 delims=./-" %%a in ("%date%") do ( <--- 질문에 있는것이므로 틀릴수 있음

for /f "tokens=1-3 delims=./-" %%f in ('date /t') do (

for /f "tokens=*" %%f in (
  'dir "%MyRoot%\*.*" /s /b /-c /a:-d-s-h') do (
  call :ListFileIfSince "%%~ff"
  )

for /f "tokens=*" %%f in (
    'dir "C:\_D\*.*"
    "C:\_E\*.*"
    "C:\_F\*.*"
    "C:\_G\*.*"
    "C:\_H\*.*"
    "C:\_L\*.*"
    /s /b /-c /a:-d-s-h') do (
  call :ListFileIfSince "%%~ff"
  )

for %%f in (c:\mytemp\tmp$$$.vbs c:\mytemp\tmp$$$.cmd) do (

for /f %%d in ('gawk "BEGIN{printf\"%%s\n\",strftime(\"%%A\")}"') do (

for /f "tokens=* skip=1" %%i in ('wmic OS Get LocalDateTime') do (

for /f "tokens=2,5 delims= " %%a in ('echo.^|date') do (

for /f %%a in ('unxdate "+%%Y%%m%%d"') do (

for /f %%a in ('unxdate "+%%H%%M%%S"') do (

for /f %%a in ('unxdate "+%%Y%%m%%d%%H%%M%%S"') do (

for %%f in (*.*) do echo %%~ff

for %%f in (F-PROT.INI
              PS.DAT
              PS.SBK
              RANDSEED.BIN
              "My Scans.lnk"
              Thumbs.db
              ) do if exist "%tempdir_%\%%~f" echo del /p "%tempdir_%\%%~f"


  for %%f in ("%tempdir_%\Copy of *.JPG") do if exist "%%f" echo del /p "%%f"

for %%f in (call del) do %%f "%TEMP%\tmp$$$.cmd"
for %%L in (5 4 3 2 1 0) do if errorlevel==%%L (

 

for /f "tokens=3 delims= " %%p in (
  'mode con: codepage /status ^| find "Code page"') do (
  set store_codepage_=%%p)

 

for %%a in (y n q) do if /i "%ask_%"=="%%a" goto _%%a

 

for /f "tokens=1 delims=:. " %%h in ("%time%") do set hh_=%%h
for /f "tokens=1 delims=:. " %%h in ('time /t') do set hh_=%%h

for /f "tokens=1-4 delims=:. " %%h in ('echo %time_%') do (

for /f "tokens=* delims=" %%f in ('echo %cd%') do (
for /f "tokens=* delims=" %%f in ("%myfile_%") do (
  set myfile_=%%~sf)

for /f "tokens=* delims=" %%r in ('type %1') do (

 for /f "tokens=1*" %%a in ('echo.%*') do set rest_=%%b

 

*주의 레지스터 건드리는 for문으로 사용시 문제가 있으니 잘아시는 분만 하시길
for /f "tokens=2,*" %%a in ('
    reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"
      ^|findstr "Path"^|findstr "REG_EXPAND_SZ"') do echo %%b 

 

 

  for /f "tokens=2 delims=:" %%a in (
    'fsutil volume diskfree %drive_%^|
      findstr /i /c:"Total # of bytes"') do (

 

 

update 2012 07 23 

for limit loop

 

@echo off
for /l %%l in (*) do echo 123
pause 

 

 

for semi colon data tokens

 

@echo off
for %%l in (123;234;567;123;456;666;777;888) do echo %%l
pause 

 

@echo off
for %%l in (123;234;567;123;456;666;777;888;

abc;123;bcd;ddd;eef;hfgd;sad) do echo %%l
pause

 

or

 

@echo off
for %%l in (123;234;567;123;456;666;777;888
abc;123;bcd;ddd;eef;hfgd;sad) do echo %%l
pause 

*different example

for comma data tokens

 

@echo off
for %%l in (123,234,567,123,456,666,777,888
abc,123,bcd,ddd,eef,hfgd,sad) do echo %%l
pause 

0 Comments
제목