Инкрементное резервное копирование в 7z через nncron

Обсуждение программ nnCron и nnCron LITE

Инкрементное резервное копирование в 7z через nncron

Postby Morituruz » Thu, 15 Dec 2011, 16:03

Покритикуйте, пожалуйста, задачу, может я что-то не учёл.
Сразу хочу пояснить, почему я отказываюсь от nnbackup:
1. Преимущества 7z перед zip очевидны. Захотел использовать 7z архиватор, но заметил, что он не хочет добавлять в архив файлы, открытые на чтение/запись, но которые можно было скопировать в другую папку без проблем. Т.е. простое добавление опции -extzip 7z приводило к тому, что в архив не включались некоторые файлы.
2. В nnbackup глубина стека инкрементного архива всего 10, а мне этого как-то маловато.
3. Если nncron-ом копировать файлы в предварительную папку, чтобы потом передать их в 7z, то nnbackup уже получается лишней прокладкой между nncron и 7z.

Code: Select all
#( dump_inc
\ 10:09 10.04.2012
Time: 20 1 * * * *
NoLog
SingleInstance

USER-CREATE backup_folder 256 USER-ALLOT
USER-CREATE backup_name 256 USER-ALLOT
USER-CREATE source_folder 256 USER-ALLOT
USER-CREATE backup_re 256 USER-ALLOT
USER-CREATE backup_xre 256 USER-ALLOT
USER-CREATE temp_folder 256 USER-ALLOT

fVAR backup_date
2USER backup_date_tmp
2USER backup_date_buf
fVAR backup_level
USER-VALUE backup_level_tmp
USER-VALUE backup_counter

\ список для хранения полных имён файлов бэкапа:
STRING-LIST: backups_list

\ глубина стека архива
USER-VALUE backup_depth

Action:
\ инкрементное копирование
\ Параметры:
\ название бэкапа:
S" my_backup" backup_name PLACE
\ директория для бэкапа:
S" d:\backup\" backup_folder PLACE
\ откуда бэкап:
S" c:\my_folder\" source_folder PLACE
\ регулярное выражение для отбора файлов:
S" /\.(xls)|(doc)/i" EVAL-SUBST backup_re PLACE
\ глубина стека бэкапа:
32 TO backup_depth

\ временная папка:
S" TEMP" ENV backup_name COUNT S+ S" \" S+ temp_folder PLACE
DIR-DELETE: "%temp_folder COUNT%"
GetLastError 18 =
GetLastError 2 =
OR
IF
   temp_folder COUNT DIR-CREATE
ELSE
   250 250 HINT-POS
   S" %backup_name COUNT% DIR-DELETE error: %GetLastError%" EVAL-SUBST 2DUP CRON-LOG HINT
   EXIT
THEN

\ папка для файловых переменных
backup_folder COUNT backup_name COUNT S+ S" \" S+ uFileVarPath!

\ проверяем наличие уровня бэкапа, записываем в буфер:
backup_level S>NUM backup_depth =
backup_level S" " COMPARE 0=
OR
IF
   0 TO backup_level_tmp
ELSE
   backup_level S>NUM 1 + TO backup_level_tmp
THEN

\ для точности, сохраняем текущую дату:
FT-CUR backup_date_buf 2!

\ копируем всё барахло во временную:
backup_level_tmp 0=
IF
   \ раз это 0 бэкап, то сохраняем текущую дату:
   FT-CUR FT>Y_M_D_H_M_S TO backup_date
   RECURSIVE SKIPERRORS
   source_folder COUNT S" *" S+ FOR-FILES
      FOUND-FILENAME backup_re COUNT RE-MATCH
      IF
         \ создаём папку для файла, даже если уже есть:
         temp_folder COUNT FOUND-RELPATH S+ ONLYDIR DIR-CREATE
         \ копируем файл в новое место, имя записываем в другой лист
         FOUND-FULLPATH temp_folder COUNT FOUND-RELPATH S+ FCOPY
      THEN
   ;FOR-FILES
