批处理文件检查文件列表是否存在。无法处理带有空格的文件。

3

我有一个文件名列表存在文本文件中,我想生成任何不存在的文件的报告。我尝试使用以下代码创建批处理文件,但是它无法处理路径中包含空格的文件:

FOR /F %%f IN (filelist.txt) DO (IF EXIST %%f (ECHO %%f exists) ELSE (ECHO %%f doesn't exist >> C:\doesntexist.txt ))

在我的输出文件中,出现了一个错误提示:"C:\Documents不存在",显示它没有解析完整的文件名。

我该如何修复这个问题,以便可以检查所有带空格路径的文件?

2个回答

7

无论何时可能存在一个字符串包含分隔符,例如空格,你需要“将该字符串用引号括起来”

for /f默认情况下使用分隔符对其接收到的数据进行分词,因此第一个指定的标记被分配给元变量(在您的情况下为%%f),下一个被分配给%%g等等。

您可以通过使用命令修改器(从提示符中查看for /?)控制多少个标记、分隔符和其他解析特性。

在您的情况下,您只想要一个没有分隔符的标记(默认为1个标记和分隔符=分隔符),因此

FOR /F "delims=" %%f IN (filelist.txt) DO (IF EXIST "%%f" (ECHO %%f exists) ELSE (ECHO %%f doesn't exist >> C:\doesntexist.txt ))

如果filelist.txt文件名中包含空格,那么就会有一些额外的复杂性。在这种情况下,您需要使用以下命令:

FOR /F "usebackqdelims=" %%f IN ("filelist.txt") DO (IF EXIST "%%f" (ECHO %%f exists) ELSE (ECHO %%f doesn't exist >> C:\doesntexist.txt ))

出于文档中“for /?”的“解释”,存在某些原因。


谢谢你的帮助!那个方法可行,而且感觉也有点道理 :D - Chauncy Peppertooth

1

你必须使用引号:

FOR /F %%f IN (filelist.txt) DO (
    IF EXIST "%%f" (ECHO "%%f" exists) ELSE (ECHO %%f doesn't exist >> C:\doesntexist.txt )
)

似乎没有什么区别。 - Chauncy Peppertooth
你说得对,我漏掉了“delims=”来考虑从文件中读取整行! - LS_ᴅᴇᴠ

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