1 (изменено: grisha.puding, 2024-06-05 16:48:31)

Тема: 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 взят по причине присутствия длинных имен и каталогов.