Назад | Перейти на главную страницу

Robocopy, не перезаписывать существующие файлы, а копировать измененные / новые

Можно ли отразить два каталога без перезаписи файлов в каталоге назначения новыми / измененными / удаленными файлами. Что-то вроде снимков.

Пример: скопируйте исходный каталог со всеми файлами и подкаталогами в целевой каталог, но если целевой каталог содержит, например, файл A.xls и A.xls был изменен в исходном каталоге, затем скопируйте A.xls но сохраните предыдущий A в целевом каталоге. Чтобы сохранить предыдущий файл, к имени файла можно добавить отметку даты или счетчик.

Пример после копии:
SomeDirectory
| --A.xls
| --A_20120701.xls
| --A_20120920.xls

Спасибо.

Нет, это невозможно с помощью Robocopy. Зеркальное отображение пути к папке с помощью Robocopy удалит файлы в месте назначения, если они больше не существуют в источнике. Вы можете гарантировать, что вы не перезаписываете файлы более старыми версиями, но вы не можете сохранить старые версии / переименовать во время процесса копирования.

Я написал командный сценарий / пакетный файл, который копирует измененные файлы, но создает древовидную структуру на основе даты запуска сценария.

например мое дерево для одного конкретного файла было бы.

c:\_archive\201209\
                    23\
                        0930
                             Todays notes.txt
                        1145
                             Todays notes.txt
                    24\
                        1000
                             Todays notes.txt

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

По многочисленным просьбам ниже представлен мой базовый сценарий резервного копирования.

@echo off
cls
rem parse the output of the date /t command to create a date in the format yyyymmdd, and also remove the delimiter (/)
rem  store the results in environment variables
for /F "tokens=1,2,3,4 delims=/ " %%i IN ('date /t') do SET Z_DATE=%%k%%j%%i 
for /F "tokens=1,2,3,4 delims=/ " %%i IN ('date /t') do SET Z_YEAR=%%k
for /F "tokens=1,2,3,4 delims=/ " %%i IN ('date /t') do SET Z_MONTH=%%j
for /F "tokens=1,2,3,4 delims=/ " %%i IN ('date /t') do SET Z_DAY=%%i

echo date %Z_DATE%
echo year %Z_YEAR%
echo month %Z_MONTH%
echo day %Z_DAY%

rem parse the output of the time /t command to remove the delimeter (:)
rem  store the result in an environment variable
for /f "tokens=1,2 delims=:. " %%i IN ('time /t') do SET Z_TIME=%%i%%j

echo time %Z_TIME%
rem change the colour to a nice deep green on black.
color 02
::-------------------------

@echo on
xcopy "c:\MyFiles\*.*" "C:\MyArchive\ByDate\%Z_YEAR%%Z_MONTH%\%Z_DAY%\%Z_TIME%%~p1%~n1\" /ksymhr
@if @@ERRORLEVEL==1 SET Z_BACKUP_ERROR_FLAG=1

Goto End

::---------------------------------------------------------------------------
:NotifyUser
echo.
echo An error occurred during the backup.
echo.
pause

::---------------------------------------------------------------------------
:End

echo %Z_DATE%
echo %Z_TIME%
time /t

rem Clear out the environment variables
SET Z_DATE=
SET Z_TIME=
SET Z_BACKUP_ERROR_FLAG=

Если у вас есть какие-либо вопросы по этому сценарию (я быстро скопировал его из моего основного сценария резервного копирования и не тестировал его полностью), напишите мне на мою учетную запись gmail с темой «Запрос сценария резервного копирования при сбое сервера». Если вы можете определить мой адрес Gmail, не спрашивая, я буду рад вам помочь.

Строки для анализа даты, года, месяца и дня у меня не работали. Однако это было так, и остальная часть скрипта работает отлично:

Set Z_Date=%date:~10,4%%date:~4,2%%date:~7,2%
Set Z_Year=%date:~10,4%
Set Z_Month=%date:~4,2%
Set Z_Day=%date:~7,2%