我想知道如何循环通过文本文件中的每一行使用Windows批处理文件和处理每行文本相继。


当前回答

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

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

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

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

适用于前导空白、空行、空白行。

在win10 CMD上测试

公认的答案是好的,但有两个局限性。 它删除空行和以;

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

@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用于用行号和冒号作为每行的前缀,因此空行不再是空的。

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

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

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

从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命令从myfile.txt中获取的信息传递给“process”“子例程”。

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

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

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

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