批处理:从路径中带有空格的文件中读取行

7
在批处理文件中从文件中读取行,您需要执行以下操作:
for /f %%a in (myfile.txt) do (
    :: do stuff...
)

现在假设你的文件位于 C:\Program Files\myfolder

for /f %%a in ("C:\Program Files\myfolder\myfile.txt") do (
    echo %%a
)

结果:

C:\Program Files\myfolder\myfile.txt

这似乎将给定的路径解释为字符串,因此%%a是您提供的路径。
到目前为止,我找到的文档中没有任何相关内容。 请有人在我开枪之前帮助我。

2
在有更好的答案出现之前,复制"C:\Program Files\myfolder\myfile.txt"到temp.txt,用你的for循环,然后删除temp.txt。 - Gilbert Le Blanc
@Gilbert:希望它不是一个名为“my file.txt”的文件... - glmxndr
3个回答

7
当您键入help for时获得的文档会告诉您如果路径中有空格该怎么做。
For file names that contain spaces, you need to quote the filenames with
double quotes.  In order to use double quotes in this manner, you also
need to use the usebackq option, otherwise the double quotes will be
interpreted as defining a literal string to parse.

默认情况下,FOR /F 的语法如下。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

这个语法展示了你的type解决方案为什么有效。因为单引号表示执行type命令并循环输出。当添加usebackq选项时,语法变成了这样:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

现在你需要用双引号引用文件路径,用单引号引用字面字符串,并在要执行的命令周围加上反引号(重音符号)。
所以你想要这样做:
for /f "usebackq" %%a in ("C:\Program Files\myfolder\myfile.txt") do (
    echo %%a
)

我错过了文档的那一部分。谢谢! - glmxndr

1

找到了。

for /f %%a in ('type "C:\Program Files\myfolder\myfile.txt"') do (
    echo Deleting: %%a
)

别问我为什么它能工作。


因为TYPE显示文本文件。你的FOR循环正在处理表示myfile.txt文件内容的字符串。干得好。 - Gilbert Le Blanc
是的,但它使用的是“for /f”命令,这是用于读取文件的。我本来期望它可以直接用“for”命令运行……但事实并非如此。不管怎样……最重要的是我没有把自己搞炸。 - glmxndr

0

分享以下代码,希望有人受益。

以下代码可以处理路径中包含空格以及读取的行中包含空格的情况,不会导致空格后面的字符丢失;

FOR /f "tokens=* delims=," %%a in ('type "C:\Progrem File\My Program"') do ( echo %%a )


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