你如何循环使用Windowsbatch file的文本文件中的每一行?

我想知道如何循环使用Windowsbatch file的文本文件中的每一行,并连续处理每一行文本。

下面的post帮了我很大的忙,但是我没有做我在我的问题中所说的,我需要整个处理整个行。 这是我发现的工作。

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

带星号(*)的tokens关键字将为整行提取所有文本。 如果你不加星号,它只会拉第一个字。 我认为这与空间有关。

对于TechNet上的命令

我感谢所有的post!

从Windows命令行参考:

要parsing文件,忽略注释行,请input:

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

此命令parsingMyfile.txt中的每一行,忽略以分号开头的行,并将每行的第二个和第三个标记传递给FOR正文(标记由逗号或空格分隔)。 FOR语句的主体引用%i获取第二个标记,%j获取第三个标记,而%k获取所有剩余的标记。

如果提供的文件名包含空格,请在文本周围使用引号(例如“文件名”)。 要使用引号,您必须使用usebackq。 否则,引号被解释为定义一个文字stringparsing。

顺便说一句,您可以在大多数Windows系统上find命令行帮助文件:

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

在batch file中,您必须使用%%而不是% :(inputhelp 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命令时,需要为variables使用双%符号。

以下几行将这些variables从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--- 

MrKraus的回答是有益的。 此外,让我补充一点, 如果要加载与batch file位于同一目录中的文件,请在文件名前面加上%〜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命令的开销,你应该把目录改成文本文件的目录。 请注意,带空格的文件名仍然是必需的。

我希望这可以帮助别人!

被接受的答案是好的,但有两个限制。
它会删除以空格开始的空行;

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

 @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,但似乎没有办法克服这一点。

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

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

这里是我写的一个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 

如果您有一个NT系列Windows(一个以cmd.exe作为shell),请尝试使用FOR / F命令 。

在这里修改示例来列出我们在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 

完整代码在这里 。