Robocopy 似乎有时会在过滤时自动使用通配符来处理文件扩展名。例如,使用“.m” 会得到“filename.m”而不是“output.mat”。但是,“.txt" 得到“filename.txt”以及“dummyfile.txt-long”。
到目前为止,我有这个: robocopy“E:\WorkDirectory”“F:\BackupDirectory”*.txt /E
我已经了解到我可以通过“/xf *.txt2”专门排除文件。
然而,我更喜欢一个更通用的解决方案……比如说,可以用于“.txt”但排除“.txt1、*.txt2、*.txt3、...” 而无需全部列举。谢谢!
答案1
您发现了 DOS 时代遗留的祸害之一。ROBOCOPY
不是在扩展名中添加通配符,而是匹配文件的短 8.3 名称。
过去,文件名被限制为一个最大长度为 8 的基本名称,后面跟着一个最大长度为 3 的扩展名。当添加长文件名功能时,需要一种方法来使旧程序能够继续使用长名称。因此,每个不符合 8.3 规范的文件都会自动获得一个符合规范的备用短名称。
短名称至今仍然存在,并且操作系统会自动将通配符文件名与长名称和短名称进行匹配。
因此,文件名类似于 ,somename.txt-long
就变成了SOMEFI~1.TXT
。您可以看到为什么该短名称与您的文件掩码匹配。
不幸的是,没有办法阻止 ROBOCOPY(或任何其他本机命令)匹配短名称。由于 8.3 名称会导致您遇到的问题,因此许多系统管理员会禁用 8.3 名称,尤其是在企业环境中。
如果您的文件存储在 NTFS 卷上,并且您以管理员身份运行控制台,则可以使用 禁用 8.3 名称FSUTIL
。这可以在系统范围内进行,也可以在每个卷的基础上进行。但是,这只能阻止创建新的 8.3 名称 - 现有的 8.3 名称仍然存在。您还可以使用FSUTIL
删除现有的 8.3 名称,但存在可能导致问题的注册表问题。我从未使用过该命令,所以我不知道所有的来龙去脉。
在不禁用 8.3 名称的情况下,我知道的唯一解决方案是使用您自己的FOR /F
循环处理文件,并结合DIR /B
管道来FINDSTR
消除扩展名超过 3 的文件。您还必须提供命令来单独处理每个匹配的文件。类似:
for /f "eol=: delims=" %F in ('dir /b /a-d *.txt^|findstr /lie ".txt"') do @someCommand "%F" ...
上述命令将处理当前目录中的所有 .txt 文件。可能需要进行大量调整才能使命令完全按照您的要求执行。此外,如果您在批处理脚本中使用该命令,则百分比需要加倍。