10

Robocopy не копирует корневую папку и ее метку времени - она копирует все подкаталоги и файлы (когда установлены соответствующие параметры), и, похоже, нет параметра / аргумента, который бы сообщал Robocopy, что вам нужна сама корневая папка и ее метка времени или атрибуты дословно копировать.

Так скажи, я хочу, я хочу скопировать C:/ Кисти

Robocopy скопирует все свои подкаталоги и файлы в место назначения, но не в саму папку «Кисти» со всеми связанными атрибутами и отметкой времени.

Вы понимаете, о чем я спрашиваю? Это довольно просто, и у Robocopy, кажется, нет возможности для этого. Люди уже задавали этот вопрос на разных форумах, но, насколько мне известно, никто не ответил на этот вопрос.

10 ответов10

8
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30 

Перетащите папку на bat или используйте в Отправить. Это создаст папку с именем и отметкой времени исходного каталога и скопирует все файлы.

3

Я согласен с ФП, невозможность скопировать корневую папку - большой недостаток робокопии. Как насчет обмана и перемещения папки с кистями во временную папку, выполнения операции robocopy для временной папки, а затем ее перемещения назад?

Что-то вроде:

md "c:\verytemporary" && move "c:\brushes" "C:\verytemporary"||( echo Line 1 error occurred & goto :eof )
robocopy c:\verytemporary d:\ /MIR /DCOPY:T
move "c:\verytemporary\brushes" "c:\" && rd /q "c:\verytemporary"||echo Line 3 error occurred
2

Как я не вижу хорошего и простого решения ни в одном из ответов:

Если нет решения для robocopy, вы можете взглянуть на xxcopy (есть бесплатные и коммерческие версии).

Конечно, есть много других альтернатив робокопии, некоторые из них перечислены здесь.
Смотрите также Best Free File Copy Utility.

2

Попробуйте выполнить команду md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes из командной строки, указав правильные пути.

1

user105198 ответ на полпути,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes действительно просто создаст новую папку. Вам нужно будет добавить к нему /MIR и /DCOPY:T

С параметром /mir , если каталог назначения существует, параметры безопасности каталога назначения перезаписываются. Technet

/DCOPY:T :: COPY Directory Timestamps.

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

так:

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes /MIR /DCOPY:T
1

Я думаю, вы обнаружите, что Robocopy делает именно то, что вы хотите, при условии, что вы скажете ему копировать метки времени папки (/DCOPY:T). Из моих экспериментов я обнаружил, что следующее (на первый взгляд недокументированное) поведение является верным для Robocopy:

Все указанные свойства исходного каталога применяются к целевому каталогу, независимо от того, существует ли целевой каталог, не существует или имеет имя, отличное от исходного каталога.

Указанные свойства могут включать (как минимум) информацию о безопасности (/SEC) или метки времени папки (/DCOPY:T).

Поэтому в следующем примере папке c:\destination\ будет назначено то же время, что и для c:\ source\ folder.

robocopy c:\source\folder C:\destination\folder /E /DCOPY:T

Я проверил это с версиями Robocopy, включенными в Windows 7, Windows 8 и Windows 2003 Resource Kit (только параметр /SEC). Обратите внимание, что только более новые версии Robocopy (XP026 и выше) поддерживают параметр /DCOPY:T.

0

Теоретически, использование /DCOPY:T должно решить все ваши проблемы.

Но я видел, как это произошло, и я не уверен, что назвал бы это "ошибкой", а скорее следствием последовательности операций (ОК, ошибка).

Эта команда должна работать для копирования всех файлов из C:\Brushes в D:\NEWBrushes , и /DCOPY:T должен вызывать копирование временных меток исходной папки в целевую папку:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

Что я видел (по крайней мере, в некоторых версиях Robocopy), так это то, что команда выполнена успешно, но метка времени папки D:\NEWBrushes установлена на текущую дату и время.

Таким образом, похоже, что /DCOPY:T не работает для "базовой" (самой верхней) папки, которую вы копируете.

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

