for / r返回不存在的文件

时间:2018-01-11 04:36:08

标签: for-loop cmd

for /r %i (<filename>) do返回不存在的文件。例如。在下面的详细示例中,文件C:\Temp\2018-01\no\b.txt 不存在 。然而,for命令返回该文件,就像它一样。当尝试对目录树中的每个<filename>执行某些操作时,这会导致问题。

如何阻止for命令返回不存在的文件?

使用for /r对目录树中特定文件的所有实例执行某些操作时,即使对于不包含该文件的目录,该循环也会返回该文件。例如,以下命令:

for /r %i in (<filename>) do @echo %i

输出:<path>\<filename>表示树中的每个目录,无论文件是否存在。

以下控制台会话演示。

C:\Temp\2018-01>copy con b.txt
 ^Z
        1 file(s) copied.

C:\Temp\2018-01>mkdir no\yes

C:\Temp\2018-01>copy b.txt no\yes
        1 file(s) copied.

C:\Temp\2018-01>dir /a/s/b b.txt
C:\Temp\2018-01\b.txt
C:\Temp\2018-01\no\yes\b.txt

C:\Temp\2018-01>for /r %i in (b.txt) do @echo %i
C:\Temp\2018-01\b.txt
C:\Temp\2018-01\no\b.txt
C:\Temp\2018-01\no\yes\b.txt

C:\Temp\2018-01>

请注意,dir命令仅列出b.txt的2个实例,而for命令也输出不存在的...\no\b.txt

为了记录,我在Windows 10和Windows Server 2008 R2上观察到了这一点。但我怀疑这个版本真的很重要。

1 个答案:

答案 0 :(得分:0)

对于上述内容,我确实有一些解决方法。但希望有人能够解决这个问题,并且可能是一个更好的选择。

第一个选项是在执行命令之前显式检查文件是否存在。它有点冗长,但应该可靠。

for /r %i in (b.txt) do @if exist "%i" echo %i

第二个选项是使用通配符强制搜索与模式匹配的所有文件。从理论上讲,这意味着它可以匹配比预期更多的文件。但仔细放置通配符可以减轻这种情况。

for /r %i in (b.txt*) do @echo %i