Назад | Перейти на главную страницу

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

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

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 совпадает с именем каталога, а не с полным путем. Таким образом, вам не нужно беспокоиться о совпадении обратной косой черты.

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

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

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

/XD "\Bar"

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

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

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

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

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

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

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

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

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