Windows使用bat腳本定時備份文件(夾)並刪除一定日期之前的備份和日志


備份的原理

使用windows的任務計划程序定時執行該腳本從而達到備份和刪除備份歷史的目的。

主要參數

腳本主要需要設置參數有四個:

  • bakPath:要備份的目錄,必須以\結尾
  • bakTargetPath:備份文件存儲路徑(可以是網絡路徑,前提是必須要有權限管理該路徑下的文件夾)
  • DaysAgo:該參數表示要刪除多少天之前的備份(比如今天是2012年12月31日,那么20121221的文件不會被刪除,20121220或比之小的文件夾將會被刪除)
  • logDaysAgo:該參數表示要刪除多少天之前的日志文件

腳本

BackUpTask.bat

 

::  ------------------------------------------------------------------------ 
::                       自動備份及清除文件夾腳本說明
::  本腳本能備份指定文件夾下的所有文件夾並以日期的形式來存放每次備份的文件夾,
::  同時,能刪除指定時間之前的備份文件夾。如果要使本腳本能按一定間隔時間來執行
::  此腳本,那么請在系統定時任務內創建一個任務,並設置好執行時間,然后指定執行
::  此腳本即可。
::  注意:由於定時任務執行的方式與直接點擊執行腳本的方式有很大差別(對於定時任
::  務來說,腳本的相對路徑其實就是相對於cmd.exe來說的路徑),所以必須使用絕對
::  路徑的方式來進行拷貝。
::  具體設置的參數:(所有的目錄路徑必須以\結尾)
::  bakPath 要備份的目錄,必須以\結尾
::  bakTargetPath 備份文件存儲路徑(可以是網絡路徑,前提是必須要有權限管理該路徑下的文件夾)
::  DaysAgo 該參數表示要刪除多少天之前的備份(比如今天是2012年12月31日,那么20121221的文件不會被刪除,20121220或比之小的文件夾將會被刪除)
::  logDaysAgo 該參數表示要刪除多少天之前的日志文件
::                                                         --by Blademainer
::  ------------------------------------------------------------------------ 

@echo off
:: for /f "tokens=1-3 delims=- " %%1 in ("%date%") do set ttt=%%1%%2%%3
:: for /f "tokens=1-3 delims=.: " %%1 in ("%time%") do set ttt=%ttt%-%%1%%2%%3

:: 要備份的目錄,必須以\結尾
set bakPath=C:\Users\blademainer\Desktop\test\

:: 備份文件存儲路徑(可以是網絡路徑,前提是必須要有權限管理該路徑下的文件夾)
set bakTargetPath=C:\Users\blademainer\Desktop\bak\

:: 該參數表示要刪除多少天之前的備份(比如今天是2012年12月31日,那么20121221的文件不會被刪除,20121220或比之小的文件夾將會被刪除)
set DaysAgo=10
:: 該參數表示要刪除多少天之前的日志文件
set logDaysAgo=%DaysAgo%


:: ----------------------------------- 注意:除非你有足夠的自信,否則不要變動以下參數 ----------------------------------- 
:: 日志存放路徑
set logDir=%bakTargetPath%\log\

:: 截取日期函數
set dateStr=%date:~0,4%%date:~5,2%%date:~8,2%
:: 時間戳
set timeStr=%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
:: 得出的索引
set indexStr=%dateStr%_%timeStr%

:: 設置時間格式
for /f "tokens=1-3 delims=- " %%1 in ("%time%") do set beautyTime=%%1%%2%%3

:: 日志文件名
set logFile=%logDir%%indexStr%.log

:: 獲取最后一個文件夾名稱
call :LastFolder %bakPath% bakName
:: 備份所在文件夾(按日期分)
set bakDataFolder=%bakTargetPath%%indexStr%\
:: 備份后的路徑
set bakDataPath=%bakDataFolder%%bakName%\
echo bakDataPath======%bakDataPath%

:: 創建日志目錄
if not exist %logDir% mkdir %logDir%

echo 開始備份文件夾
echo ------------------ %date% %beautyTime% ------------------  >> %logFile%
if not exist %bakDataPath% mkdir %bakDataPath%
xcopy %bakPath%* %bakDataPath% /c/s/e/y/r >> %logFile%
IF ERRORLEVEL 1 ECHO ------------------ 文件拷貝失敗 ------------------  >> %logFile%
IF ERRORLEVEL 0 ECHO ------------------ 文件拷貝成功 ------------------  >> %logFile%

