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. >>用來向文件中寫日志
  10. 新補充: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


免責聲明!

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



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