275

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

4

12 回答 12

345

我需要将整条生产线作为一个整体进行处理。这是我发现的工作。

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
于 2008-10-02T18:33:46.133 回答
60

从 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"
于 2008-10-01T02:06:49.930 回答
37

在批处理文件中,您必须使用:(类型)%%%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 传递到“进程”“子例程”。

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

以下行将这些变量从 for 命令传递到进程“子例程”,并允许您处理此信息。

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

如果需要更多示例,我愿意分享这个精确设置的一些非常高级的用法。当然,根据需要添加您的 EOL 或 Delims。

于 2010-05-04T14:39:16.580 回答
30

改进第一个“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---
于 2012-01-23T18:36:46.937 回答
23

@MrKraus 的回答很有启发性。此外,让我补充一点,如果要加载与批处理文件位于同一目录中的文件,请在文件名前加上 %~dp0。这是一个例子:

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

注意::如果您的文件名或目录(例如上例中的 myfile.txt)有空格(例如 'my file.txt' 或 'c:\Program Files'),请使用:

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

,使用type关键字调用type程序,该程序显示文本文件的内容。如果您不想承受调用 type 命令的开销,您应该将目录更改为文本文件的目录。请注意,带有空格的文件名仍然需要 type 。

我希望这可以帮助别人!

于 2013-05-28T12:49:53.713 回答
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 用于在每行前面加上行号和冒号,因此空行不再为空。

访问参数时需要禁用DelayedExpansion %%a,否则感叹号!和插入符号^将丢失,因为它们在该模式下具有特殊含义。

但是要从行中删除行号,需要启用延迟扩展。
set "var=!var:*:=!"删除第一个冒号之前的所有冒号(使用delims=:也会删除一行开头的所有冒号,而不仅仅是 findstr 中的冒号)。
endlocal 为下一行再次禁用延迟扩展。

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

于 2013-07-18T12:52:01.560 回答
14

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

FOR /F %%i IN (myfile.txt) DO ECHO %%i
于 2009-08-12T13:18:09.143 回答
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
于 2008-10-01T02:08:09.647 回答
7

如果您有一个 NT 系列 Windows(一个带有cmd.exe外壳的),请尝试FOR /F 命令

于 2008-10-01T02:03:54.790 回答
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" } 

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

有关 和 之间的区别foreachForEach-Object请参阅了解 ForEach 和 ForEach-Object

(学分:在 PowerShell 中逐行读取文件

于 2018-10-14T19:39:30.443 回答
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

完整代码在这里

于 2013-01-11T19:27:38.153 回答
0

从命令行打印文本文件中的所有行(使用延迟扩展):

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

测试文本

于 2020-02-02T10:42:49.120 回答