Windows自動備份(每天、每月最後一天、每個週日),自動清除備份命令

直接上BAT文件的內容了,完整代碼如下。

備份效果:保留最新7天的網站備份、最新4個週末的網站備份,每個月底的備份永久保留。

使用的WinRAR做文件壓縮,請自行安裝並注意命令中WinRAR的路勁、備份文件夾、存放路勁、3個異地存放路勁,根據應用需要調整

將該BAT文件配置到Windows“任務計劃程序”中,頻率爲每天固定時間運行(比如23點),即可實現自動備份。

下面是關於備份命令的幾點簡單說明(詳細參數或用法請自行查詢詳細資料瞭解):

  1. 命令中::代表註釋
  2. set後定義的是變量名及值
  3. %%之間加變量名,是取變量的值,%date:~0,4%指的是取系統時間中的前四位即年份數字
  4. WinRAR壓縮,排除了帶.log的文件
  5. xcopy即複製命令,/d指比較目標和原目錄,目標目錄爲空則複製所有,否則只複製更新過的,/y指禁止提示確認要覆蓋已存在的目標文件
  6. FORFILES命令,/P指定Path ,表明要從哪裏開始搜索;/M指按照條件搜索文件,默認是*.* ;/C指在每個文件上運行指定的Command 。帶有空格的命令字符串必須用引號括起來。默認的Command 是"cmd /c echo @file";/D指選擇日期大於或等於(+ )(或者小於或等於(- ))指定日期的文件,不帶時間參數則代表與當前日期比較
  7. 代碼中判斷是否是週日,使用的是“日”這個字,考慮的是中文環境,英文環境請自行修改
  8. 閏年判斷已經調整爲標準的閏年判斷條件(條件1:公曆年份是4的倍數,且不是100的倍數;條件2:公曆年份是整百數的,必須是400的倍數),%%代表取餘
  9. >>用來向文件中寫日誌
@echo off
::年月日字符串
set str_date=%date:~0,4%%date:~5,2%%date:~8,2%
::星期幾
set str_week_val=%date:~-1%
::本地要備份的文件夾路徑
set str_webpath_local=D:\wwwroot
::本地備份文件存放路徑
set str_path_local=D:\web_bak
::網站壓縮包名稱前綴
set str_rar_name=MH_WEB
::異地 備份路徑
set str_path_day=z:\最新7天網站備份
::異地 備份路徑
set str_path_weekend=z:\最新4個週末的網站備份
::異地 備份路徑
set str_path_month=z:\每個月底的網站備份

::取兩位月份數字
set /a m=%date:~5,2%*1
::第一位爲0則只取個位數
if %m:~0,1%==0 set /a m=%m:~1,1%*1
::取四位年份數字(這個命令用不到5位數那年吧)
set /a x=%date:~0,4%
::閏年判斷條件1 %%代表取餘
set /a y=%x%*1%%4
set /a y2=%x%*1%%100
::閏年判斷條件2 %%代表取餘
set /a y3=%x%*1%%400
::默認2月份只有28天
set ld=28
::滿足閏年條件1
if %y%==0  (
    if %y2% NEQ  0  set ld=29
)
::滿足閏年條件2
if %y3%==0  set ld=29
for %%i in (1 3 5 7 8 10 12)do (if %m%==%%i set /a ld=31)
for %%i in (4 6 9 11)do (if %m%==%%i set /a ld=30)
::echo  日期:%ld%
::pause

::當月月底的年月日字符串
set str_monthend_val=%date:~0,4%%date:~5,2%%ld%%

c:
cd C:\Program Files\WinRAR\

echo %time%開始壓縮 >>%str_path_local%\%str_date%_log.bak

rar a -u -x*.log* %str_path_local%\%str_rar_name%%str_date%.rar %str_webpath_local%

echo %time%結束壓縮 >>%str_path_local%\%str_date%_log.bak
echo. >>%str_path_local%\%str_date%_log.bak

echo %time%開始複製 >>%str_path_local%\%str_date%_log.bak

if "%str_date%"=="%str_monthend_val%" (
	xcopy %str_path_local%\%str_rar_name%%str_date%.rar %str_path_month% /d/y
) else (
if "%str_week_val%"=="日" ( 
	xcopy %str_path_local%\%str_rar_name%%str_date%.rar %str_path_weekend% /d/y
	::刪除4周前的rar文件
	FORFILES /P %str_path_weekend%  /M *.rar /D -22 /C "cmd /c echo %time% deleting..@file.. &del @file">>%str_path_local%\%str_date%_del.bak

) else (
	xcopy %str_path_local%\%str_rar_name%%str_date%.rar %str_path_day% /d/y
	::刪除7天前的rar文件
	FORFILES /P %str_path_day%  /M *.rar /D -7 /C "cmd /c echo %time% deleting..@file.. &del @file">>%str_path_local%\%str_date%_del.bak
)
)

echo %time%結束複製 >>%str_path_local%\%str_date%_log.bak
echo. >>%str_path_local%\%str_date%_log.bak

::刪除本地1天前的rar文件
FORFILES /P %str_path_local%  /M *.rar /D -1 /C "cmd /c echo %time% deleting..@file.. &del @file">>%str_path_local%\%str_date%_del.bak
::刪除本地7天前的bak記錄文件
FORFILES /P %str_path_local%  /M *.bak /D -7 /C "cmd /c echo %time% deleting..@file.. &del @file">>%str_path_local%\%str_date%_del.bak

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章