Тема: CMD/BAT: Резервное копирование с версионностью.
Доброго времени суток всем обитателям столь полезного ресурса, столкнулся с не простым вопросом (для меня, по крайней мере)
Суть такова:
Есть каталог на диске 1, есть каталог зеркала на диске 2, создаваемого с помощью BAT по средствам robocopy.
Хочу чтобы был дополнительный BAT который смотрит на каталог диска 1 сравнивая его с зеркалом каталога второго диска но поученный результат копировал в третий каталог своего рода версионность.
Суть идеи такова: с понедельника по пятницу работает пять BAT файлов для каждого дня недели, копирующих только те файлы которые были добавлены или изменены, в субботу же запускается основной BAT который очищает каталоги версий и делает новое зеркало.
Прежде чем создать топик я воспользовался поиском с запросом «robocopy» и «резервное копирование» просмотрев найденное нашел бизкое по теме, но не то что нужно.
На текущий момент мысли крутятся вокруг следующего кода:
@echo on
chcp 1251
setlocal enabledelayedexpansion
rem Параметры
set "sourceDir=A:\$SUR"
set "targetDir=A:\$TARGT"
set "backupDir=A:\$CEL"
set "logFile=A:\$log\robocopy.log"
rem Очистка лог-файла перед началом
echo. > "%logFile%"
rem Запуск robocopy для сравнения каталогов и записи изменений в лог-файл
robocopy "%sourceDir%" "%targetDir%" /E /L /FP /NJH /NJS /NDL /NS /NC /XO /XX /LOG:"%logFile%"
rem Показать содержимое лог-файла для проверки
echo Содержимое лог-файла:
type "%logFile%"
rem Чтение лога и копирование измененных файлов
for /f "tokens=*" %%i in ('type "%logFile%"') do (
set "line=%%i"
rem Удаление начальных пробелов
set "filePath=!line:~14!"
rem Проверка, что строка не пустая
if not "!filePath!" == "" (
echo Обработка файла: !filePath!
rem Получение полного пути файла относительно исходного каталога
set "relativeFilePath=!filePath:%sourceDir%\=!"
rem Полный путь к файлу в целевом каталоге
set "backupFile=%backupDir%\!relativeFilePath!"
rem Директория файла в целевом каталоге
set "backupFileDir=!backupFile!"
for %%k in ("!backupFileDir!") do set "backupFileDir=%%~dpk"
if not exist "!backupFileDir!" (
echo Создание каталога: "!backupFileDir!"
mkdir "!backupFileDir!"
)
echo Копирование файла: "%sourceDir%\!relativeFilePath!" в "!backupFileDir!"
robocopy "%sourceDir%" "!backupFileDir!" "!relativeFilePath!" /COPYALL /R:0 /W:0
echo Команда robocopy завершена с кодом ошибки: %ERRORLEVEL%
)
)
echo Копирование измененных файлов завершено.
endlocal
pause
Но к сожалению не могу понять почему он не работает.
Лог файл создается измененные файлы туда заносятся но копирования не происходит, возможно у кого-то есть более здравая мысль как это реализовать корректнее и надежнее…
Также необходимо учитывать что robocopy взят по причине присутствия длинных имен и каталогов.