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

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

Ветеран


Contributor


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

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


Ваши пожелания, включая те, от которых Вы отказались
Код: Выделить весь код
@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 ---------
	FOR %%i IN ("\\192.168.100.4\Test1\*.bak") DO Call :BakCopy "%%~i" "Z:\Backup\Day"  "Z:\Backup\Week" 7 "Z:\Backup\Month" 1 "Z:\Backup\Log\%tNow%.log" 35
rem ---------

pause
GoTo :Eof

:BakCopy
        Call :MdOut "%~dp7" %7 ||Exit /B 3
        Call :MdOut %2 %7 ||Exit /B 3 
        Call :MdOut %3 %7 ||Exit /B 3 
        Call :MdOut %5 %7 ||Exit /B 3
 
	Pushd "%~dp1"
	FOR /F "delims=" %%d IN ('CD') DO Set "Fin=%%d"
	If Not "%Fin:~-1%" =="\" Set "Fin=%Fin%\"

	Set "Df=absent"
	For /f "tokens=1* delims=," %%a in ('2^>nul wmic datafile where "name='%Fin:\=\\%%~nx1'" get 'Last Modified' /format:csv') Do (
		If /I "%%a"=="%ComputerName%" Set "Df=%%b"
	)
	Popd

	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% &>>%7 Echo %Msg% &Exit /B 2)

rem Копия ежедневного бэкапа	
	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% &>>%7 Echo %Msg%
	If Not %Err%==0 Exit /B %Err%
	
rem	If %tNow:~4,2%==01 (Set /A Month=%tNow:~0,6%-89) Else (Set /A Month=%tNow:~0,6%-1)
	Set /A Month=%tNow:~0,6%
	
	If Exist "%~5\%~nx1_%Month%.%ArcExt%" GoTo :ArcWeek

rem Архив месячного бэкапа	
	"%Arc%" a -m2 -ep "%~5\%~nx1_%Month%.%ArcExt%" "%~2\%~nx1"
	Call :NDel "%~5\%~nx1_*.%ArcExt%" %~6 "%~7" 
	
	Set "Err=%ErrorLevel%"
	If %Err%==0 (
		Set Msg=+++ %Date% %Time% %1 created "%~5\%~nx1_%Month%.%ArcExt%"
	) Else (
		Set Msg=!!! %Date% %Time% %1 !!! NOT created !!! "%~5\%~nx1_%Month%.%ArcExt%"
	)
	Echo %Msg% &>>%7 Echo %Msg% &Exit /B %Err%

rem Архив бэкапов за неделю	
	: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% &>>%7 Echo %Msg%

	Call :NDel "%~3\%~nx1_*.%ArcExt%" %~4 "%~7" 
	Call :NDel "%~dp7*%~x7" %~8 "%~7" 

	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

:NDel
	FOR /F "usebackq skip=%~2 delims=" %%f IN (`2^>nul Dir /B /O:-D /T:W "%~1"`) DO (
		Del "%~dp1%%f" &&(Echo --- %Date% %Time% "%~dp1%%f" deleted &>>%3 Echo --- %Date% %Time% "%~dp1%%f" deleted)
	)
GoTo :Eof
Для бэкапов за неделю в папке "Z:\Backup\Week" 7 бэкапов
Для бэкапов за месяц в папке "Z:\Backup\Month" 1 бэкап
Число лог файлов "Z:\Backup\Log\%tNow%.log" 35 штук

Числа можете выставить свои.
Имя месячного бэкапа (выделил красным) сделал как Вы хотите. Но это нелогично.
Цитата Linzer:
Дневной каждый день перезаписывается, недельный - в определенное время (настраиваемое), месячный - раз в месяц »
Вы должны просто запланировать исполнение скрипта. Всё остальное сделает скрипт.

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


Отправлено: 16:36, 22-10-2018 | #7