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上观察到了这一点。但我怀疑这个版本真的很重要。
答案 0 :(得分:0)
对于上述内容,我确实有一些解决方法。但希望有人能够解决这个问题,并且可能是一个更好的选择。
第一个选项是在执行命令之前显式检查文件是否存在。它有点冗长,但应该可靠。
for /r %i in (b.txt) do @if exist "%i" echo %i
第二个选项是使用通配符强制搜索与模式匹配的所有文件。从理论上讲,这意味着它可以匹配比预期更多的文件。但仔细放置通配符可以减轻这种情况。
for /r %i in (b.txt*) do @echo %i