Robocopy / XD не будет работать с относительными путями

13

Я пытаюсь запустить /MOVEкоманду robocopy, но исключаю пару подкаталогов, указанных с /XDфлагом.

robocopy ".\CurrentDir" ".\NewDir" /XD ".\CurrentDir\SubDir1" ".\CurrentDir\SubDir2" /E /MOVE

К сожалению, он игнорирует эту /XDопцию и перемещает все. Если я использую абсолютный путь для всего, он работает нормально, но мне нужно, чтобы он был гибким. Есть ли способ заставить его работать с относительными путями?

user8783
источник
3
Следует отметить, что вы можете превратить относительные пути в абсолютные с меньшими усилиями, чем можно подумать, используя %CD%переменную окружения. Пример: robocopy ".\CurrentDir" ".\NewDir" /XD "%CD%\CurrentDir\SubDir1" "%CD%\CurrentDir\SubDir2" /E /MOVE
gbr
Ответ gbr должен быть правильным. (учитывая, что вам не нужно ".." в относительном пути)
Sake

Ответы:

14

Указанные папки /XDотносятся к папкам (исключая), которые существуют в исходной папке, поэтому вы указываете только те имена папок, которые хотите исключить, без указания родительского отношения.

то есть:

robocopy ".\CurrentDir" ".\NewDir" /XD "SubDir1" "SubDir2" /E /MOVE
Ƭᴇcʜιᴇ007
источник
6
К сожалению, это не работает для подкаталогов уровня 2 и выше, т.е. / XD "SubDir1 / SubDir11".
Искатель правды
@truthseeker - ты прав. Работает для папок 1-го уровня, но ничего ниже. Для этого вы должны использовать абсолютный исходный путь (т. Е. "/ Xd% ~ dp0CurrentDir \ Folder1 \ Subfolder1"), тогда он будет правильно игнорировать "Subfolder1", но синхронизировать "Folder1" и т. Д. Вы не можете использовать относительный путь, и Вы не можете использовать путь назначения.
rocketmonkeys
0

Следующее может помочь - оно решает проблему относительного пути напрямую - но допускает многие исключающие каталоги и подкаталоги.

Если вы просто исключаете папки верхнего уровня - просто используйте имя папки - пример APC. Однако, если вы делаете подпапку - вам нужен весь путь. Путь должен полностью соответствовать исходному пути + путь к подпапке. Я проверил это многими различными способами, и это единственный способ, которым я смог заставить его работать. Этот формат пакетного файла / cmd также позволяет использовать пробелы в пути или именах файлов.

setlocal
set Source_path="\\usatlvmpdroadm1\C$\Installs"
set Destination_path="C:\Robo"
set Log_Path_and_File="C:\RoboCopy_Log_Files\01-Installs C drive to Robo C drive.txt"
set ED1="APC"
set ED2="\\usatlvmpdroadm1\C$\Installs\Dell\Dell MD3420 Firmware"

robocopy.exe %Source_path% %Destination_path% /COPYALL /ZB /MIR /MT:128 /DCOPY:T /XA:SH /XD %ED1% /XD %ED2% /XJ /XJD /R:2 /W:1 /NDL /NP /TEE /LOG:%Log_Path_and_File%

endlocal
Большой Джон
источник