Исключения подстановочных каталогов с помощью robocopy - странный случай

16

Мне нужно получить robocopy, чтобы исключить любой файл, путь которого содержит каталог с конкретным именем. Например, «бар»:

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

следует исключить, но не

c:\foo\barf\b.txt

Вот то, что я попробовал - каждая из которых была отвергнута робокопией:

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

Есть идеи?

Джесси
источник

Ответы:

18

Получается, что / XD совпадает с именем каталога, а не с полным путем. Так что вам на самом деле не нужно беспокоиться о сопоставлении с обратными слешами.

Таким образом, чтобы исключить каталоги (в любом месте пути), называемые "bar", будет работать простая / XD панель . Если вы хотели , чтобы исключить «Barf» тоже можно использовать / XD бар *.

Иногда ответ проще, чем вы думаете.

Джесси
источник
4

Частично ошибка заключается в использовании завершающего \ в Robocopy при обращении к каталогу, который запрещен, поскольку Robocopy пытается интерпретировать его как escape-символ. Почти каждый делает эту ошибку, так или иначе, с Robocopy. Имея это в виду, этот пример будет работать:

/XD "\Bar"

Если вы хотите соответствовать более определенной структуре папок (чтобы не соответствовать другим подпапкам, вы можете добавить больше деталей, например:

/XD "\Foo\Bar"
/XD "C:\Foo\Bar"
Майкл Эспинола
источник
2
Подстановочные знаки не работают. Robocopy выдаст ошибку, если вы попытаетесь. Вы проверяли свои примеры?
user1751825
Я использовал его и пользуюсь им, за исключением того факта, что я ошибочно добавил звездочку в мой пример, для которого, как мне кажется, я перепутал синтаксис с ключом / XF. Я исправил свой ответ. Благодарю.
Мишель Эспинола
1

Если вы пытаетесь использовать разные фильтры каталогов, не забудьте очистить папку назначения между изменениями!

Гвоздь для меня заключался в том, что я не осознавал, что переключатель игнорирования каталога также применяется к папкам назначения. Я запустил robocopy /MIRи изменил исходный каталог, а мой целевой каталог обновился, как и ожидалось. Затем я заметил, что у меня есть архивные папки, которые мне не нужны, поэтому я добавил /XD archive, но в моей папке назначения все еще были архивные папки!

После работы с подстановочными знаками, включая / исключая \s, я наконец попытался удалить папку назначения и повторно запустить скрипт - на этот раз у него не было папок архива! Вот команда, которую я выполнял, с изменением имен каталогов, чтобы защитить невинных:

robocopy \\SERVER\Some\Folder\Path .\Some\Relative\Path /Copy:DAT /Mir /R:0 /W:1 /XD archive*
tehDorf
источник
0

Извините, но в соответствии с документацией на https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy :

/ xf <FileName> [...] Исключает файлы, которые соответствуют указанным именам или путям. Обратите внимание, что FileName может содержать символы подстановки (* и?).
/ xd <Directory> [...] Исключает каталоги, которые соответствуют указанным именам и путям.

Так что это, в частности, означает, что подстановочный знак может использоваться во флаге / xf, но не во флаге / xd.

Питер
источник