Ответ 1
Когда я попробовал решение с /XD, я обнаружил, что путь к исключению должен быть исходным путем, а не пунктом назначения.
например. это работает
robocopy c:\test\a c:\test\b /MIR /XD c:\test\a\leavethisdiralone\
Существует бег 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
будет работать, за исключением того, что теперь он вообще не удалит папки в пункте назначения и не будет зеркалировать.
Надеюсь, я не слишком запутал всех здесь. Дайте мне знать, если у вас есть вопросы.
Когда я попробовал решение с /XD, я обнаружил, что путь к исключению должен быть исходным путем, а не пунктом назначения.
например. это работает
robocopy c:\test\a c:\test\b /MIR /XD c:\test\a\leavethisdiralone\
Вместо того, чтобы создавать пустые каталоги в источнике для исключения, вы можете указать полный путь назначения к переключателю /XD, чтобы нет директорий назначения
robocopy "%SOURCE_PATH%" "%DEST_PATH%" /MIR /XD "%DEST_PATH%"\hq04s2dba301
Как вы можете исключить целевой каталог при использовании /mir, убедитесь, что целевой каталог также существует в источнике. Я вошел в свой исходный диск и создал пустые каталоги с тем же именем, что и в пункте назначения, а затем добавил это имя каталога в /xd. Он успешно отразил все, исключая каталог источника, тем самым оставив каталог в месте назначения в такт.
Порядок аргументов, кажется, имеет значение... чтобы исключить подкаталоги, я использовал
robocopy \\source\folder C:\destinationfolder /XD * /MIR
... и это работает для меня (копия Windows 10 из Windows Server 2016)
Проблема в том, что даже если мы добавим папку в список пропуска, она будет удалена, если она не существует.
Решение состоит в том, чтобы добавить папку назначения и исходную папку с полным путем.
Я попытаюсь объяснить различные сценарии и то, что происходит ниже, основываясь на моем опыте.
Начальная структура папок:
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 оставит все как есть.
В файле справки robocopy параметр /MIR объясняется следующим образом.
/MIR:: MIRror дерево каталогов (эквивалентно/E plus/PURGE).
Вот объяснение для переключателей /E и/PURGE:
/E:: копировать подкаталоги, включая пустые.
/PURGE:: удалить файлы dest/dirs, которые больше не существуют в источнике.
Вы можете избежать удаления этих подкаталогов путем замены в "/E" для "/MIR" в вашей команде robocopy. Однако это решение полностью отключает очистку, что, похоже, не является вашим желаемым результатом. В этом случае вам нужно перейти вперед с опцией /XD.
Для справки вы можете нажать файл справки в текстовый документ.
Robocopy /? > RobocopySwitches.txt