Узагальнення про використання 7zip та robocopy на прикладі реальних задач для бекапу з гівна і палок.
За допомогою 7zip:
:: Скрипт архівує директорію nyurch.github.io
@echo off
SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET arch_path="C:\Program Files\7-Zip"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
SET arch_date=%dd%-%mm%-%yyyy%
%arch_path%\7z.exe a -ssw -mx1 -r0 %projects_path%\nyurch-backup_%arch_date%.zip %jkl_path% -xr!.jekyll-cache -xr!.git -xr!_site
pause
Архівується все за вийнятком директорій .jekyll_cache , .git , _site . Начорта воно здалося якщо все включаючи історію змін є на github? Сила звички, а буває щось як наміняєш то простіше розвернути з архіву ніж шукати де баг, особливо якщо не зразу проявилося.
Те саме але за допомогою robocopy:
:: Скрипт дублює директорію nyurch.github.io
@echo off
SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
set h=%TIME:~0,2%
set m=%TIME:~3,2%
SET arch_date=%dd%-%mm%-%yyyy%
SET arch_time=%h%-%m%
robocopy %jkl_path% %projects_path%\nyurch.github.io-%arch_date%\ *.* /E /XD .jekyll-cache .git _site /LOG+:%projects_path%\robocopy.log
pause
Якщо замість ключа /E використати ключ /MIR відбудеться синхронізація директорій. Файли що були видалені з вихідної директорії видаляться з директорії архіву.
Можна робити архів змін, а не всієї директорії. На прикладі того ж проекту:
:: Скрипт архівує зміни в директорії nyurch.github.io з моменту останнього повного архівування
@echo off
SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET arch_path="C:\Program Files\7-Zip"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
set h=%TIME:~0,2%
set m=%TIME:~3,2%
SET arch_date=%dd%-%mm%-%yyyy%
SET arch_time=%h%-%m%
%arch_path%\7z.exe u %projects_path%\nyurch-backup_%arch_date%.zip -u- -up0q3r2x2y2z0w2^!%projects_path%\nyurch-backup_%arch_date%_%arch_time%.zip %jkl_path% -xr!.jekyll-cache -xr!.git -xr!_site
pause
Буде створено архів змін сьогоднішнього дня. Наприклад зранку перед початком роботи робиться повний архів, ввечері після завершення роботи робиться архів змін за день.
За допомогою robocopy:
:: Скрипт архівує зміни директорії nyurch.github.io
@echo off
SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
set h=%TIME:~0,2%
set m=%TIME:~3,2%
SET arch_date=%dd%-%mm%-%yyyy%
SET arch_time=%h%-%m%
robocopy %jkl_path% %projects_path%\nyurch.github.io-%arch_date%_1-day\ *.* /maxage:1 /S /XD .jekyll-cache .git _site /LOG+:%projects_path%\robocopy.log
pause
Скрипт створить директорію зі змінами внесеними протягом дня від поточної дати( ключ /maxage:1)
robocopy ще має цікаву функцію відслідковування змін на льоту. Наприклад:
:: Скрипт відслідковує зміни директорії nyurch.github.io на льоту
@echo off
SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
robocopy %jkl_path% %projects_path%\nyurch.github.io-clone\ /MIR /LOG+:%projects_path%\robocopy.log /mon:1 /mot:1
Скрипт моніторить джерело кожні X хвилин, ключ /mot:X та синхронізує директорії якщо було внесено Y змін, ключ /mon:Y.