ELSE
   \ проверяем наличие даты в переменной:
   backup_date SWAP DROP 0=
   IF
      \ ошибка! дата пустая:
      300 300 HINT-POS
      S" %backup_name% backup error: пропала дата" EVAL-SUBST 2DUP CRON-LOG HINT
      EXIT
   ELSE
      \ дату из файловой переменной записываем в буфер:
      backup_date Y_M_D_H_M_S>FT backup_date_tmp 2!
   THEN
   RECURSIVE SKIPERRORS
   source_folder COUNT S" *" S+ FOR-FILES
      \ изменённые после последнего бэкапа
      backup_date_tmp 2@ FOUND-FULLPATH FILE-WTIME D<
      IF
         IS-DIR? 0=
         IF
            FOUND-FILENAME backup_re COUNT RE-MATCH
            IF
               \ создаём папку для файла, даже если уже есть:
               temp_folder COUNT FOUND-RELPATH S+ ONLYDIR DIR-CREATE
               \ копируем файл в новое место, имя записываем в другой лист
               FOUND-FULLPATH temp_folder COUNT FOUND-RELPATH S+ FCOPY
            THEN
         THEN
      THEN
   ;FOR-FILES
THEN

\ существуют ли изменённые файлы:
RECURSIVE
temp_folder COUNT DIR-SIZE D0= NOT
IF
   \ если изменённые есть, то архивируем их:
   StartIn: "c:\Program Files\7-Zip"
   NormalPriority ShowNormal
   START-APPW: "c:\Program Files\7-Zip\7z.exe" -mx1 a -r "%backup_folder COUNT%%backup_name COUNT%\%backup_depth N>S SWAP DROP backup_level_tmp XN>S%_level_%YY%-%MM%-%DD%_%hh%-%mm%" "%temp_folder COUNT%"
   ExitCodeProc 0 =
   IF
      \ бэкап прошёл успешно, сохраняем текущую дату и текущий уровень бэкапа:
      backup_date_buf 2@ FT>Y_M_D_H_M_S TO backup_date
      backup_level_tmp N>S TO backup_level
   ELSE
      y_res @ 10 / RANDOM DUP HINT-POS
      S" %backup_name COUNT% backup error %ExitCodeProc%!" EVAL-SUBST 2DUP CRON-LOG HINT
      \ и удаляем неудачно созданный архив, если есть:
      backup_folder COUNT backup_name COUNT S+ S" \" S+ backup_depth N>S SWAP DROP backup_level_tmp XN>S S+ S" *" S+ FDELETE
   THEN
THEN

DIR-DELETE: "%temp_folder COUNT%"
GetLastError 18 <>
GetLastError 2 <>
GetLastError 0 <>
AND
AND
IF
   300 300 HINT-POS
   S" %backup_name COUNT% DIR-DELETE error: %GetLastError%" EVAL-SUBST 2DUP HINT CRON-LOG
   EXIT
THEN
\ MSG: "DONE"
)#


Резервное копирование в стек архивов, с переименованием, где самый новый имеет номер 1, предыдущий 2 и т.д.
Code: Select all
#( dump_stack
NoLog
SingleInstance
Time: 5,35 8-19 * * * *
Time: 15 1 * * * *

Action:
\ Параметры:
\ название бэкапа:
S" my_files" backup_name PLACE
\ директория для бэкапа:
S" d:\backup\" backup_folder PLACE
\ откуда бэкап:
S" e:\files\" source_folder PLACE
\ глубина стека:
600 TO backup_depth

\ временная папка:
S" TEMP" ENV backup_name COUNT S+ S" \" S+ temp_folder PLACE
DIR-DELETE: "%temp_folder COUNT%"
GetLastError 18 =
GetLastError 2 =
OR
IF
   temp_folder COUNT DIR-CREATE
ELSE
   250 250 HINT-POS
   S" %backup_name COUNT% DIR-DELETE error: %GetLastError%" EVAL-SUBST 2DUP CRON-LOG HINT
   EXIT
THEN

\ копируем всё в темп:
RECURSIVE
source_folder COUNT S" *" S+ FOR-FILES
   IS-DIR? 0=
   \ исключающая маска:
   FOUND-FILENAME S" /neetotfile/i" RE-MATCH NOT
   AND
   IF
      \ создаём папку для файла, даже если уже есть:
      temp_folder COUNT FOUND-RELPATH S+ ONLYDIR DIR-CREATE
      \ копируем файл в новое место, имя записываем в другой лист
      FOUND-FULLPATH temp_folder COUNT FOUND-RELPATH S+ FCOPY
   THEN