::  ------------------- 計算指定DaysAgo天之前的日期 ------------------- 
:: 日期的格式為yyyymmdd
call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
set /a PassDays-=%DaysAgo%
call :DaysToDate %PassDays% DstYear DstMonth DstDay
set DstDate=%DstYear%%DstMonth%%DstDay%
echo %DaysAgo%天前的日期是%DstDate%

::  ------------------- 計算指定logDaysAgo天之前的日期 ------------------- 
:: 日期的格式為yyyymmdd
call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% logPassDays
set /a logPassDays-=%logDaysAgo%
call :DaysToDate %logPassDays% DstYear DstMonth DstDay
set logDstDate=%DstYear%%DstMonth%%DstDay%
echo %logDaysAgo%天前的日期是%logDstDate%

::  ------------------- 刪除文件夾 ------------------- 
echo 開始刪除數據文件夾
echo 開始刪除數據文件夾 >> %logFile%
setlocal enabledelayedexpansion
for /f "delims=" %%s in ('dir /b /ad "%bakTargetPath%"') do (
    set d=%%s
    set dateParse=!d:~0,8!
    echo 截取的日期為:!dateParse!
    set stDate=%DstDate%
    :: 如果該文件夾的日期小於該刪除的備份日期,則刪除該文件夾
    set path=%bakTargetPath%!d!
    echo 當前的路徑!path!
    if !dateParse! lss !stDate! call :DeleteDirectory !path!
)

echo 開始刪除日志文件夾%logDir%
echo 開始刪除日志文件夾 >> %logFile%
for /f "delims=" %%s in ('dir /a-d /b "%logDir%"') do (
    set d=%%s
    set dateParse=!d:~0,8!
    echo 截取的日期為:!dateParse!
    set stDate=%logDstDate%
    :: 如果該文件夾的日期小於該刪除的備份日期,則刪除該文件夾
    set path=%logDir%!d!
    echo 當前的路徑!path!
    if !dateParse! lss !stDate! call :DeleteFile !path!
)

endlocal
::  --------------------------- 結束--------------------------- 
goto :eof

:: 根據路徑計算最后一個文件夾
:LastFolder %1 folderName
Setlocal ENABLEDELAYEDEXPANSION
set string=%1
::定義路徑分隔符
set ch=\
set last=%string:~-1%
if "%last%"=="%ch%" (set "string=%string:~0,-1%")
set str=%string%

:next
if not "%str%"=="" (
    if "!str:~-1!"=="%ch%" goto last
    set rsString=!str:~-1!%rsString% 
    ::比較首字符是否為要求的字符,如果是則跳出循環
    set "str=%str:~0,-1%"
    goto next
)
:last
::將空格去掉
set rsString=%rsString: =%
echo 結果:%rsString%
endlocal&set %2=%rsString%&goto :EOF

:: 刪除文件夾
:DeleteDirectory %1
setlocal ENABLEEXTENSIONS
echo  ------------------ %1 ------------------
rd /s /q %1
echo  ------------------ 成功刪除文件夾: %1 ------------------  >> %logFile%
endlocal&goto :EOF

:: 刪除文件
:DeleteFile %1
setlocal ENABLEEXTENSIONS
echo  ------------------ %1 ------------------
del /f /s /q /a %1
echo  ------------------ 成功刪除文件: %1 ------------------  >> %logFile%
endlocal&goto :EOF

::以下是計算日期使用
:DateToDays %yy% %mm% %dd% days
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF

:DaysToDate %days% yy mm dd
setlocal ENABLEEXTENSIONS
set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
:: 結束goto使用: goto :eof

 FTP配置:

https://blog.csdn.net/KamRoseLee/article/details/79287834

bat配置:

https://xiongyingqi.com/2014/01/03/2014-01-04-windows-backup-bat/

https://blog.csdn.net/guankangqiang/article/details/106135902?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-6.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-6.not_use_machine_learn_pai

https://blog.csdn.net/xu_guowei/article/details/46790261?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-5.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-5.not_use_machine_learn_pai


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM