Код:
@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:
Дневной каждый день перезаписывается, недельный - в определенное время (настраиваемое), месячный - раз в месяц »
|
Вы должны просто запланировать исполнение скрипта. Всё остальное сделает скрипт.