Как исключить подкаталоги в получателе при использовании/mir/xd-переключателя в robocopy - программирование
Подтвердить что ты не робот

Как исключить подкаталоги в получателе при использовании/mir/xd-переключателя в robocopy

Существует бег script, который отображает кучу папок с одного тома на другой. Проблема в том, что теперь в этих папках будут находиться подкаталоги, которые не являются частью исходного зеркалирования script. Они являются автономными подкаталогами, и я не хочу, чтобы они очищались после того, как зеркальное отражение удалось. Есть ли способ использовать переключатель /xd в robocopy, в котором я мог бы исключить целевые подкаталоги.

Пример:

robocopy "\\hq04t2fis202\archive\dr" "\\hq04t3fis202\archive\dr" /mir /xd "\\hq04t3fis202\archive\dr\*\hq04s2dba301"

В приведенном выше примере существует несколько каталогов под \\hq04t2fis202\archive\dr, которые зеркалируются. И в пункте назначения, когда эти каталоги зеркалируются из источника, существует еще один script, который выгружает отдельные подкаталоги в каждом из этих каталогов. Поэтому я хочу как-то использовать переключатель /xd, чтобы избежать очистки этих подкаталогов в пункте назначения. Кроме того, в приведенном выше примере в переключателе /xd я использую подстановочный знак "*", чтобы означать, что я хочу включить все каталоги, которые попадают в корневую папку "\\hq04t3fis202\archive\dr" в пункте назначения.

Нужна помощь и предложения относительно того, возможно ли это, и если это так, то как я могу это сделать. До сих пор я пробовал и тестировал множество других коммутаторов, таких как /xo, /xx, но ни одна из них не решила мою цель. Кроме того, /xx будет работать, за исключением того, что теперь он вообще не удалит папки в пункте назначения и не будет зеркалировать.

Надеюсь, я не слишком запутал всех здесь. Дайте мне знать, если у вас есть вопросы.

4b9b3361

Ответ 1

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

например. это работает

robocopy c:\test\a c:\test\b /MIR /XD c:\test\a\leavethisdiralone\

Ответ 2

Вместо того, чтобы создавать пустые каталоги в источнике для исключения, вы можете указать полный путь назначения к переключателю /XD, чтобы нет директорий назначения

robocopy "%SOURCE_PATH%" "%DEST_PATH%" /MIR /XD "%DEST_PATH%"\hq04s2dba301

Ответ 3

Как вы можете исключить целевой каталог при использовании /mir, убедитесь, что целевой каталог также существует в источнике. Я вошел в свой исходный диск и создал пустые каталоги с тем же именем, что и в пункте назначения, а затем добавил это имя каталога в /xd. Он успешно отразил все, исключая каталог источника, тем самым оставив каталог в месте назначения в такт.

Ответ 4

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

robocopy \\source\folder C:\destinationfolder /XD * /MIR

... и это работает для меня (копия Windows 10 из Windows Server 2016)

Ответ 5

Проблема в том, что даже если мы добавим папку в список пропуска, она будет удалена, если она не существует.

Решение состоит в том, чтобы добавить папку назначения и исходную папку с полным путем.

Я попытаюсь объяснить различные сценарии и то, что происходит ниже, основываясь на моем опыте.

Начальная структура папок:

d:\Temp\source\1.txt
d:\Temp\source\2\2.txt

Команда:

robocopy D:\Temp\source D:\Temp\dest /MIR

Это скопирует все отсутствующие файлы и папки и удалит все файлы и папки, которые невозможно найти в источнике.

Давайте добавим новую папку, а затем добавим ее в команду, чтобы пропустить ее.

Новая структура:

d:\Temp\source\1.txt
d:\Temp\source\2\2.txt
d:\Temp\source\3\3.txt

Команда:

robocopy D:\Temp\source D:\Temp\dest /MIR /XD "D:\Temp\source\3"        

Если я добавлю /XD с исходной папкой и выполню команду, то все будет хорошо, если команда ее не скопирует.

Теперь добавьте папку к месту назначения, чтобы получить эту настройку:

d:\Temp\source\1.txt
d:\Temp\source\2\2.txt
d:\Temp\source\3\3.txt

d:\Temp\dest\1.txt
d:\Temp\dest\2\2.txt
d:\Temp\dest\3\4.txt

Если я запускаю команду, все в порядке, 4.txt остается там 3.txt не копируется. Все хорошо.

Но если я удаляю исходную папку "d:\Temp\source\3", то целевая папка удаляется, даже если она находится в списке пропусков.

                       1    D:\Temp\source\
    *EXTRA Dir        -1    D:\Temp\dest\3\
      *EXTRA File                  4        4.txt
                       1    D:\Temp\source\2\

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

robocopy D:\Temp\source D:\Temp\dest /MIR /XD "D:\Temp\dest\3"

С другой стороны, если папка существует и есть файлы, она скопирует их и удалит их: 1 D:\Temp\source\3\* ДОПОЛНИТЕЛЬНО Файл 4 4.txt 100% Новый файл 4 3.txt

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

robocopy D:\Temp\source D:\Temp\dest /MIR /XD "d:\Temp\source\3" "D:\Temp\dest\3"

После этого не имеет значения, отсутствует ли исходная папка или отсутствует папка назначения, robocopy оставит все как есть.

Ответ 6

В файле справки robocopy параметр /MIR объясняется следующим образом.

/MIR:: MIRror дерево каталогов (эквивалентно/E plus/PURGE).

Вот объяснение для переключателей /E и/PURGE:

/E:: копировать подкаталоги, включая пустые.

/PURGE:: удалить файлы dest/dirs, которые больше не существуют в источнике.

Вы можете избежать удаления этих подкаталогов путем замены в "/E" для "/MIR" в вашей команде robocopy. Однако это решение полностью отключает очистку, что, похоже, не является вашим желаемым результатом. В этом случае вам нужно перейти вперед с опцией /XD.

Для справки вы можете нажать файл справки в текстовый документ.

Robocopy /? > RobocopySwitches.txt