直接上BAT文件的內容了,完整代碼如下。
備份效果:保留最新7天的網站備份、最新4個周末的網站備份,每個月底的備份永久保留。
使用的WinRAR做文件壓縮,請自行安裝並注意命令中WinRAR的路勁、備份文件夾、存放路勁、3個異地存放路勁,根據應用需要調整。
將該BAT文件配置到Windows“任務計划程序”中,頻率為每天固定時間運行(比如23點),即可實現自動備份。
下面是關於備份命令的幾點簡單說明(詳細參數或用法請自行查詢詳細資料了解):
- 命令中::代表注釋
- set后定義的是變量名及值
- %%之間加變量名,是取變量的值,%date:~0,4%指的是取系統時間中的前四位即年份數字
- WinRAR壓縮,排除了帶.log的文件
- xcopy即復制命令,/d指比較目標和原目錄,目標目錄為空則復制所有,否則只復制更新過的,/y指禁止提示確認要覆蓋已存在的目標文件
- FORFILES命令,/P指定Path ,表明要從哪里開始搜索;/M指按照條件搜索文件,默認是*.* ;/C指在每個文件上運行指定的Command 。帶有空格的命令字符串必須用引號括起來。默認的Command 是"cmd /c echo @file";/D指選擇日期大於或等於(+ )(或者小於或等於(- ))指定日期的文件,不帶時間參數則代表與當前日期比較
- 代碼中判斷是否是周日,使用的是“日”這個字,考慮的是中文環境,英文環境請自行修改
- 閏年判斷已經調整為標准的閏年判斷條件(條件1:公歷年份是4的倍數,且不是100的倍數;條件2:公歷年份是整百數的,必須是400的倍數),%%代表取余
- >>用來向文件中寫日志
- 新補充:set /a m=%date:~5,2%*1 這一行有BUG,8月份帶出的數字是08,默認識別為八進制,且為不識別的八進制數字。錯誤信息:無效數字。數字常數只能是十進制(17),十六位進制(0x11)或 八進制(021)。調整為:set m=%date:~5,2% 即可。因為后面已經有if %m:~0,1%==0 set /a m=%m:~1,1%*1 這句處理0開頭的情況。
@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 m=%date:~5,2% ::第一位為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
本文首發於我的CSDN博客:https://blog.csdn.net/n_ithero/article/details/104037999
