Windows 배치 파일을 사용하여 텍스트 파일의 각 줄을 어떻게 반복합니까?


244

Windows 배치 파일을 사용하여 텍스트 파일의 각 줄을 반복하고 각 텍스트 줄을 연속적으로 처리하는 방법을 알고 싶습니다.

답변:


304

아래 게시물은 크게 도움이되었지만 전체 라인을 전체적으로 처리 해야하는 곳에서 내 질문에 언급 한 내용은 수행하지 않았습니다. 내가 찾은 것은 다음과 같습니다.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

별표 (*)가있는 tokens 키워드는 전체 줄의 모든 텍스트를 가져옵니다. 별표를 넣지 않으면 줄의 첫 단어 만 가져옵니다. 나는 그것이 공백과 관련이 있다고 가정합니다.

TechNet의 명령

모든 게시물에 감사드립니다!


파일 경로에 공백이 있으면를 사용해야 usebackq합니다. 예를 들어.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A

37
미성년자의 추가 : 대화 형 명령 줄에서이 작업을 대체 %%A하여 %A위의 명령이다. 그렇지 않으면 당신은 얻을 것이다 %%A was unexpected at this time..
vadipp

16
참고로, 다중 행 명령을 수행해야하는 경우 "DO"다음에 열린 괄호 "("및 몇 줄 후에 닫는 괄호 ")"를 넣을 수 있습니다. 코드 만 입력하면됩니다. 그 내부를 차단하십시오 (당신의 취향에 들여 쓰기).
BrainSlugs83

