1. ничего сложного, главное чтобы архиватор понимал архивный атрибут (к примеру WinRAR)
2. планировщик может и ограничен, а скрипт нет
3. не совсем так, как минимум - переменная ERRORLEVEL плюс "If Exist"
4. можно тоже скриптом... от GUI NTBackup Имхо тоже мало толку.
Цитата Bugs:
Если будут предложения использовать ntbackup, сразу же попрошу приводить свои реально рабочие конфигурации, если можно с примерами скриптов.
|
к сожалению, NTBackup не жмет данные в отличе от архиваторов

, зато файлов создает меньше... CMD-вариант без привязки к шедулеру, все инкрементные архивы создаются в файле полного архива, любая критика приветствуется:
Код:

@echo off
SetLocal EnableDelayedExpansion
:: Параметры скрипта:
:: SOURCE - путь к сетевому ресурсу или имя BKS-файла
:: FULLDEPTH - глубина отката в полных архивах
:: INCRDEPTH - инкрементных архивов на один полный
SET SOURCE=\\SERVER\$DIR1
SET FULLDEPTH=5
SET INCRDEPTH=6
Call :CallEx GetState
Call :CallEx DelLogs
Call :CallEx StartCMD
If %ERRORLEVEL% EQU 0 (
Call :CallEx NewState
Call :CallEx SetState
Call :CallEx DelBkf)
Exit
:: Запуск процесса NTBackup
:StartCMD
Set $CMD=ntbackup backup %SOURCE% /f "%~dpn0.0.bkf" /l:f /m incremental /a
If %INCREMENT% EQU 0 Set $CMD=ntbackup backup %SOURCE% /f "%~dpn0.bkf" /l:f
Start /WAIT %$CMD%
If %ERRORLEVEL% NEQ 0 (
Call :CallEx CopyLog
Echo При выполнении резервного копирования возникли ошибки,
Echo Смотрите журнал сообщений: "%~n0.log".
Exit /B 1)
Call :CallEx CopyLog
If Exist %~n0.bkf (
If Exist %~n0.0.bkf Call :CallEx ShiftBkf 0 1
Ren %~n0.bkf %~n0.0.bkf
If %ERRORLEVEL% NEQ 0 Exit /B 1
If Exist %~n0.log Ren %~n0.log %~n0.0.log
If %ERRORLEVEL% NEQ 0 Exit /B 2)
GoTo :EOF
:: Чистка старых логов
:DelLogs
Set $BakData=%APPDATA:~0,-17%\Local Settings\Application Data\Microsoft\Windows NT\NTbackup\Data
Del /Q /F "%$BakData%\backup*.log" >nul
If %ERRORLEVEL% NEQ 0 Exit /B 1
GoTo :EOF
:CopyLog
Set $BakData=%APPDATA:~0,-17%\Local Settings\Application Data\Microsoft\Windows NT\NTbackup\Data
If %INCREMENT% EQU 0 (
Copy "%$BakData%\backup*.log" %~n0.log >nul
) Else (
Copy /B %~n0.0.log+"%$BakData%\backup*.log" %~n0.0.log >nul
)
If %ERRORLEVEL% NEQ 0 Exit /B 1
GoTo :EOF
:: Расчет нового состояния
:NewState
Set /A INCREMENT=%INCREMENT%+1
If %INCREMENT% GTR %INCRDEPTH% Set INCREMENT=0
GoTo :EOF
:: Чтение параметров
:GetState
For /f "Delims=" %%i in (%~n0.ini) Do Set /A %%i+0
If "%INCREMENT%"=="" (
Echo INCREMENT=0 >%~n0.ini
For /f "Delims=" %%i in (%~n0.ini) Do Set /A %%i+0
If Not "!INCREMENT!"=="0" (
Set INCREMENT=0
Exit /B 2
)
)
GoTo :EOF
:: Сохранение параметров
:SetState
Set $bak=%INCREMENT%
Echo INCREMENT=%INCREMENT% >%~n0.ini
For /f "Delims=" %%i in (%~n0.ini) Do Set /A %%i+0
If Not "%INCREMENT%"=="%$bak%" Exit /B 1
GoTo :EOF
:: Переименование архивов
:ShiftBkf
If Exist %~n0.%2.bkf (
Set /A $idx=%2+1
Call :ShiftBkf %2 !$idx!
If !ERRORLEVEL! NEQ 0 Exit /B 1 )
Ren %~n0.%1.bkf %~n0.%2.bkf
If %ERRORLEVEL% NEQ 0 Exit /B 1
If Exist %~n0.%2.log Del %~n0.%2.log
If %ERRORLEVEL% NEQ 0 Exit /B 2
If Exist %~n0.%1.log Ren %~n0.%1.log %~n0.%2.log
If %ERRORLEVEL% NEQ 0 Exit /B 2
GoTo :EOF
:: Удаление старых архивов
:DelBkf
For /f "tokens=1,2 delims=." %%i in ('Dir /B %~n0.?.bkf^|FindStr /REC:"\.[0-9]\.bkf"') Do (
If %%j GEQ %FULLDEPTH% (
Del /F/Q %%i.%%j.log
Del /F/Q %%i.%%j.bkf)
If !ERRORLEVEL! NEQ 0 Exit /B 1)
GoTo :EOF
:: Вызов процедур с контролем ошибок
:CallEx
Call :%*
If %ERRORLEVEL% EQU 1 (
Echo.
Echo Модуль "%1" вызвал исключение, работа скрипта прервана!
Exit )
If %ERRORLEVEL% EQU 2 Echo Модуль "%1" вызвал некритичную ошибку, работа скрипта продолжена.
GoTo :EOF