![使用 robocopy 进行通配符目录排除——奇怪的情况](https://linux22.com/image/559544/%E4%BD%BF%E7%94%A8%20robocopy%20%E8%BF%9B%E8%A1%8C%E9%80%9A%E9%85%8D%E7%AC%A6%E7%9B%AE%E5%BD%95%E6%8E%92%E9%99%A4%E2%80%94%E2%80%94%E5%A5%87%E6%80%AA%E7%9A%84%E6%83%85%E5%86%B5.png)
我需要让 robocopy 排除路径中包含特定名称目录的任何文件。例如,“bar”:
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^\*
有任何想法吗?
答案1
事实证明 /XD 匹配的是目录名称——而不是完整路径。因此您实际上不必担心匹配反斜杠。
因此,为了排除名为“bar”的目录(路径中的任何位置),可以使用一个简单的/XD 栏会起作用。如果你通缉为了排除“barf”,您可以使用/XD bar*。
有时答案比你想象的要简单。
答案2
导致失败的部分原因是在引用目录时在 Robocopy 中使用尾随 \ - 这是不行的 - 因为 Robocopy 会尝试将其解释为转义字符。几乎每个人都在使用 Robocopy 时以某种方式犯了这个错误。考虑到这一点,这个例子就可以起作用:
/XD "\Bar"
如果您想要匹配更具体的文件夹结构(以免匹配其他子文件夹,您可以添加更多详细信息,例如:
/XD "\Foo\Bar"
/XD "C:\Foo\Bar"
答案3
如果您尝试不同的目录过滤器,请确保在更改之间清除目标文件夹!
对我来说,一个问题是我没有意识到忽略目录开关也适用于目标文件夹。我运行了 robocopy/MIR
并更改了源目录,我的目标目录按预期更新。然后我注意到我有我不想要的存档文件夹,所以我添加了/XD archive
,但我的目标文件夹中仍然有存档文件夹!
在尝试了通配符并包括/排除 s 之后\
,我终于尝试删除目标文件夹并重新运行脚本 - 这次它没有存档文件夹!这是我正在运行的命令,目录名称已更改以保护无辜者:
robocopy \\SERVER\Some\Folder\Path .\Some\Relative\Path /Copy:DAT /Mir /R:0 /W:1 /XD archive*
答案4
很抱歉,但根据https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy:
/xf <FileName>[ ...] 排除与指定名称或路径匹配的文件。请注意,FileName 可以包含通配符 (* 和 ?)。/
xd <Directory>[ ...] 排除与指定名称和路径匹配的目录。
所以这具体意味着通配符可以在 /xf 标志中使用,但不能在 /xd 标志中使用。