Робокопія не копіює кореневу папку та її часову позначку


10

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

Тому скажіть, я хочу, щоб я скопіював C: / Brush

Робокопія скопіює всі підкаталоги та файли до місця призначення, але не папку Brushes, з усіма пов'язаними атрибутами та часовою маркою.

Ви розумієте, про що я прошу? Це досить просто, і Robocopy, здається, не має можливості для цього. Люди ставили це питання раніше на різних форумах, але, що стосується мене, ніхто не відповів на це питання.

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


1
Це листівка, заснована на моєму досвіді роботи rsync, але що робити, якщо у вас немає кінцевої косої риски в кінці вашої цільової папки? Як щодо спроби змінити скрипт на рівні командного рядка, а не використовувати графічний інтерфейс? Я знаю фактично, що інструмент командного рядка зробить все, що вам потрібно.

@Randolph West: на даний момент у мене немає кінцевої косої риски в кінці цільової папки. Я все ще не можу змусити Robocopy включати папку-джерело та його атрибути тощо у власне завдання копіювання. Будь-які ідеї?
ptrcao

Якщо рішення для роботокопії немає, ви можете подивитися на xxcopy (є безкоштовна та комерційна версії).
harrymc

Так, я повністю розумію і додав робоче рішення нижче. Справжня проблема полягає в тому, що вам потрібно вказати всі файли та папки в корені НЕ копіювати.
опсин

Відповіді:


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

Видаліть папку на batабо використовуйте в Надіслати на . Він створить папку з ім'ям та часовою маркою вихідного каталогу та скопіює всі файли.


велике дякую, шукав цього магічного оператора% ~ n1
hotzen

@hotzen, що робить %~n1?
Pacerier

1
Вони перераховані тут: microsoft.com/resources/documentation/windows/xp/all/proddocs/…
hotzen

"Розширює% 1 на ім'я файлу."
hotzen

Microsoft зламала всі свої посилання, тут є документація про відсотковий
тильд

3

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

Щось на зразок:

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

Спробуйте md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesз командного рядка, замінивши правильні шляхи.


3
Так, але ви створюєте нову папку, яка не буде мати атрибутів оригінальної папки C: \ brushes ...?
ptrcao

2

Як я не бачу хорошого і простого рішення в жодній з відповідей:

Якщо рішення для роботокопії немає, ви можете подивитися на xxcopy (є безкоштовна та комерційна версії).

Звичайно, існує багато інших альтернатив роботокопію, деякі з них перераховані тут .
Див. Також Найкраща утиліта безкоштовного копіювання файлів .


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). З моїх експериментів я виявив таку (здавалося б, недокументовану) поведінку, що відповідає правді для роботокопії:

Усі вказані властивості вихідного каталогу застосовуються до каталогу призначення, незалежно від того, існує цільовий каталог, не існує чи має інше ім'я від вихідного каталогу.

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

Тому в наступному прикладі папці c: \ призначення \ буде призначено ті ж часові позначки, що і папці c: \ source \.

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

Я перевірив це за допомогою версій Robocopy, що входять до складу Windows 7, Windows 8 та набору ресурсів Windows 2003 (лише для параметра SEC). Зауважте, що лише новіші версії Robocopy (XP026 і вище) підтримують параметр / DCOPY: T.


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*"

1
Що ви маєте на увазі "близько"? Яке обмеження ви маєте на увазі?
ptrcao

Небезпека буде Робінзоном !!! Здається, ваша пропозиція скопіювати кожну папку в поточну папку, а не обмежувати її папками, що починаються з "
пензлів

0

Робокопія насправді не призначена для цього легко. Однак спосіб є.

Коренева папка містить, скажімо, 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.

Основним недоліком цього є дослідження всіх папок та імен файлів у корені та конкретно виклик їх усіх тут. Якщо ви робите це багато в різних системах, може бути написаний сценарій.

Робочий приклад

robobopy c: \ testing c: \ abc / XF c: \ testing \ Testing.txt / XD "C: \ testing \ New Folder (2)" "C: \ testing \ New Folder (3)" / S / E / SEC / DCOPY: T

Кореневий робочий приклад

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

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


Гммм, я вважаю, ви можете використовувати / XF c: *. * Для виключення всіх кореневих файлів. Я тестую це, коли я буду перед машиною, а не по телефону.
опсин

Nope, c: *. * Недійсний, вам доведеться вручну перелічити всі файли.
опсин

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

Зараз я вирішував кореневі папки для одного дійсно швидкого та простого резервного сценарію резервного копіювання за допомогою роботокопії, є приклад. Допоможіть комусь:

$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

}

Тож використовуйте цей PowerScript і проблема вирішена, правда?
Pimp Juice IT IT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.