programing

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

topblog 2023. 5. 28. 19:52
반응형

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

윈도우 배치 파일을 사용하여 텍스트 파일의 각 줄을 루프하고 각 줄을 순차적으로 처리하는 방법을 알고 싶습니다.

저는 전체 라인을 전체적으로 처리해야 했습니다.여기 제가 일하는 것을 발견했습니다.

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 본문으로 전달합니다(토큰은 쉼표 또는 공백으로 구분됨).FOR 문 본문은 %i를 참조하여 두 번째 토큰을 가져오고, %j는 세 번째 토큰을 얻으며, %k는 나머지 토큰을 모두 가져옵니다.

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

참고로 대부분의 Windows 시스템에서 명령줄 도움말 파일을 찾을 수 있는 위치는 다음과 같습니다.

 "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 명령어로 획득한 정보를 전달합니다.txt를 "process" 'subroutine'에 추가합니다.

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

다음 행에서는 이러한 변수를 for 명령에서 프로세스 '하위 루틴'으로 전달하고 이 정보를 처리할 수 있습니다.

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

저는 이 정확한 설정을 상당히 고급으로 사용하고 있으며, 추가 사례가 필요할 경우 기꺼이 공유할 수 있습니다.물론 필요에 따라 EOL 또는 Delims를 추가합니다.

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

@Kraus씨의 대답은 유익합니다.또한 배치 파일과 동일한 디렉터리에 있는 파일을 로드하려면 파일 이름 앞에 %~dp0을 붙입니다.다음은 예입니다.

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

NB:: 파일 이름 또는 디렉터리(예: 내 파일)입니다.위 예제의 txt)에는 공백(예: '내 파일')이 있습니다.txt' 또는 'c:\Program Files'), 사용:

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

type 키워드를 사용하여 호출합니다.type텍스트 파일의 내용을 표시하는 프로그램입니다.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매개변수, 그렇지 않은 경우 느낌표! 그리츠레카고츠.^해당 모드에서 특별한 의미를 가지므로 손실됩니다.

그러나 라인에서 라인 번호를 제거하려면 지연 확장을 사용해야 합니다.
set "var=!var:*:=!"콜론까지 ).delims=:또한 findstr)에서 콜론뿐만 아니라 줄의 시작 부분에 있는 콜론도 모두 제거합니다.
엔드로컬은 다음 행에 대해 지연된 확장을 다시 사용하지 않도록 설정합니다.

이제 한계는 ~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

Windows 계열 Windows())가 있는 경우cmd.exe셸로), FOR/F 명령을 사용해 보십시오.

승답변인된을 사용하여 승인된 입니다.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 개체 및 각 개체에 대해 알아보기를 참조하십시오.

(크레딧: PowerShell에서 파일을 한 줄씩 읽기)

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

전체 코드입니다.

명령행에서 텍스트 파일의 모든 행을 인쇄하려면(확장이 지연된 경우):

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에서 테스트됨

테스트 텍스트

언급URL : https://stackoverflow.com/questions/155932/how-do-you-loop-through-each-line-in-a-text-file-using-a-windows-batch-file

반응형