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

Мне нужен скрипт для копирования только измененных/модифицированных и новых файлов из моего C:\Dropbox в мой C:\backup. Почему это копирует только структуру папок:

@echo off

set destination=C:\Backup
set source=C:\Users\XXXX\Dropbox\Intranet

for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd1=%%j"."%%i"."%%k

xcopy %source%"\*" %destination%"\*" /m/e/y
mkdir %destination%"\LastBackupDate %yyyymmdd1%"
echo A folder containing the latest date has been created in root directory of %source%.
echo Finished copying %source% to %destination%
echo.
pause

person ilansch    schedule 01.07.2012    source источник
comment
Для тех, кто хочет бесплатный инструмент, есть rubocopy для windows/*nix и хороший инструмент с графическим интерфейсом под названием SyncToy (часть Power Toys)   -  person ilansch    schedule 12.08.2013


Ответы (2)


Это общий сценарий резервного копирования.

@echo off
REM get start time
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

REM set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
set "logtimestamp=%YYYY%.%MM%.%DD% %HH%:%Min%:%Sec%"

REM actual copy
set source=%1
set destination=%2

REM create the exclusion list
set exclusion=%3
set exclusion=%exclusion:"=%
(for %%i in (%exclusion%) do echo %%i) > exclusion.txt

REM set the file name for the logging data
set log=log-%fullstamp%.txt

REM start the backup process
echo // started backup at %logtimestamp% > %log%
echo // from %~f1 to %~f2\ >> %log%

echo ---- >> %log%
xcopy %source% %destination% /S /E /C /D /H /R /Y /V /I /EXCLUDE:exclusion.txt >> %log%
echo ---- >> %log%
del /f exclusion.txt

REM get finish time
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "logtimestamp=%YYYY%.%MM%.%DD% %HH%:%Min%:%Sec%"

echo // finished backup at %logtimestamp% >> %log%

REM move the logging
if not exist "%destination%\.backup_log" mkdir %destination%\.backup_log
move %log% %destination%\.backup_log

Как я бы это назвал, предполагая, что пакетный скрипт называется backup.bat:

backup.bat MyFolder h:\MyFolder .metadata

Где содержимое MyFolder копируется в h:\MyFolder, а все папки с именем «.metadata» игнорируются. Папка MyFolder на диске h:\ создается, если она еще не доступна.

Особенности этого скрипта:

  • Создает все необходимые папки
  • Копирует все файлы, если они были изменены с момента последнего резервного копирования.
  • Создает папку для ведения журнала в папке данных назначения с именем: .backup_log
  • Создает лог-файл, содержащий всю информацию во время работы xcopy и отметку времени запуска и остановки.

Обновление: если у вас нет списка исключений, поставьте «» в качестве третьего параметра.

person Alessandro Giusa    schedule 01.07.2017
comment
И как восстановить из резервной копии? - person Mark Deven; 20.06.2018
comment
Ты прав. просто замените rm на del. rm из cygwin. - person Alessandro Giusa; 21.06.2018
comment
Я бы рекомендовал del /f /q, чтобы не было вывода. - person Mark Deven; 21.06.2018

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

Это было связано с параметрами xcopy, вы указали только эти /m/e/y:

/M = Копирует только файлы с установленным атрибутом архива, отключает атрибут архива.

/E = Копирует каталоги и подкаталоги, включая пустые.

/Y = Подавить подтверждения.

Обратите внимание, что, как и в ответе, данном ранее, просто добавив /D и удалив /M, это поможет, пожалуйста, проверьте, что говорится в справке о /D:

/D:m-d-y Копирует файлы, измененные в указанную дату или позже. Если дата не указана, копируются только те файлы, исходное время которых новее, чем время назначения.

Если вам нужно создать резервную копию нескольких папок за один запуск и иметь файл журнала с их выполнением, вы можете сделать что-то вроде этого:

@echo off

call:backUpFolder "C:\Users\XXX\folder1" "C:\Backup\folder1"
call:backUpFolder "C:\Users\XXX\folder2" "C:\Backup\folder2"
call:backUpFolder "C:\Users\XXX\folder3" "C:\Backup\folder3"

goto:eof
::--------------------------------------------------
::-- This is the function to back up one folder
::--------------------------------------------------
:backUpFolder
set source="%~1"
set destination="%~2"
echo copying from %source% to %destination%

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%

xcopy %source%"\*" %destination%"\*" /s/d/y/c/v/r

echo %ldt%: %source% to %destination% >> backHistory.log
echo Finished copying %source% to %destination%
goto:eof
person Marco Vargas    schedule 23.12.2016