使用批处理从文件中读取带空格的行

7
我将尝试使用批处理从文本文件中读取每一行。
文件中的行包含一些空格,这是一个输入示例:
This is the first line
This is the second line
...

我正在使用以下源代码。
FOR /f %%a in ("%1") do (
    @echo %%a
)
goto:eof

输出结果如下:
This
This
...

我在Stack Overflow上读到了以下条目,但它并没有解决我的问题。 批处理:读取带有路径空格的文件中的行


假设 %1 是您的文件名,那么您发布的代码无法按照您所描述的方式工作。您必须使用 "usebackq" 选项,或者您的 IN() 子句不能被引用。 - dbenham
3个回答

12

试试这个。

FOR /f "tokens=* delims=,"  %%a in ('type "%1"') do (
    @echo %%a
)

2
现在代码将在每行的第一个,处截断。 - dbenham

6

Bali C和Henry Gao回避了这个问题。

您的代码在第一个空格处终止值,因为FOR / F旨在将字符串解析为分隔符令牌。默认分隔符是空格和制表符。您可以通过将DELIMS设置为空来保留整行。

for /f "usebackq delims=" %%a in ("%~1") do echo %%a

但是仍然存在潜在的问题:FOR /F循环跳过空行,并且还跳过以EOL字符(默认为;)开头的行。
FOR命令(尤其是FOR /F变量)是一个复杂的工具。我建议阅读http://judago.webs.com/batchforloops.htm,了解FOR命令的细节和技巧。

2

您需要设置批处理在每行读取到哪个分隔符。

FOR /f "delims=;" %%a in ("%1") do (
    @echo %%a
)

默认的行结束分隔符是分号。或者使用一个文件中不太可能出现的字符,比如~¬


1
为什么要将分隔符设置为奇怪的值,而不是简单地将其设置为空? - jeb
@jeb 你怎么设置为空呢?"delims="不会默认将其设置为空格吗? - Bali C
不,就像dbenham所展示的那样,"delims="将其设置为空,只有EOL不能以这种方式设置为空值,"EOL="会将EOL设置为引号。但是可以通过其他方式使EOL为空。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接