Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


Linzer,
Вот вариант. Постановку слегка изменил в части недельных копий
Код: Выделить весь код
@Echo Off                                                                                                 
cls
Set "Arc=C:\Program Files\WinRAR\WinRar.exe"
Set "ArcExt=Rar" 

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "tNow=%%d"
Set /A tNow=%tNow:~0,8%

rem ---------
Call :BakCopy "Z:\192.168.1.1_Backup\Base1.bak" "Z:\Backup\Day"  "Z:\Backup\Week" "Z:\Backup\Month" 3 "Z:\Backup\Log\%tNow%.log"
Call :BakCopy "Z:\192.168.1.1_Backup\Base2.bak" "Z:\Backup\Day"  "Z:\Backup\Week" "Z:\Backup\Month" 3 "Z:\Backup\Log\%tNow%.log"
Call :BakCopy "Z:\192.168.1.1_Backup\Base3.bak" "Z:\Backup\Day"  "Z:\Backup\Week" "Z:\Backup\Month" 3 "Z:\Backup\Log\%tNow%.log"
rem ---------

pause
GoTo :Eof

:BakCopy
        Call :MdOut %2 %6 ||Exit /B 3 
        Call :MdOut %3 %6 ||Exit /B 3 
        Call :MdOut %4 %6 ||Exit /B 3
        Call :MdOut "%~dp6" %6 ||Exit /B 3
 
	Set "Fin=%~1"
	Set "Fin=%Fin:\=\\%"
	
	Set "Df=absent"
	For /f "tokens=1* delims=," %%a in ('2^>nul wmic datafile where "name='%Fin%'" get 'Last Modified' /format:csv') Do (
		If /I "%%a"=="%ComputerName%" Set "Df=%%b"
	)
	Set "Df=%Df:~0,8%"

	If Not "%tNow%"=="%Df%" Set Msg=!!! %Date% %Time% %1 no today backup. Last backup %Df%
	If Not "%tNow%"=="%Df%" (Echo %Msg% &>>%6 Echo %Msg% &Exit /B 2)
	
	If Exist "%~2\%~nx1" Move /Y "%~2\%~nx1" "%~2\~%~nx1" >nul
	Copy %1 "%~2\" >nul
	Set "Err=%ErrorLevel%"
	If %Err%==0 (
		Set Msg=+++ %Date% %Time% %1 copied %2
		Del "%~2\~%~nx1" 2>nul
	) Else (
		Set Msg=!!! %Date% %Time% %1 not copied %2
		If Exist "%~2\~%~nx1" Move /Y "%~2\~%~nx1" "%~2\%~nx1" >nul
	)
	Echo %Msg% &>>%6 Echo %Msg%
	If Not %Err%==0 Exit /B %Err%
	
	If %tNow:~4,2%==01 (Set /A Month=%tNow:~0,6%-89) Else (Set /A Month=%tNow:~0,6%-1)
	
	If Exist "%~4\%~nx1_%Month%.%ArcExt%" GoTo :ArcWeek

	"%Arc%" a -m2 -ep "%~4\%~nx1_%Month%.%ArcExt%" "%~2\%~nx1"
	
	Set "Err=%ErrorLevel%"
	If %Err%==0 (
		Set Msg=+++ %Date% %Time% %1 created "%~4\%~nx1_%Month%.%ArcExt%"
	) Else (
		Set Msg=!!! %Date% %Time% %1 !!! NOT created !!! "%~4\%~nx1_%Month%.%ArcExt%"
	)
	Echo %Msg% &>>%6 Echo %Msg% &Exit /B %Err%

	:ArcWeek
	"%Arc%" a -m1 -ep "%~3\%~nx1_%tNow%.%ArcExt%" "%~2\%~nx1"

	Set "Err=%ErrorLevel%"
	If %Err%==0 (
		Set Msg=+++ %Date% %Time% %1 created "%~3\%~nx1_%tNow%.%ArcExt%"
	) Else (
		Set Msg=!!! %Date% %Time% %1 !!! NOT created !!! "%~3\%~nx1_%tNow%.%ArcExt%"
	)
	Echo %Msg% &>>%6 Echo %Msg%

	FOR /F "usebackq skip=%~5 delims=" %%f IN (`2^>nul Dir /B /O:-D /T:W "%~3\%~nx1_*.%ArcExt%"`) DO (
		Del "%~3\%%f" &&(Echo --- %Date% %Time% "%~3\%%f" deleted &>>%6 Echo --- %Date% %Time% "%~3\%%f" deleted)
	)
	Exit /B %Err%
GoTo :Eof

:MdOut
	If Exist %1 Exit /B 0
	Md %1 &&Exit /B 0
	Set Msg=!!! %Date% %Time% Не удалось создать папку %1  
	Echo %Msg% &>>%2 Echo %Msg%
Exit /B 3
Ежедневно делается копия бэкапа. Имя бэкапа всегда одинаково.
Если сегодняшней копии нет, ничего не делаем.
Если нет копии прошлого месяца (делаем, в идеале, в первом числе текущего месяца) архивируем сегодняшний бэкап в папку месяца.
Если копия прошлого месяца есть, архивируем сегодняшний бэкап в недельную папку. В этой папке храним не более заданного числа архивов бэкапов каждой базы. В моём примере это 3 дня (можете исправлять как нужно). Подозреваю, больше и не нужно.
Для архивирования выбирал уровень компрессии -m1 для ежедневной копии в папке Week. Работает очень быстро и бэкапы баз жмет неплохо. Для месячной копии можно выбрать более высокий уровень компрессии (у меня здесь -m2)
Вообще-то уровень компрессии стОит выбирать из соображений временнЫх затрат в зависимости от объема бэкапов.
Ведется лог процесса.
Пропишите свои пути к архиватору, файлам и папкам.
В выделенном фрагменте перечисляются нужные базы. В чём удобство - можно для каждой базы прописать свои пути.
Если хотите, можете не перечислять все базы в выделенном фрагменте кода, его можно заменить на
Код: Выделить весь код
rem ---------
FOR %%i IN ("Z:\192.168.1.1_Backup\*.bak") DO Call :BakCopy "%%~i" "Z:\Backup\Day"  "Z:\Backup\Week" "Z:\Backup\Month" 3 "Z:\Backup\Log\%tNow%.log"
rem ---------

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-10-2018 в 17:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:20, 08-10-2018 | #2