;FOR-FILES

StartIn: "c:\Program Files\7-Zip"
NormalPriority SWHide
START-APPW: "c:\Program Files\7-Zip\7z.exe" -p%archpass% -mhe -mx1 a -r "%backup_folder COUNT%%backup_name COUNT%\%backup_depth N>S SWAP DROP 0 XN>S%_%YY%-%MM%-%DD%_%hh%-%mm%" "%temp_folder COUNT%"
ExitCodeProc
IF
   y_res @ 10 / RANDOM DUP HINT-POS
   S" %backup_name COUNT% backup error %ExitCodeProc%!" EVAL-SUBST 2DUP HINT CRON-LOG
ELSE
   \ бэкап создан удачно, поэтому сдвигаем названия файлов
   \ собираем список файлов в лист:
   backup_folder COUNT backup_name COUNT S+ S" \*" S+ FOR-FILES
      \ FOUND-FILENAME TYPE CR
      \ ищем файлы, начинающиеся с цифры и _
      FOUND-FILENAME S" /^\d+\_/i" RE-MATCH
      IF
         FOUND-FULLPATH backups_list!
      THEN
   ;FOR-FILES
   \ переименовываем файлы в листе:
   0 TO backup_counter
   backups_list(
      backup_counter 1 + TO backup_counter
      backup_counter backup_depth >
      IF
         NODE@ FDELETE
      ELSE
         \ полное имя, из которого будем переименовывать
         \ плюс обрезаем до папки, а имя приделаем из номера + обрезок
         NODE@ 2DUP ONLYDIR S" \" S+
         \ смотрим на глубину бэкапа, чтобы потом с помощью
         \ слова XN>S добавить столько нолей, сколько надо
         backup_depth N>S SWAP DROP
         backup_counter XN>S
         NODE@ ONLYNAME 2DUP S" _" StringGetPos 1 - /STRING S+ S+ FRENAME
         GetLastError
         IF
            350 350 HINT-POS
            S" %NODE@% GLE: %GetLastError N>S%" EVAL-SUBST 2DUP HINT CRON-LOG
         THEN
      THEN
   )backups_list
   backups_list LIST-FREE
THEN

DIR-DELETE: "%temp_folder COUNT%"
GetLastError 18 <>
GetLastError 2 <>
GetLastError 0 <>
AND
AND
IF
   300 300 HINT-POS
   S" %backup_name COUNT% DIR-DELETE error: %GetLastError%" EVAL-SUBST 2DUP HINT CRON-LOG
   EXIT
THEN
)#
Last edited by Morituruz on Thu, 26 Apr 2012, 08:31, edited 6 times in total.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Инкрементное копирование в 7z через nncron

Postby VoidVolker » Thu, 15 Dec 2011, 17:13

В случае, если данные слова не используются в других задачах, я бы сделал так:
Code: Select all
\ название бэкапа:
: backup_name S" test" backup_name ;
\ директория для бэкапа:
: backup_folder S" d:\backup\" ;
\ откуда бэкап:
: source_folder S" c:\program\" ;


А вот тут самое место для Autostrings.spf:
Code: Select all
\ временная папка:
: temp_folder " TEMP" ENV " %2SWAP%%backup_name%\" ;


Code: Select all
temp_folder DIR-DELETE


Code: Select all
" %backup_name% DIR-DELETE error: %GetLastError N>S%" 2DUP CRON-LOG HINT


Code: Select all
\ папка для файловой переменной:
" %backup_folder%%backup_name%\" uFileVarPath!


Code: Select all
" |qc:\Program Files\7-Zip\7z.exe|q -password -mhe -mx1 a -r |q%backup_folder%%backup_name%\%backup_level%_level_%YY%-%MM%-%DD%_%hh%-%mm%|q |q%temp_folder%|q" START-APPW


Code: Select all
" %backup_name% backup error %ExitCodeProc N>S%!" 2DUP HINT CRON-LOG

После такой небольшой оптимизации задача будет более эффективно использовать вычислительные ресурсы.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 3 guests