То, что я считаю, происходит с этой командой:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

это что-то вроде этого:

  1. Создать папку D:\NEWBrushes если она еще не существует
  2. Скопируйте метку времени из C:\Brushes в D:\NEWBrushes
  3. Скопируйте файлы и подпапки из C:\Brushes в D:\NEWBrushes

Похоже, что на шаге 3 изменение содержимого папки D:\NEWBrushes вызывает изменение временной метки D:\NEWBrushes .

Для меня "обходной путь" заключался в том, чтобы запустить команду robocopy для копирования файлов и папок, а затем запустить (ту же) команду robocopy во второй раз.

Итак, при первом запуске:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

все файлы и папки будут скопированы. Затем запустите его снова:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T
  (or)
robocopy "C:\Brushes" "D:\NEWBrushes" /DCOPY:T

Во второй раз, когда запускается robocopy , никакие файлы или папки в D:\NEWBrushes не будут изменены, а параметр /DCOPY:T скажет robocopy скопировать метку времени из C:\Brushes в D:\NEWBrushes (если только нет папок / файлов). в C:\Brushes , которые изменились с первого запуска robocopy).

0

Если вы объедините /IF :: Include the following Files. с /E :: copy subdirectories, including Empty ones. Вы получаете (близко к) желаемый эффект:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
0

Robocopy на самом деле не предназначен, чтобы сделать это легко. Однако есть способ.

Корневая папка содержит, скажем, 50 файлов и 40 папок. Вы хотите только папку X (но вы также хотите, чтобы это было время и дата).

ROBOCOPY c:\ d:\ /XF 50 root file names c:\boot.ini c:\bla.txt etc. /XD c:\windows c:\drivers c:\temp etc. /S /E /SEC /DCOPY:T

Параметр /DCOPY:T указывает сохранить метки времени папки. /XF указывает, какие файлы НЕ копировать, /XD указывает, какие папки НЕ копировать. Просто не указывайте папку c:\X.

Основным недостатком этого является исследование всех папок и имен файлов в корне и, в частности, их именование здесь. Если вы делаете это много на разных системах, сценарий может быть написан.

Рабочий пример

robocopy c:\testing c:\abc /XF c:\testing\Testing.txt /XD "C:\testing\ Новая папка (2)" "C:\testing\ Новая папка (3)" /S /E /SEC /DCOPY:T

Корневой рабочий пример

robocopy c:\ d:\ /XF c:\ Testing.txt /XD "C:\ Новая папка (2)" "C:\ Новая папка (3)" /S /E /SEC /DCOPY:T

Мой тест сработал, я создал несколько папок и подпапок, в этом случае c:\testing был root, c:\abc был root другого диска (очевидно, это не так, но для этого это должно иметь смысл). Папка, которую я хотел получить от корня, называлась "Новая папка", как вы можете видеть, я не указал ее в /XD. Также убедитесь, что вы указали c:\ или имена, которые вы используете, будут глобальными. Другими словами, если я не укажу c:\testing в файле Testing.txt, он пропустит его из ВСЕХ копируемых подпапок. /SEC скопирует все метки безопасности файла и время.

-1

Я сейчас решал корневые папки для одного очень быстрого и легкого сценария резервного копирования с robocopy, есть пример. Должен помочь кому-либо:

$Destination="F:\Backup" #change destionation backup drive and foder
$BackupDirs="d:\folder1", "d:\folder2", "d:\folder3\subfolder", "d:\fodler4\subfolder\subsubfodler" #change source folders

#make a loop for every source folder
foreach ($Backup in $BackupDirs) {

#split folder name
$fdname = Split-Path $Backup -leaf

#define folder to create in destionation
$dirtocreate = Join-Path $Destination $fdname

#make directory, yes, some extra script to skip when exist should be in place, but -erroraction solved this in lazy mode :)
md $dirtocreate -ErrorAction SilentlyContinue 

#copy with subfolders and log
robocopy $backup $dirtocreate  /s /nfl /ndl /log:c:\scripts\backup.log

}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .