С ПОМОЩЬЮ BAT-ФАЙЛА "ANTIOLEN V3.0" by ZAUR DAUROV
ПРЕДИСЛОВИЕ
Данная статья придумана и написана Зауром Дауровым - Руководитель BIM-отдела проектного бюро «РЕМАРК» (ГК "Лидер Групп"). Отдельная страничка жителя планеты информационного менеджмента туть:
Да, да..у меня появился сайт, чтобы четче выделить идею моего блога и показать уникальность каждого жителя. Всех обнимаю и приглашаю прочитать очень полезный материал для каждого BIM-менеджера.
ВВЕДЕНИЕ
Сегодня у нас крайне актуальная для всех BIM-отделов на свете тема – методы защиты от "очумелых" ручек проектировщиков, которые любят устраивать спонтанную аннигиляцию проектных BIM-моделей и создавать прочую гору проблем.
Знакомо? Делись самыми ужасными историями в комментариях
В какой-то момент помощь моего отдела проектировщикам в создании личных резервок превратилась в довольно неприятное требование делать это постоянно, еще и отвечать за их сохранность и своевременность, хотя в прямую зону ответственности BIM-отдела это не входит. Сразу стоит сказать, что система резервок, образующаяся при совместной работе в Revit – штука крайне нестабильная, как показала практика, иногда бэкап достать можно, иногда нет, доверять этой штуке я не хотел.
Попытки научить разных людей культуре бэкапов собственных проектов или хотя бы собственных рабочих файлов не увенчались успехом. В принципе, можно было бы забить на эту ситуацию и предоставить людям их ответственность, но на горизонте уже появилось мое любопытство и первая версия автобэкапов, которая прилично преобразилась до сегодняшней версии.
Делитесь опытом, доверяете ли вы Проектировщикам? Или также, как Заур, не отпускаете в свободное плавание и заботитесь о сохранении их работы больше, чем они сами?)
ОСНОВНАЯ ИДЕЯ
Далее будет подробно расписан весь функционал скрипта. Основная идея скрипта заключается в автоматизации процесса резервного копирования Revit-файлов, обеспечивая копирование только измененных файлов для экономии времени и места, а также управление количеством копий, с автоматическим удалением старых версий. Это позволяет пользователям эффективно поддерживать актуальные резервные копии и контролировать дисковое пространство сервера, не перегружая систему избыточными данными.
Полная версия скрипта будет в открытом доступе для использования всеми желающими, каждый сможет настроить его под себя.
ОБЗОР ФУНКЦИОНАЛА
Первым шагом в скрипте идет инициализация среды и вывод приветственной информации. С помощью команды @echo отображается название компании, имя проекта, а также сообщение о том, что процесс резервного копирования запущен. Эта небольшая деталь добавляет приятный пользовательский интерфейс, делая скрипт более информативным и профессиональным:
@echo off
color 0d
@echo BIM-отдел ООО "РЕМАРК"
@echo.
@echoПРОЕКТ – ...
@echoПроцесс создания резервных копий...
@echo.
setlocal EnableExtensions EnableDelayedExpansion
Далее начинается настройка переменных, которые играют ключевую роль на всех этапах выполнения скрипта:
searchDir — путь к директории, где будет происходить поиск файлов ".rvt".
outputFile — config файл, в который скрипт записывает пути ко всем найденным файлам ".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%"
Обработка файлов для копирования
После того как все файлы найдены и записаны в "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 в конце кода.
Пример работы скрипта:
УВЕЛИЧИВАЕМ МАСШТАБЫ СКРИПТА
Одно из небольших ограничений (на данный момент) скрипта заключается в том, что он применим для создания бэкапов только для одного проекта и его структуры папок. Но это ограничение легко обходится копированием нужного количества скриптов под каждый проект, которые будут управляться через центральный 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 секунды паузы.
Внутри центрального скрипта встроена стоковая проверка пути, которая выдаст вам уведомление, в случае отсутствия указанного адреса:
Для каждого проекта проверяется код возврата 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, обеспечивая удобный способ уведомления пользователя.
Управлять всеми бэкапами через такой центральный файл крайне удобно, запускаете Планировщик заданий в Windows и указываете только центральный скрипт и частоту его запуска, готово, дальше он справиться сам.
Пример запуска центрального скрипта:
ПРЕИМУЩЕСТВА СКРИПТА
1. Автоматизация процесса: Скрипт полностью автоматизирует процесс резервного копирования, начиная с поиска файлов и заканчивая удалением старых версий. Это снимает с пользователя необходимость вручную отслеживать изменения файлов и упрощает управление резервными копиями.
2. Экономия времени и ресурсов за счет проверки изменений перед копированием. Скрипт копирует только измененные файлы, что экономит дисковое пространство и сокращает время выполнения операции.
3. Контроль версий: Возможность хранения любого количества версий каждого файла помогает сохранить важные данные.
4. Интуитивно понятный интерфейс: Приветственные сообщения, вывод текущего статуса, а также информация об ошибках и успешном завершении позволяют пользователю легко отслеживать процесс выполнения скрипта.
5. Универсальность: Скрипт можно легко адаптировать под другие проекты, директории, форматы файлов и т.д. просто изменив переменные.
6. Скорость копирования файлов: Скорость отработки любых операций через batch сильно превышает скорость любого софта, делающего тоже самое, одна из причин – простота программы. Для наглядности можете попробовать удалить 100 Гб данных или 100000 элементов через подобный скрипт или же через обычный "Delete", разница будет огромная.
ЗАКЛЮЧЕНИЕ
Заур реализовал автоматическое резервное копирование проектов и при этом не захламляя дисковое пространство сервера. Более того, выложил ссылку на скачивание, так что применяйте на своих проектах.
Слова автора на последок (но не последние):
Надеюсь, это кастомное решение упростит кому-нибудь жизнь, также как мне. В будущем планируется небольшой апгрейд, так что ждем версию v4.0)))
Как вам такой ход?