3
그 패턴에 감사드립니다. 나는이 파일 이름에 따옴표 ( ")에 둘 수 없음을 발견했다 -. 단지 나에게 파일 이름을 제공 공백이있는 파일 이름을 예 for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A-> A = myfile.txt이를 방해하는 모든 아이디어를 어떻게.?
것이다

1
작업중인 파일이 ANSI 또는 UTF8로 인코딩되어 있는지 확인하십시오. TYPE 명령을 사용하여 파일을 보려고 할 때까지 출력이 작동하지 않는 이유에 대해 머리를 긁고 있었고 출력이 예상과 다릅니다. 이 시점에서 파일이 "UCS-2 BE BOM"으로 인코딩 된 것을 알 수있었습니다.
댄 스티븐스

1
루프의 인덱스 매개 변수는 단일 문자 여야합니다. 예를 들어 %% i는 괜찮지 만 %% index는 실패합니다.
Vincent

59

Windows 명령 행 참조에서 :

주석 처리 된 행을 무시하고 파일을 구문 분석하려면 다음을 입력하십시오.

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

이 명령은 Myfile.txt의 각 줄을 구문 분석하여 세미콜론으로 시작하는 줄을 무시하고 각 줄에서 FOR 본문으로 두 번째 및 세 번째 토큰을 전달합니다 (토큰은 쉼표 또는 공백으로 구분). FOR 문의 본문은 % i를 참조하여 두 번째 토큰을 가져오고 % j는 세 번째 토큰을 가져오고 % k는 나머지 모든 토큰을 가져옵니다.

제공 한 파일 이름에 공백이 있으면 텍스트 주위에 따옴표를 사용하십시오 (예 : "파일 이름"). 인용 부호를 사용하려면 usebackq를 사용해야합니다. 그렇지 않으면 따옴표는 구문 분석 할 리터럴 문자열을 정의하는 것으로 해석됩니다.

그런데 대부분의 Windows 시스템에서 다음 명령 줄 도움말 파일을 찾을 수 있습니다.

 "C:\WINDOWS\Help\ntcmds.chm"

8
명확히"인용 부호를 사용하여, 당신은 사용해야합니다 usebackq" : for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
drzaus

35

배치 파일에서는 반드시 사용하는 %%대신 %: (유형 help for)

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF

수행 할 작업 : for 명령 끝에있는 "do call : process %% i %% j %% k"는 for 명령에서 얻은 정보를 myfile.txt에서 "process" 'subroutine'으로 전달합니다.

배치 프로그램에서 for 명령을 사용하는 경우 변수에 이중 % 부호를 사용해야합니다.

다음 행은 해당 변수를 for 명령에서 프로세스 '서브 루틴'으로 전달하고이 정보를 처리 할 수 ​​있도록합니다.

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

추가 예제가 필요할 경우 공유 할 수있는이 정확한 설정을 꽤 고급으로 사용합니다. 물론 필요에 따라 EOL 또는 Delims에 추가하십시오.


27

첫 번째 "FOR / F .."답변 개선 : 내가해야 할 일은 MyList.txt에 나열된 모든 스크립트를 실행하는 것이 었습니다.

for /F "tokens=*" %A in  (MyList.txt) do CALL %A ARG1

-또는 여러 줄로 작성하려면 다음을 수행하십시오.

for /F "tokens=*" %A in  (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)

편집 : 위의 예제는 명령 프롬프트에서 FOR 루프를 실행하기위한 것입니다. 배치 스크립트에서 아래와 같이 추가 %를 추가해야합니다.

---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in  ( MyList.TXT) do  (
   ECHO Processing %%A.... 
   CALL %%A ARG1 
)
@echo on
;---END of MyScript.bat---

21

@MrKraus의 대답 은 유익합니다. 또한 배치 파일 과 동일한 디렉토리에있는 파일을로드 하려면 파일 이름 앞에 % ~ dp0을 붙이십시오. 예를 들면 다음과 같습니다.

cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

NB : : 파일 이름 또는 디렉토리 (예 : 위의 예에서 myfile.txt)에 공백이 있으면 (예 : 'my file.txt'또는 'c : \ Program Files') 다음을 사용하십시오.

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A

의와 유형의 호출 키워드 type텍스트 파일의 내용을 표시 프로그램을. type 명령을 호출하는 오버 헤드가 발생하지 않도록하려면 디렉토리를 텍스트 파일의 디렉토리로 변경해야합니다. 공백이있는 파일 이름에는 유형이 여전히 필요합니다.

나는 이것이 누군가를 돕기를 바랍니다!


배치 파일은 기본적으로 현재 폴더에서 볼 수 있으므로 파일 이름 앞에 접두사를 지정할 필요가 없습니다.
foxidrive 12

1
@ foxidrive : 알겠습니다. 주의를 기울여야합니다. 예를 들어 디렉토리가 변경된 경우 배치 파일이있는 디렉토리가 아닌 해당 디렉토리를 찾습니다. 그러면 솔루션 **cd /d %~dp0**이 for 루프 전에 호출 됩니다. 이렇게하면 배치 파일이있는 디렉토리에서 파일을 참조하게됩니다. 관찰 해 주셔서 감사합니다.
Marvin Thobejane

2
type둘러보기를 위한 Thx와 +1
halex

type작업을 해결할 수 없습니다. 파일 이름은 공백이 포함 된 다른 디렉토리에 있기 때문에 파일 이름을 인용해야했습니다 (Damn you Program Files). 오류가 발생했습니다The system cannot find the file `type.
scragar

1
@ scragar, 당신은 올바른 견적을 받았습니까? '가 아닌`이어야합니다. 내 키보드에서 그것은 @와 같은 키에 있습니다
FrinkTheBrave

18

허용되는 답변은 좋지만 두 가지 제한이 있습니다.
빈 줄과 줄로 시작합니다.;

모든 내용을 읽으려면 지연 확장 토글 기술이 필요합니다.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Findstr은 각 줄 앞에 줄 번호와 콜론을 붙이는 데 사용되므로 빈 줄은 더 이상 비어 있지 않습니다.

%%a매개 변수에 액세스 할 때 DelayedExpansion을 비활성화해야합니다 . 그렇지 않으면 느낌표 !와 캐럿 ^이 해당 모드에서 특별한 의미를 갖기 때문에 손실됩니다.

그러나 회선에서 회선 번호를 제거하려면 지연된 확장을 활성화해야합니다.
set "var=!var:*:=!"첫 번째 콜론까지의 delims=:모든 콜론을 제거합니다.
endlocal은 다음 줄에 대해 지연된 확장을 다시 비활성화합니다.

유일한 제한은 이제 ~ 8191의 줄 길이 제한이지만이를 극복 할 방법이없는 것 같습니다.


Win 10은 setlocal명령 줄에서 허용되지 않습니다 . CMD에서 코드를 실행하면! var! 공백 대신. 어떻게 고치는 지?
짐바

처리 전에 파일을 최대 행 길이 8190의 임시 파일로 분할하여 행 길이 한계를 극복 할 수 있습니다. 그런 다음 하나의 파일로 다시 결합했습니다.
짐바

14

또는 옵션을 따옴표로 묶지 않아도됩니다.

FOR /F %%i IN (myfile.txt) DO ECHO %%i

1
서로 옆에있는 두 개의 백분율 기호 %%는 명령에서 배치 파일이 아닌 단일 백분율 기호로 취급됩니다.
Paul

9

다음은 폴더의 모든 SQL 스크립트를 실행하기 위해 작성한 bat 파일입니다.

REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************

dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp


6

사용 허용 anwser cmd.exe

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

"일반"파일에 대해서만 작동합니다. 거대한 파일로 비참하게 실패합니다.

큰 파일의 경우 Powershell 및 다음과 같은 것을 사용해야 할 수 있습니다.

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }

