在运维中,我们经常遇到需要将某些特定数据定时自动备份到远程主机的情况,并且实现自动删除一定时间之前的数据,将如下的内容保存为批处理并使用windows计划任务可以很好的实现:
####################################
::设置备份保留天数
set k=3
::判断操作系统类型
ver | find /i "5.0." >nul && goto 2000
ver | find /i "5.1." >nul && goto xp
ver | find /i "5.2." >nul && goto xp
ver | find /i "6.1." >nul && goto xp
::根据系统类型取当前年、月、日
:2000
set dn=%date:~4,4%
set dy=%date:~9,2%
set dr=%date:~12,2%
goto jc
:xp
set dn=%date:~0,4%
set dy=%date:~5,2%
set dr=%date:~8,2%
goto jc
::检查是否闰年
:jc
set /a dns=%dn%/400*400
if %dns% EQU %dn% goto runnian
goto jc1
:jc1
set /a dns=%dn%/4*4
if %dns% EQU %dn% goto jc2
goto pingnian
:jc2
set /a dns=%dn%/100*100
if %dns% EQU %dn% goto pingnian
goto runnian
::如果是平年,对8,9两月做特殊处理
:pingnian
if %dy%==08 goto pdy8
if %dy%==09 goto pdy9
goto pnqt
::如果是8月,开始计算k天前日期,判断k天前是否为上月,对8,9两日做特殊处理
:pdy8
if %dr%==08 goto dr8
if %dr%==09 goto dr9
set /a dr=%dr%-%k%
set dd=%dr:~0,1%
set /a dys=8-1
if %dys% LSS 10 set dys=0%dys%
if %dd%==- goto pnjc
if %dd%==0 goto pnjc
goto beforek
::如果是9月,开始计算k天前日期,判断k天前是否为上月,对8,9两日做特殊处理
:pdy9
if %dr%==08 goto dr8
if %dr%==09 goto dr9
set /a dr=%dr%-%k%
set dd=%dr:~0,1%
set /a dys=9-1
if %dys% LSS 10 set dys=0%dys%
if %dd%==- goto pnjc
if %dd%==0 goto pnjc
goto beforek
::如果是其他月份,开始计算k天前日期,判断k天前是否为上月,对8,9两日做特殊处理
:pnqt
if %dr%==08 goto dr8
if %dr%==09 goto dr9
set /a dr=%dr%-%k%
set dd=%dr:~0,1%
set /a dys=%dy%-1
if %dys% LSS 10 set dys=0%dys%
if %dd%==- goto pnjc
if %dd%==0 goto pnjc
goto beforek
::如果是闰年,对8,9两月做特殊处理
:runnian
if %dy%==08 goto rdy8
if %dy%==09 goto rdy9
goto rnqt
::如果是8月,开始计算k天前日期,判断k天前是否为上月,对8,9两日做特殊处理
:rdy8
if %dr%==08 goto dr8
if %dr%==09 goto dr9
set /a dr=%dr%-%k%
set dd=%dr:~0,1%
set /a dys=8-1
if %dys% LSS 10 set dys=0%dys%
if %dd%==- goto rnjc
if %dd%==0 goto rnjc
goto beforek
::如果是9月,开始计算k天前日期,判断k天前是否为上月,对8,9两日做特殊处理
:rdy9
if %dr%==08 goto dr8
if %dr%==09 goto dr9
set /a dr=%dr%-%k%
set dd=%dr:~0,1%
set /a dys=%dy%-1
if %dys% LSS 10 set dys=0%dys%
if %dd%==- goto rnjc
if %dd%==0 goto rnjc
goto beforek
::如果是其他月份,开始计算k天前日期,判断k天前是否为上月,对8,9两日做特殊处理
:rnqt
if %dr%==08 goto dr8
if %dr%==09 goto dr9
set /a dr=%dr%-%k%
set dd=%dr:~0,1%
set /a dys=%dy%-1
if %dys% LSS 10 set dys=0%dys%
if %dd%==- goto rnjc
if %dd%==0 goto rnjc
goto beforek
::判断是否为k天前是否为2月,判断k天前是否为上一年
:pnjc
if %dys%==02 goto py02
goto y%dys%
:rnjc
if %dys%==02 goto ry02
goto y%dys%
::如果跨年
:y00
set /a dn=%dn%-1
goto y12
::如果跨月
:y01
set dy=01
set /a dr=%dr%+31
goto beforek
:y03
set dy=03
set /a dr=%dr%+31
goto beforek
:y05
set dy=05
set /a dr=%dr%+31
goto beforek
:y07
set dy=07
set /a dr=%dr%+31
goto beforek
:y08
set dy=08
set /a dr=%dr%+31
goto beforek
:y10
set dy=10
set /a dr=%dr%+31
goto beforek
:y12
set dy=12
set /a dr=%dr%+31
goto beforek
:y04
set dy=04
set /a dr=%dr%+30
goto beforek
:y06
set dy=06
set /a dr=%dr%+30
goto beforek
:y09
set dy=09
set /a dr=%dr%+30
goto beforek
:y11
set dy=11
set /a dr=%dr%+30
goto beforek
:py02
set dy=02
set /a dr=%dr%+28
goto beforek
:ry02
set dy=02
set /a dr=%dr%+29
goto beforek
:dr8
set /a dr=8-%k%
set dr=0%dr%
goto beforek
:dr9
set /a dr=9-%k%
set dr=0%dr%
goto beforek
::计算k天前日期,然后根据操作系统类型重置当前日期
:beforek
if %dr% LSS 10 set dr=0%dr%
set kday=%dn:~0,4%%dy:~0,2%%dr:~0,2%
ver | find /i "5.0." >nul && goto 2k
ver | find /i "5.1." >nul && goto 2k3
ver | find /i "5.2." >nul && goto 2k3
ver | find /i "6.1." >nul && goto 2k3
:2k
set today=%date:~4,4%%date:~9,2%%date:~12,2%
goto bak
:2k3
set today=%date:~0,4%%date:~5,2%%date:~8,2%
goto bak
::备份当日数据,并删除k天前陈旧数据
:bak
md E:\bak\home\%today%
net use \\db-01 密码 /user:用户名
xcopy \\db-01\data\* E:\bak\data\%today%\ /c /E /y
if exist E:\bak\data\%kday% rd E:\bak\data\%kday% /q /s
exit
##################################################################