如何使用Windows批处理文件遍历文本文件中的每一行?

时间:2008-10-01 02:01:38

标签: windows batch-file

我想知道如何使用Windows批处理文件遍历文本文件中的每一行,并连续处理每行文本。

12 个答案:

答案 0 :(得分:276)

以下帖子有很大帮助,但没有按照我在问题中所说的那样做,我需要处理整个整行。这是我发现的工作。

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

带有星号(*)的tokens关键字将拉出整行的所有文本。如果你没有放入星号,它只会拉动该行的第一个单词。我认为它与空间有关。

For Command on TechNet

我感谢所有帖子!


如果文件路径中有空格,则需要使用usebackq。例如。

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

答案 1 :(得分:54)

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

答案 2 :(得分:31)

在批处理文件中,您必须使用%%代替% :(类型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”将forfile命令中获取的信息从myfile.txt传递给“process”'子例程'。

在批处理程序中使用for命令时,需要对变量使用双%符号。

以下几行将这些变量从for命令传递到进程'sub routine',并允许您处理此信息。

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

我对这个确切的设置有一些相当高级的用法,如果需要进一步的例子,我愿意分享。当然,根据需要添加您的EOL或Delims。

答案 3 :(得分:24)

改善第一个“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---

答案 4 :(得分:21)

@ MrKraus的answer很有启发性。此外,让我添加如果要加载位于同一目录中的文件作为批处理文件,请在文件名前加上%~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命令的开销,则应将目录更改为文本文件的目录。请注意,带空格的文件名仍然需要类型。

我希望这有助于某人!

答案 5 :(得分:14)

接受的答案很好,但有两个限制 它会删除以;

开头的空行和行

要读取任何内容的行,您需要延迟扩展切换技术。

@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=:也会删除一行开头的所有冒号,而不仅仅是来自findstr的冒号)。
endlocal再次禁用下一行的延迟扩展。

唯一的限制是现在行长度限制为~8191,但似乎无法克服这一点。

答案 6 :(得分:13)

或者,您可以在引号中排除选项:

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

答案 7 :(得分:9)

这是我写的一个bat文件,用于执行文件夹中的所有SQL脚本:

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

答案 8 :(得分:5)

如果你有一个NT系列Windows(一个cmd.exe作为shell),请尝试the FOR /F command

答案 9 :(得分:2)

使用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" } 

这对我有用,它包含一个250 MB的文件,其中包含超过200万行,其中for /F ...命令在数千行之后卡住了。

有关foreachForEach-Object之间的区别,请参见Getting to Know ForEach and ForEach-Object

(积分:Read file line by line in PowerShell

答案 10 :(得分: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

完整代码here

答案 11 :(得分:0)

要从命令行打印文本文件中的所有行(并使用delayExpansion):

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上测试

Test text