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

StackOverflow https://stackoverflow.com/questions/155932

  •  03-07-2019
  •  | 
  •  

문제

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

도움이 되었습니까?

해결책

아래 게시물은 크게 도움이되었지만 전체 라인 전체를 어디서 처리 해야하는지 내 질문에서 언급 한 내용을 수행하지 않았습니다. 여기에 내가 찾은 것이 있습니다.

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

별표가있는 토큰 키워드 (*)는 전체 라인의 모든 텍스트를 가져옵니다. 별표에 넣지 않으면 줄에서 첫 번째 단어 만 당길 것입니다. 나는 그것이 공간과 관련이 있다고 가정합니다.

Technet의 명령

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


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

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

다른 팁

Windows 명령 줄 참조 :

파일을 구문 분석하고 주석은 라인을 무시하고 다음을 입력합니다.

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

이 명령은 MyFile.txt의 각 라인을 파싱하여 세미콜론으로 시작하는 선을 무시하고 각 라인에서 For Body로 두 번째 및 세 번째 토큰을 전달합니다 (토큰은 쉼표 또는 공간으로 구분됩니다). For Statement 참조의 본문 %i는 두 번째 토큰, %j를 얻기 위해, 세 번째 토큰을 얻고, %k는 나머지 토큰을 모두 얻습니다.

공급하는 파일 이름에 공백이 포함 된 경우 텍스트 주변의 따옴표를 사용하십시오 (예 : "파일 이름"). 견적 마크를 사용하려면 asudackq를 사용해야합니다. 그렇지 않으면 인용 표시는 문자 그대로 문자열을 정의하는 것으로 해석됩니다.

그건 그렇고, 대부분의 Windows Systems에서 명령 줄 헬프 파일을 찾을 수 있습니다.

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

배치 파일에서는 해야 하다 사용 %% 대신에 % :(유형 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" '서브루틴'으로 전달합니다.

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

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

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

추가 예제가 필요할 경우 공유하고 싶은 정확한 설정에 대한 몇 가지 고급 사용법이 있습니다.물론 필요에 따라 EOL 또는 Delim을 추가하십시오.

첫 번째 "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
)

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

---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---

@Mrkraus 's 대답 유익합니다. 또한 추가하겠습니다 같은 디렉토리에있는 파일을로드하려면 배치 파일로서 파일 이름을 %~ dp0으로 접두사하십시오. 예는 다음과 같습니다.

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

NB :: 파일 이름 또는 디렉토리 (위의 예에서 myFile.txt)에 공간이있는 경우 (예 : '내 파일 .txt'또는 'c : program files')가있는 경우 :

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

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

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

허용 된 대답은 양호하지만 두 가지 제한 사항이 있습니다.
빈 줄과 선을 시작합니다 ;

모든 컨텐츠 라인을 읽으려면 지연된 확장 토글링 기술이 필요합니다.

@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 매개 변수, 다른 느낌표 ! 그리고 CARETS ^ 해당 모드에서 특별한 의미가 있으므로 손실됩니다.

그러나 라인에서 라인 번호를 제거하려면 지연된 확장을 활성화해야합니다.
set "var=!var:*:=!" 첫 번째 결장까지 모든 것을 제거합니다 (사용 delims=: FindStr의 콜로뿐만 아니라 선의 시작 부분에있는 모든 콜로를 제거합니다).
endlocal은 다음 줄에 대한 지연 확장을 다시 비활성화합니다.

유일한 제한은 이제 ~ 8191의 라인 길이 한계이지만, 이것을 극복 할 방법은 없습니다.

또는 옵션을 따옴표로 제외 할 수 있습니다.

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

다음은 폴더에서 모든 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

NT-Family Windows가있는 경우 (하나가 있습니다 cmd.exe 껍질로) 시도해보십시오 for /f 명령.

허용 된 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 백만 줄 이상의 250MB 파일로 저에게 효과적이었습니다. for /F ... 명령은 수천 줄에 갇혔습니다.

차이점 foreach 그리고 ForEach-Object, 보다 Foreach와 foreach-bobject를 알게됩니다.

(크레딧 : PowerShell에서 라인별로 파일을 읽으십시오 )

여기에 Heroku에 Rails 앱을 나열하기위한 Modded 예제 - 감사합니다!

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

전체 코드 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top