Найти в Дзене
Let's manage #BIM

АВТОМАТИЧЕСКОЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ ПРОЕКТОВ

Оглавление

С ПОМОЩЬЮ BAT-ФАЙЛА "ANTIOLEN V3.0" by ZAUR DAUROV

ПРЕДИСЛОВИЕ

Данная статья придумана и написана Зауром Дауровым - Руководитель BIM-отдела проектного бюро «РЕМАРК» (ГК "Лидер Групп"). Отдельная страничка жителя планеты информационного менеджмента туть:

Blank page

Да, да..у меня появился сайт, чтобы четче выделить идею моего блога и показать уникальность каждого жителя. Всех обнимаю и приглашаю прочитать очень полезный материал для каждого BIM-менеджера.

ВВЕДЕНИЕ

Сегодня у нас крайне актуальная для всех BIM-отделов на свете тема – методы защиты от "очумелых" ручек проектировщиков, которые любят устраивать спонтанную аннигиляцию проектных BIM-моделей и создавать прочую гору проблем.

Знакомо? Делись самыми ужасными историями в комментариях

В какой-то момент помощь моего отдела проектировщикам в создании личных резервок превратилась в довольно неприятное требование делать это постоянно, еще и отвечать за их сохранность и своевременность, хотя в прямую зону ответственности BIM-отдела это не входит. Сразу стоит сказать, что система резервок, образующаяся при совместной работе в Revit – штука крайне нестабильная, как показала практика, иногда бэкап достать можно, иногда нет, доверять этой штуке я не хотел.

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

Делитесь опытом, доверяете ли вы Проектировщикам? Или также, как Заур, не отпускаете в свободное плавание и заботитесь о сохранении их работы больше, чем они сами?)

ОСНОВНАЯ ИДЕЯ

Далее будет подробно расписан весь функционал скрипта. Основная идея скрипта заключается в автоматизации процесса резервного копирования Revit-файлов, обеспечивая копирование только измененных файлов для экономии времени и места, а также управление количеством копий, с автоматическим удалением старых версий. Это позволяет пользователям эффективно поддерживать актуальные резервные копии и контролировать дисковое пространство сервера, не перегружая систему избыточными данными.

-2

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

Ссылка для скачивания

Контакт Автора

ОБЗОР ФУНКЦИОНАЛА

Первым шагом в скрипте идет инициализация среды и вывод приветственной информации. С помощью команды @echo отображается название компании, имя проекта, а также сообщение о том, что процесс резервного копирования запущен. Эта небольшая деталь добавляет приятный пользовательский интерфейс, делая скрипт более информативным и профессиональным:

@echo off
color 0d
@echo BIM-отдел ООО "РЕМАРК"
@echo.
@echoПРОЕКТ – ...
@echoПроцесс создания резервных копий...
@echo.
setlocal EnableExtensions EnableDelayedExpansion

Далее начинается настройка переменных, которые играют ключевую роль на всех этапах выполнения скрипта:

searchDirпуть к директории, где будет происходить поиск файлов ".rvt".

outputFileconfig файл, в который скрипт записывает пути ко всем найденным файлам ".rvt".

set "searchDir=Z:\Ремарк\Проекты\Проект1\05_РД_BIM"
set "outputFile=%~dp0AutoBackup_Config.txt"

Проверка на наличие директории, указанной в searchDir, предотвращает дальнейшие ошибки, если директория была случайно удалена или перемещена. Это очень важная проверка, особенно в корпоративной сети, где возможно множество внешних факторов, влияющих на доступность папок.

if not exist "%searchDir%"(
echo Указанная директория не существует: "%searchDir%"
pause
exit /b 1
)

Поиск и фильтрация файлов

Одной из ключевых функций скрипта является умный поиск файлов. Скрипт находит все файлы с расширением ".rvt" в указанной директории и всех ее поддиректориях, исключая те, что содержат в пути строку "02_SHARED". Это исключение позволяет игнорировать общие файлы в специальной зоне среды проекта, которая используется для обмена файлами, которые не требуют резервного копирования, тем самым уменьшая объем обрабатываемых данных и делая процесс более быстрым и точным.

(for /f "delims=" %%i in ('dir /b /s /a-d "%searchDir%\*.rvt" ^| sort') do (
echo %%i | find /i "02_SHARED" >nul
if errorlevel 1 echo %%i
)) > "%outputFile%"

Обработка файлов для копирования

-3

После того как все файлы найдены и записаны в "AutoBackup_Config.txt" (будет появляться рядом со скриптом), скрипт переходит к их обработке. Здесь начинается интересная часть — проверка изменений. Скрипт хранит даты и время изменения файлов, используя временный файл "AutoBackup_Timestamps.txt". Перед тем как копировать файл, скрипт сравнивает текущую дату изменения файла с предыдущей, если файл не был изменен с момента последнего бэкапа, копирование не производится. Это значительно экономит место на сервере и сокращает время выполнения скрипта.

rem получаем дату и время изменения текущего файла
set "filemod=%%~ta"
set "filepath=%%a"
rem читаем предыдущую дату и время изменения файла из временного файла
set "prevmod="
if exist "%timestampfile%" (
for /f "tokens=1,* delims==" %%b in ('type "%timestampfile%"') do (
if "%%b"=="%%a" set "prevmod=%%c"
)
)
rem проверяем, изменился ли файл с прошлого копирования
if not "!filemod!"=="!prevmod!"(
rem если файл изменился или копируется впервые, копируем его
copy "%%a" "%destination%\%%~na_BACKUP_%timestamp%%%~xa"
rem обновляем дату и время изменения файла в временном файле
(echo %%a==!filemod!) >> "%temp_timestampfile%"
set /a files_copied+=1
) else (
rem если файл не изменился, просто записываем его в временный файл
(echo %%a==!filemod!) >> "%temp_timestampfile%"
)

