Robocopy не копирует корневую папку и ее отметку времени

10

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

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

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

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

введите описание изображения здесь

ptrcao
источник
1
Это флаер, основанный на моем опыте с rsync, но что если у вас нет косой черты в конце вашей целевой папки? Как насчет попытки изменить скрипт на уровне командной строки вместо использования графического интерфейса? Я точно знаю, что инструмент командной строки будет делать то, что вам нужно.
@Randolph West: в настоящее время у меня нет косой черты в конце целевой папки. Я все еще не могу заставить Robocopy включить исходную папку, ее атрибуты и т. Д. В настоящее задание на копирование. Любые идеи?
ptrcao
Если нет решения для robocopy, вы можете взглянуть на xxcopy (есть бесплатные и коммерческие версии).
harrymc
Да, я полностью понимаю и добавил рабочее решение ниже. Реальная проблема заключается в том, что вы должны указать все файлы и папки в корне, чтобы НЕ копировать.
Опсин

Ответы:

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

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

Terence
источник
Большое спасибо, искал этого волшебного оператора% ~ n1
hotzen
@hotzen, что делает %~n1?
Pacerier
1
Они перечислены здесь: microsoft.com/resources/documentation/windows/xp/all/proddocs/…
hotzen
Msgstr "Расширяет% 1 до имени файла."
hotzen
Microsoft разорвала все их ссылки, здесь есть документация по процентам для пакета, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf
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
Jimadine
источник
2

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

ctype.h
источник
3
Да, но вы создаете новую папку, в которой не будет атрибутов исходной папки C: \ brushes ...?
ptrcao
2

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

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

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

harrymc
источник
1
xxcopyЭто отличная утилита, но в бесплатной версии есть подсказка, на которую вы должны ответить, если используете какой-либо из большого списка параметров командной строки. Использование xxcopyиз командной строки, это дополнительное приглашение раздражает. Но это xxcopyвообще предотвращает (усложняет) использование командного файла.
Кевин Феган
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.

btriffles
источник
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*"
ta.speot.is
источник
1
Что вы имеете в виду "близко к"? На какое ограничение вы намекаете?
2012 года
Опасность Уилл Робинсон !!! Похоже, ваше предложение копирует каждую папку в текущей папке, а не ограничивает ее папками, начинающимися с «Кисти»
GlennFromIowa
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 скопирует все метки безопасности и времени файла.

опсина
источник
Хммм, я полагаю, вы можете использовать / XF c: *. * Для исключения всех корневых файлов. Я проверю это, когда буду перед машиной, а не на телефоне.
Опсин
Нет, c: *. * Недопустим, вам придется вручную перечислить все файлы.
opsin
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).

Кевин Феган
источник
-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

}
Milhauzz
источник
Так что используйте этот PowerScript, и проблема решена, верно?
Сок Pimp IT