zoukankan      html  css  js  c++  java
  • 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 FilesWinRAR
    
    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

  • 相关阅读:
    Hystrix容错处理
    Elasticsearch基本命令
    Elasticsearch
    IDEA最新破解方式
    ElasticSearch _bulk批量处理报错The bulk request must be terminated by a newline
    Mysql引擎MyISAM和InnoDB的区别
    利用文件建立与删除swap分区
    新的分区----增加与删除swap分区
    增加,删除分区,不重启更新分区表信息
    将/home迁移到一个独立分区(新的硬盘)中
  • 原文地址:https://www.cnblogs.com/xuezhizhang/p/12228487.html
Copyright © 2011-2022 走看看