通配符目录排除与robocopy – 奇怪的情况

我需要使用robocopy来排除其path包含具有特定名称的目录的任何文件。 例如,“酒吧”:

c:\foo\bar\a.txt c:\bar\c.txt d:\baz\bar\flub\d.txt 

应该被排除,但不是

 c:\foo\barf\b.txt 

这是我试过的东西 – 每个都被robocopy拒绝了:

 /XD \bar\ /XD *\bar\* /XD *^\bar^\* 

有任何想法吗?

打开目录名称上的/ XD匹配项 – 不是完整path。 所以你实际上不必担心匹配反斜杠。

所以要排除名为“bar”的目录(在path的任何地方),一个简单的/ XD栏将起作用。 如果你排除“barf”,你可以使用/ XD bar *。

有时答案比你想象的要简单。

部分失败是在引用一个目录的时候在Robocopy中使用一个尾随的\,这是一个禁忌 – Robocopy试图把它解释为一个转义字符。 Robocopy几乎每个人都以这种或那种方式犯这个错误。 考虑到这一点,这个例子将工作:

 /XD "\Bar" 

如果您想匹配更具体的文件夹结构(以便不匹配其他子文件夹,则可以添加更多详细信息,如:

 /XD "\Foo\Bar" /XD "C:\Foo\Bar" 

如果您尝试不同的目录filter,请务必在更改之间清除目标文件夹!

对我来说,是我没有意识到忽略目录开关也适用于目标文件夹。 我用/MIR运行了robocopy,并更改了源目录,并按预期更新了目标目录。 然后我注意到我有我不想要的存档文件夹,所以我添加了/XD archive ,但我的目标文件夹中仍然有存档文件夹!

在弄乱了通配符并且包括/不包括\ s之后,我终于尝试删除目标文件夹并重新运行脚本 – 这次它没有存档文件夹! 这里是我正在运行的命令,改变目录名称以保护无辜者:

 robocopy \\SERVER\Some\Folder\Path .\Some\Relative\Path /Copy:DAT /Mir /R:0 /W:1 /XD archive*