또는 메모리가 충분한 경우 :

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

이것은 2 백만 줄 이상을 포함하는 250 MB 파일로 저에게 효과적이었습니다. 여기에서 for /F ...명령은 수천 줄 후에 붙어 있습니다.

사이의 차이 foreachForEach-Object, 참조 알고를 ForEach과 같이 ForEach-오브젝트에 도착 .

(신용 : PowerShell에서 한 줄씩 파일 읽기 )


1

Heroku의 Rails 앱을 나열하기 위해 여기에 수정 된 예-감사합니다!

cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i

전체 코드는 여기에 있습니다 .


위의 다른 질문에 대한 코멘트 당 -파일 생성 / 읽기를 건너 뛰고 바로 사용할 수 있습니다 for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...( ^파이프를 이스케이프하는 데 사용되는 추가 사항 for은 명령 프로세서로 직접 전달 되지 않고 파이프로 전달됩니다 )
user66001

0

명령 행에서 텍스트 파일의 모든 행을 인쇄하려면 (delayedExpansion) :

set input="path/to/file.txt"

for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!)

선행 공백, 빈 줄, 공백 줄과 함께 작동합니다.

Win 10 CMD에서 테스트


하나님은 시도하지만 첫 번째 샘플은 ]]]줄에서 행간 을 제거 하고 두 번째 샘플은 빈 줄과 공백으로 시작하는 줄을 삭제합니다.
jeb

두 번째는 빈 줄을 제거하는 것입니다. delims텍스트 파일의 줄이 ]예 를 들어 시작하면 첫 번째 줄을 수정할 수 있습니다. 그렇지 않은 문자 또는 백 스페이스 나 벨과 같은 제어 문자로 대체하십시오. 그들은 일반적으로 텍스트 파일에서 찾을 수 없습니다. 그 이유는 delims=]만든 자리 표시자를 제거하는 것입니다 /nfind빈 줄을 보존하기 위해 명령을 사용합니다.
짐바

@jeb : bracket]]] 문제가 해결되었습니다. 텍스트 파일의 모든 줄을 인쇄하려면 업데이트를 참조하십시오. Win 10 CMD에서도 작동합니다.
짐바
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.