Мне нужно получить 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.