Управление копиями файлов

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

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

rem Если количество файлов больше 10, удаляем самые старые
if !file_count! gtr 10 (
set /a to_delete=file_count-10
for /l %%c in (1,1,!to_delete!) do (
del "%destination%\!file[%%c]!"
)
)

Все оставшиеся неописанные выше строки кода имеют пояснения, так что можно будет легко сориентироваться.

В конце успешной отработки скрипт выводит соответствующую информацию и закрывается:

@echo.
@echo Создание резервных копий завершено.
@echo.
exit

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

Пример работы скрипта:

-4

УВЕЛИЧИВАЕМ МАСШТАБЫ СКРИПТА

Одно из небольших ограничений (на данный момент) скрипта заключается в том, что он применим для создания бэкапов только для одного проекта и его структуры папок. Но это ограничение легко обходится копированием нужного количества скриптов под каждый проект, которые будут управляться через центральный bat-файл.

Основная идея заключается в автоматизации процесса через единый файл с проверкой успешности выполнения каждой операции. Скрипт запускает bat-файлы для копирования данных, отслеживает успех или неудачу выполнения, и в конце выводит сообщение, информируя пользователя о том, какие проекты были успешно скопированы, а какие — нет. Такой подход упрощает управление и позволяет избежать ручной проверки каждого проекта.

Основные функции центрального скрипта. Установка переменных

  • failedProjects — хранит названия проектов, для которых не удалось создать резервные копии.
  • successCount — счетчик успешно завершенных копий. Это помогает отслеживать общее количество удачных копирований.
  • Скрипт использует конструкцию setlocal enabledelayedexpansion, что позволяет корректно работать с переменными внутри циклов и условных операторов.

Запуск процессов резервного копирования

Скрипт запускает 4 заранее подготовленных bat-файла для бэкапов 4 проектов параллельно, через уже знакомую нам команду языка batch – start/wait (ссылка на предыдущую статью про bat-файлы).

Также тут присутствует команда timeout (https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/timeout), предназначенная для удерживания небольшой паузы между параллельными процессами копирования. Опытным путем определил, что с ней все-таки копирование происходит стабильнее и диски не тупят от перегруза записи. Тайминг естественно можно отрегулировать под себя, в данном случае указаны 2 секунды паузы.

Внутри центрального скрипта встроена стоковая проверка пути, которая выдаст вам уведомление, в случае отсутствия указанного адреса:

-5

Для каждого проекта проверяется код возврата errorlevel, который указывает на успех или неудачу выполнения. Если копирование прошло успешно, увеличивается счетчик успешных запусков, если нет — проект добавляется в список неудачных с именем проекта.

if %errorlevel% neq 0 (
if defined failedProjects (
set "failedProjects=!failedProjects!, Проект1"
) else (
set "failedProjects=Проект1"
)
) else (
set /a successCount+=1
)

Этот блок повторяется для каждого проекта, включая временные задержки для корректного завершения каждого этапа.

Проверка результатов и уведомление пользователя

После того, как все процессы завершены, скрипт проверяет, были ли ошибки. Если все проекты успешно скопированы, выводится уведомление:

if "!failedProjects!"==""(
msg* "Все резервные копии проектов успешно созданы."
) else(
msg* "Не созданы резервные копии проектов: !failedProjects!"
)

Это сообщение выводится через msg.exe, обеспечивая удобный способ уведомления пользователя.

-6

Управлять всеми бэкапами через такой центральный файл крайне удобно, запускаете Планировщик заданий в Windows и указываете только центральный скрипт и частоту его запуска, готово, дальше он справиться сам.

Пример запуска центрального скрипта:

-7

ПРЕИМУЩЕСТВА СКРИПТА

1. Автоматизация процесса: Скрипт полностью автоматизирует процесс резервного копирования, начиная с поиска файлов и заканчивая удалением старых версий. Это снимает с пользователя необходимость вручную отслеживать изменения файлов и упрощает управление резервными копиями.

2. Экономия времени и ресурсов за счет проверки изменений перед копированием. Скрипт копирует только измененные файлы, что экономит дисковое пространство и сокращает время выполнения операции.

3. Контроль версий: Возможность хранения любого количества версий каждого файла помогает сохранить важные данные.

4. Интуитивно понятный интерфейс: Приветственные сообщения, вывод текущего статуса, а также информация об ошибках и успешном завершении позволяют пользователю легко отслеживать процесс выполнения скрипта.

5. Универсальность: Скрипт можно легко адаптировать под другие проекты, директории, форматы файлов и т.д. просто изменив переменные.

6. Скорость копирования файлов: Скорость отработки любых операций через batch сильно превышает скорость любого софта, делающего тоже самое, одна из причин – простота программы. Для наглядности можете попробовать удалить 100 Гб данных или 100000 элементов через подобный скрипт или же через обычный "Delete", разница будет огромная.

-8

ЗАКЛЮЧЕНИЕ

Ссылка для скачивания

Контакт Автора

Заур реализовал автоматическое резервное копирование проектов и при этом не захламляя дисковое пространство сервера. Более того, выложил ссылку на скачивание, так что применяйте на своих проектах.

Слова автора на последок (но не последние):

Надеюсь, это кастомное решение упростит кому-нибудь жизнь, также как мне. В будущем планируется небольшой апгрейд, так что ждем версию v4.0)))

Как вам такой ход?

-9
-10