复制代码 代码如下:
@echooff
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::文件备份器V2.3(forWinXPonly)CodebyJM2006-11-4QQ:13132002
::出处:http://www.cn-dos.net/forum/viewthread.php?tid=20747
::
::功能:1、自由指定要备份的目录(或文件)、位置、备份时间和任务名称
::2、能检测输入是否正确
::3、能生成备份日志
::4、能多次添加备份任务
::5、能批量停止指定的备份任务
::6、能自动删除由本程序产生且不再使用的批处理程序和注册表信息
::7、能从备份文件中恢复文件到源文件中,并保持各文件的原始属性不变
::
::原理:只有当源文件修改时间比目标文件的修改时间新时才更新文件
::
::要修改或完善的地方:
::
::①统一标记是文件还是文件夹;
::②禁止把文件备份到本文件夹及其子文件夹中去
::
::更新历史:
::
::06.11.4
::
::增加了记录备份文件更新列表的功能,进一步完善日志功能;
::
::06.10.19
::
::因at命令只能以管理员权限运行,此次更新增加了用户权限的验证;添加了
::xcopy的/c参数,使得复制出错的时候(尽管出现这种情况的几率非常低),能备份
::尽可能多的文件;精简了部分代码;
::
::06.9.14
::
::对提取文件属性的代码做了优化,使得生成备份批处理的效率大大提高,
::感谢pengfei提供代码;修改了几处错误和疏漏;对代码进行分块放置以便日后
::的维护;此为V2.3
::
::06.9.3
::
::由于上次精简过度,代码运行会出错,今天修改了一处致命错误,感谢
::pengfei的测试;增加了一些操作提示和出错检测;
::
::06.8.5
::
::添加了备份空目录的参数,精简了部分代码;
::06.8.1
::
::实现了用同一条命令复制文件和文件夹;修正了几处错误;
::06.7.29
::
::精简了获取属性的代码,感谢willsort提供;
::06.7.28
::完善了对备份后的文件进行恢复的操作,使得恢复操作对文件或者文件夹
::都适用;此为V2.2
::
::06.7.1
::完善了对日期的检测;
::06.6.29
::增加了恢复文件的功能;对生成后的文件的属性进行了调整;此为V2.1;
::06.6.20
::对显示各分区磁盘剩余空间的代码进行了修改,只显示磁盘的剩余空间,
::而不会画蛇添足地显示光盘剩余空间;
::06.6.15
::增加了日期和时间输入错误检测功能(感谢bagpipe提供代码);
::06.6.12
::修改了查询各分区剩余空间的代码,当磁盘卷标名为中文时也能准确排版。
::感谢willsort作深入分析并提供代码;当备份任务创建后,能自动打开备份后
::的文件夹和创建日志,以便查看备份创建结果;彻底删除无用文件;精简了部
::分代码;
::06.6.10
::修正了一处错误;精简了部分代码;
::06.6.9
::更改备份日志代码,将使备份日志体积减少近一半;更改了实现文件名自动
::完成这一功能的功能键(感谢electronixtar的提醒),但需要注册表中的特定键
::值为默认设置(有关讨论请参考http://www.cn-dos.net/forum/viewthread.php?
::tid=21091&fpage=1);
::06.6.6
::修改了部分代码,使得当需要每天备份的功能时,避免了烦琐的输入;增加
::了文件名自动完成的功能(感谢willsort提出设想并提供代码);此为V1.9;
::06.6.4
::增加了如下功能:当保存备份文件时,如果要对文件夹进行追加或者覆盖等
::操作,可先查看该文件夹下的内容再作决定;补充了备份风险提示;
::06.6.3
::对备份后文件的保存位置这部分代码进行了修改,使得程序能自动适应备份
::对象为文件和文件夹两种情况,使备份后文件夹的目录结构得到保持,感谢
::willsort提供代码;当备份文件即将保存到一个已经存在的目录下时,增加了允
::许追加至该目录的选择;
::06.6.2
::添加和修改了了如下功能:可以选择在开机时是否自动运行备份任务程序;
::开始运行本程序或者停止某项备份任务时,自动删除当前计划任务中不再使用的
::备份任务程序,并删除对应的注册表键值,以减少系统垃圾;更改了备份任务程
::序的保存位置;去除了盘符小写转换为大写的鸡肋代码;增强了路径输入为空时
::的检测(感谢willsort提供代码);修改了几处错误;精简了部分代码,此为V1.8;
::06.5.31
::在注册表中(位置是:HKEY_LOCAL_MACHINESoftwareMicrosoftWindows
::CurrentVersionRun)增添了开机自动运行备份程序的键值(以备份任务名称作
::为键值),尽可能减少错过备份的情况;如果更新了内容,则备份完毕后自动打
::开备份日志;修正了几处错误;此为V1.7;
::06.5.30
::完善了备份流程,在列出创建备份任务的清单时,可更改备份任务内容;在
::创建备份任务的同时,强制启动计划任务服务,并立即作复制操作;显示各磁盘
::分区剩余空间情况的时候,增加了显示磁盘卷标名的功能;更改了注意事项界面
::中的前景色和背景色,使色调显得明快而柔和;
::06.5.28
::增加了在每周的指定日期进行备份的功能;添加了当计划任务出错时提交报
::告的功能;完善了日志记录功能,只有当文件更新时才会改写日志;完善了注意
::事项中的内容;增加了删除所有计划任务的功能;此为V1.6;
::06.5.26
::增加了不允许把保存路径设置为与源文件路径相同、或者为源文件某一目录
::的功能;添加了注意事项提示功能;修正了几处错误;部分代码参照中国DOS联
::盟论坛(http://www.cn-dos.net/forum)网友bagpipe所发帖子,使一些代码得
::到精简;此为V1.5;
::06.5.25
::增加了把备份文件的保存目录拖曳到窗口执行的功能;增加了批量停止指定
::备份任务的功能;修改了几处错误;精简了部分代码;此为V1.4;
::06.5.24
::增加了把要备份的文件拖曳到窗口执行的功能;感谢中国DOS联盟论坛
::(http://www.cn-dos.net/forum)版主willsort提供代码;此为V1.3;
::06.5.23
::修正了一处关键错误,使得备份能顺利进行下去;在中国DOS联盟论坛
::(http://www.cn-dos.net/forum)版主willsort等网友的热心帮助下,增强了程
::序输入错误检测能力,并修正了一些拼写错误,在此深表谢意;
::06.5.22
::修改了显示各分区剩余空间的代码,使显示界面的框线自动适应剩余空间条
::目下不同长度的字符;
::06.5.21
::增添了停止指定备份任务的功能,使本程序的功能进一步完善;增添了将备
::份后的文件设置为"系统+只读"属性的功能,从而在一定程度上提高了备份后
::的文件的安全;修正了几处错误;优化了部分代码;此为V1.2;
::06.5.20
::头两天的算法存在备份不完全的弊端,今天把copy命令更改为xcopy命令,
::从而使本程序能够备份指定目录下除空目录之外的所有文件(包括目录之下还有
::子目录、子目录内含有文件的文件嵌套),并使代码得到了精简;头两天的代码
::生成备份任务批处理的时候,因为自动命名的程序名称是固定的,如果有不同的
::备份任务的话,最后一次任务将把上一次的任务删除,今天把备份任务的命名改
::为手动指定;增添了多次添加备份任务的功能;此为V1.1;
::06.5.19
::增加了系统检测功能,使得该程序只能运行于XP操作系统下;编写输入错误
::检测代码,使输入错误能得到及时更改;统一了交互界面,看上去更加美观;本
::来想增加指定每周的某几天进行备份操作的功能,但是一直未能实现,只好暂时
::放弃,留待下几个版本解决;优化了部分冗余代码;
::06.5.18
::在对本人电脑上重要资料进行备份的时候,深感手工备份的烦琐,而网上的
::备份软件又有诸多限制,正好本人在自学DOS批处理编程,于是花了半天的时间
::来构思本程序的核心功能,编写初步代码;此为V1.0;
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
remifnot"%1"=="$"%comspec%/f:on/c%0$&&goto:eof
::屏蔽掉上一句,用TabShift+Tab可实现同样功能
modeconlines=26
title文件备份器-文件备份器
color1f
cls
rem=========检测系统是否支持本程序=============
:check_system
ver|find"XP">nul||gotosystem_error
rem=========检测当前用户是否具有管理员权限=============
:check_popedom
netusers%username%|findstr/i"*administrator">nul||gotopopedom_error
call:del_nouse
rem=======输入要备份文件的路径并检测输入是否正确=======
:input_source
modeconlines=26
cls
color1f
title文件备份器-请输入源文件路径
echo╭────────╮
echo╭─────────┤选择要备份的文件├─────────╮
echo│╰────────╯│
echo││
echo│本程序能把指定文件在指定时间内备份到指定位│
echo││
echo│置。请把要备份的文件(或文件夹)拖曳至本窗口(推荐│
echo││
echo│做法),或者手工输入需要备份文件的绝对路径或相对│
echo││
echo│路径(请勿输入非法符号),然后回车确认。│
echo││
echo│自动完成文件名请按TabShift+Tab,可多次选择。│
echo││
echo│为了不错误删除数据,使用本软件前请查看注意│
echo││
echo│事项!切记切记!(恢复文件请按R)│
echo││
echo╰────────────────────────────╯
echo.
echo查看注意事项请按1退出请按0
echo──────────────────────────────
echo查看已存在的备份任务请按2
echo.
setsource=:
set/psource=请输入要备份文件的路径:
set"source=%source:"=%"
::上面这句为判断%source%中是否存在引号,有则剔除。
if"%source%"==":"gotoinput_source
if"%source%"=="0"exit
if"%source%"=="1"gotonotice
if"%source%"=="2"gotobackup_task
if/i"%source%"=="r"gotorevert
ifnotexist"%source%"gotosource_noexist
for%%iin("%source%")doif"%%~fi"=="%%~di"gotoforbid_to_backup
::判断要备份的是文件还是文件夹,为以后的操作设置标志
pushd"%source%">nul2>nul&&(popd&setfolder=yes)||(setfolder=)
gotoinput_destination
:backup_task
cls
color1f
title文件备份器-已存在的备份任务
echo.
at
echo-------------------------------------------------------------------------------
echo.
echo╔══════════════════════════════╗
echo║如果要停止某个备份任务,请输入该任务的ID号,然后按回车即可║
echo║║
echo║多个ID号之间用空格分隔,停止所有计划任务请按A║
echo║║
echo║退出请按0,返回上一步请按除0、A和ID数字之外的任意键║
echo╚══════════════════════════════╝
echo.
setID=
set/pID=请输入不再需要的备份任务的ID:
if"%ID%"=="0"exit
if/i"%ID%"=="a"at/delete/yes&&(call:del_nouse&&gotobackup_task)
::以下语句的作用是:如果停止了某项备份任务,则检查硬盘上由本程序生成的bat文件中,
::不在at任务列表中的有哪些;如果有,则删除该bat,同时删除注册表中对应的字符串值;
::如果没有,则不作任何删除操作;
(for%%iin(%ID%)doat%%i/del/yes>nul2>nul)&&(
call:del_nouse
gotobackup_task
)||gotoinput_source
rem=======输入文件保存路径并检测输入是否正确=======
:input_destination
cls
color1f
title文件备份器-请输入目标文件路径
echo.
echo.
echo╭────────╮
echo╭─────────┤选择保存位置├─────────╮
echo│╰────────╯│
echo│操作说明:│
echo││
echo│请输入保存位置的绝对路径或者相对路径│
echo││
echo│(注意:必须在半角状态下输入冒号和反斜杠;│
echo││
echo│请勿输入非法的路径名符号),或者把一个已│
echo││
echo│存在的文件夹拖曳至本窗口,然后回车确认。│
echo││
echo│╭────────────────╮│
echo╰─────┤查看各磁盘分区剩余空间请按9├─────╯
echo╰────────────────╯
echo.
echo返回上一步请按1退出请按0
echo──────────────────────────────
echo.
setdestination=:
set/pdestination=请输入备份文件的保存路径:
set"destination=%destination:"=%"
::上面这句为判断%destination%中是否存在引号,有则剔除
if"%destination%"==":"gotoinput_destination
if"%destination%"=="0"exit
if"%destination%"=="1"gotoinput_source
if"%destination%"=="9"gotofreesize
::下面一句针对文件或文件夹取保存位置的文件名
for/d%%iin("%source%.*")dosetdestination=%destination%%%~nxi
for%%iin("%destination%")dosetdestination=%%~fi
setsubarea=%destination:~0,1%
for%%iin("%destination%")doif"%%~fi"=="%%~di"gotoforbid_to_build_1
echo"%destination%"|findstr/i/c:"%source%"&&gotoforbid_to_build_2
ifnotexist%subarea%:nulgotosubarea_noexist
::下面一句取日志名为要备份文件(夹)的文件名
for%%iin("%source%")dosetname_log=%%~ni
ifexist"%destination%%name_log%_log.log"gotowhether_add
ifexist"%destination%"gotowhether_over
:over_write
attrib/s/d-s-h-r"%destination%*.*">nul2>nul
rd/q/s"%destination%">nul2>nul
md"%destination%">nul2>nul
(echo.
echo备份日志)>"%destination%%name_log%_log.log"
attrib/s/d+s+r"%destination%*.*">nul2>nul
:input_date
cls
color1f
title文件备份器-请输备份入日期
echo╭────────╮
echo╭─────────┤请输入备份日期├─────────╮
echo│╰────────╯│
echo││
echo│1.若在每月的某几天备份,请输入从1到31的任意│
echo││
echo│数字,比如1,3,4;若只在每月1号备份,请输入"1,";│
echo││
echo│2.若在每周的某几天备份,请输入星期几的代码│
echo││
echo│(M,T,W,Th,F,S,Su);如果指定日期较多,在查看任务│
echo││
echo│列表的时候,日期一栏将用省略号显示;│
echo││
echo│3.数字与字母不可混用;数字行或字母行首尾均无│
echo││
echo│任何符号,其间用逗号分隔;请严格按照本格式填写!│
echo││
echo╰────────────────────────────╯
echo.
echo返回上一步请按1退出请按0
echo──────────────────────────────
echo每天都备份请按A
echo.
setcopydate=
set/pcopydate=请输入备份日期:
if"%copydate%"==""gotoinput_date
if"%copydate%"==","gotoinput_date
if"%copydate%"=="0"exit
if"%copydate%"=="1"gotoinput_destination
if"%copydate%"=="1,"gotoinput_time
if/i"%copydate%"=="a"gotoall_date
::检查日期输入是否正确
setnum=0
setchar=%copydate%
for/f"tokens=1delims=,"%%iin("%char%")do(
echo"%%i"|findstr/i"MTWThFSSu">nul&&gotocheck_alphabetical_date||gotocheck_numerical_date
)
:check_alphabetical_date
call:check_alp
:loop_alp
setchar=%char:*,=%
:check_alp
for/f"tokens=1delims=,"%%iin("%char%")do(
echo"MTWThFSSu"|findstr/i"%%i">nul||gotodate_error
echo"%char%"|find",">nul&&gotoloop_alp
)
gotoinput_time
:check_numerical_date
call:check_num
:loop_num
set/anum+=1
setchar=%char:*,=%
:check_num
for/f"tokens=1delims=,"%%iin("%char%")dosetinput=%%i
if%input%GTR31gotodate_error
if%num%GTR30gotodate_error
echo%char%|find",">nul||if%num%LEQ30gotoinput_time||gotodate_error
gotoloop_num
:input_time
cls
color1f
title文件备份器-请输入时间
echo.
echo╭────────╮
echo╭─────────┤请输入备份时间├─────────╮
echo│╰────────╯│
echo│操作说明:│
echo││
echo│请按格式输入备份时间,多个时间用空格│
echo││
echo│分隔。该时间用24小时制(既从00:00到23:59)│
echo││
echo│的小时:分钟格式表示。│
echo││
echo│例如:想分别在上午8点30分和下午4点进│
echo││
echo│行备份,请在同一行输入8:3016:00(注意:两│
echo││
echo│个时间点之间有一个空格)│
echo││
echo╰────────────────────────────╯
echo.
echo返回上一步请按1退出请按0
echo──────────────────────────────
echo.
setcopytime=
set/pcopytime=请输入备份时间:
if"%copytime%"==""gotoinput_time
if"%copytime%"=="0"exit
if"%copytime%"=="1"gotoinput_date
::检查时间输入是否正确
for/f"tokens=*"%%iin("%copytime%")dosetchar=%%i
call:check_time
setnum=0
:back
set/anum+=1
setchar=%char:*=%
:check_time
for/f"tokens=1,2delims=:"%%iin("%char%")do(
if%%iGTR24gototime_error
if%%jGTR60gototime_error
echo%char%|find"">nul||gotoinput_name
)
gotoback
rem=======输入备份任务名称=======
:input_name
cls
color1f
title文件备份器-备份任务名称
echo.
echo╭────────╮
echo╭─────────┤备份任务名称├─────────╮
echo│╰────────╯│
echo│操作说明:│
echo││
echo│请输入备份任务的名称,然后回车确认。│
echo││
echo│本程序将在"系统安装盘:ProgramFiles备份│
echo││
echo│任务程序"下生成"备份任务名称_backup.bat"│
echo││
echo│和"备份任务名称_revert.bat"这一对备份及恢│
echo││
echo│复批处理。如需更改此备份任务的部分功能,│
echo││
echo│请用文本编辑工具对批处理文件进行编辑。│
echo││
echo╰────────────────────────────╯
echo.
echo返回上一步请按1退出请按0
echo──────────────────────────────
echo.
echo.
setname=
set/pname=请输入备份任务的名称:
if"%name%"==""gotoinput_name
if"%name%"=="0"exit
if"%name%"=="1"gotoinput_time
ifexist"%ProgramFiles%备份任务程序%name%_backup.bat"gotoname_exist
call:list
echo╔══════════════════════════════╗
echo║退出请按0,返回上一步请按1,放弃并开始新的备份请按B║
echo║║
echo║继续下一步请按除0、1和B之外的任意键║
echo╚══════════════════════════════╝
echo.
setchoice=
set/pchoice=请选择操作代码(0/1/B/其他键):
if"%choice%"=="0"exit
if"%choice%"=="1"gotoinput_name
if/i"%choice%"=="b"(
attrib/s/d-s-h-r"%destination%*.*">nul2>nul
rd/q/s"%destination%">nul2>nul
gotoinput_source
)
gotobuild_backup
:notice
cls
modeconlines=40
color8e
title文件备份器-注意事项
echo.
echo.
echo╔══════════════════════════════════╗
echo║║
echo║1.当程序提示某路径已存在时,强烈建议在作出覆盖操作前先查║
echo║║
echo║看该目录下的内容,以免程序错误删除该目录下的所有内容,给您带║
echo║║
echo║灾难性的损失。备份有风险,操作请谨慎!║
echo║║
echo║2.路径名中,除了允许冒号和反斜杠符号紧跟盘符之外,其他位║
echo║║
echo║置不能再含有半角状态下的以下11个符号,分别为:、/、:、*、?、║
echo║║
echo║"、<、>、(、)、|。输入其中任意一个符号,都会引起无法预料的错║
echo║║
echo║误;在本程序中,文件名的命名也应遵守以上规定!║
echo║║
echo║3.如果只输入"盘符+冒号"格式的路径,程序会把路径当作指定║
echo║║
echo║盘的当前路径来处理,而不是指定盘的根目录。比如:假设系统安装║
echo║║
echo║在C盘,在路径中只输入C:,则并不会认为是C盘根目录,而是C盘的║
echo║║
echo║当前路径,默认为"C:ducumentsandsettings当前用户名";║
echo║║
echo║4.如果输入的路径不带盘符,则作为相对路径处理;║
echo║║
echo║5.本程序工作原理为:通过比较备份后文件与源文件的时间早晚║
echo║║
echo║来决定是否进行复制操作,因此,任何改动备份后文件修改时间的操║
echo║║
echo║作都会使程序不能及时更新源文件改动过的数据,请勿对备份后的文件║
echo║║
echo║进行改名、添加或删除子文件等操作!║
echo║║
echo╚══════════════════════════════════╝
echo.
echo按任意键返回上一步...
pause>nul
gotoinput_source
:whether_over
cls
color0c
title文件备份器-路径已存在
echo.
echo.
echo.
echo.
echo.
echo________________________________________________________________________________
echo.
echo您输入的路径"%destination%"已经存在,覆盖还是追加?
echo.
echo________________________________________________________________________________
echo.
echo╔══════════════════════════════════╗
echo║按O覆盖,按A追加,按V查看保存目录,按1返回上一步,按0退出║
echo╚══════════════════════════════════╝
echo.
echo.
setchoice=
set/pchoice=请选择(O/A/V/0/1):
if/i"%choice%"=="o"cls&&gotoover_write
if/i"%choice%"=="a"gotoinput_date
if/i"%choice%"=="v"call:view_directory&&gotowhether_over
if"%choice%"=="0"exit
if"%choice%"=="1"gotoinput_destination
gotowhether_over
:whether_add
cls
color0c
title文件备份器-路径已存在
echo.
echo.
echo.
echo.
echo.
echo________________________________________________________________________________
echo.
echo"%destination%"下似乎已经存在以前的备份,覆盖还是追加?
echo.
echo________________________________________________________________________________
echo.
echo╔═══════════════════════════════════╗
echo║按V查看保存目录,按O覆盖,按A追加,按1返回上一步,按0退出║
echo╚═══════════════════════════════════╝
echo.
echo.
setchoice=
set/pchoice=请选择(V/O/A/0/1):
if/i"%choice%"=="o"gotoover_write
if/i"%choice%"=="a"cls&&gotoinput_date
if/i"%choice%"=="v"call:view_directory&&gotowhether_add
if"%choice%"=="0"exit
if"%choice%"=="1"gotoinput_destination
gotowhether_add
:freesize
::假设字符串freesize长度范围为0~7(假设硬盘最大999G,换算成以M为单位则是7位数),
::则首先在freesize前补足7个空格,然后直接取字符串的后7个字符,即可得到右对齐排列
::的数字freesize。同理,假设字符串volume的长度范围为0~20(卷标名最长可达32位,但是
::为了兼顾排版的显示,只取后20位)。
cls
color2e
title文件备份器-各分区剩余空间情况
setlocalEnableDelayedExpansion
echo.
echo.
echo╔══════════════════════════════╗
echo║磁盘分区磁盘卷标名剩余空间(MB)║
echo║_____________________________________________________║
for%%din(CDEFGHIJKLMNOPQRSTUVWXYZ)do(
ifexist%%d:nul(
for/f"tokens=3"%%zin('dir/-c%%d:')dosetfreesize=%%z
ifnot"!freesize!"=="0"(
set/afreesize=!freesize:~0,-3!/1049>nul
setfreesize=!freesize!
setfreesize=!freesize:~-7!
for/f"tokens=3*"%%vin('vol%%d:')dosetvolume=%%w
setvolume=!volume!
setvolume=!volume:~-20!
echo║%%d:!volume!!freesize!║
)
)
)
echo╚══════════════════════════════╝
echo.
echo.
echo.
echo.
echo按任意键返回上一步...
pause>nul
gotoinput_destination
rem========创建备份任务脚本程序,要考虑到生成多个批处理文件的情况=============
:build_backup
call:list
title文件备份器-正在生成备份程序...
ifnotexist"%ProgramFiles%备份任务程序"md"%ProgramFiles%备份任务程序"
setbatch_directory=%ProgramFiles%备份任务程序
attrib/s/d-r-h-s"%batch_directory%*.*">nul2>nul
::因为把所有的批处理内容只用一句>"%batch_directory%%name%_backup.bat"来接收,
::所以其中的括号都要用^来转义
(
echo@echooff
echomodeconcols=35lines=10
echocolor1f
echotitle文件备份器-%name%_backup
echo.
echorem功能说明
echo.
echorem本程序由"文件备份器V2.3"生成CodebyJM2006-10-19QQ:13132002
echo.
echorembuildon%date%%time:~0,-3%by%username%
echo.
echorem原理:比较原始文件和备份文件修改日期的早晚,如果原始文件修改时间晚于备份文件,
echorem则复制原始文件覆盖备份文件;如果时间没差别,则不作任何处理。
echo.
echoifnotexist"%source%"^(
echotitle文件丢失
echocolor0c
echoecho.
echoecho___________________________________
echoecho.
echoecho文件"%source%"
echoecho.
echoecoh不存在,可能已被改名、移动或者删除
echoecho.
echoecho___________________________________
echoping127.1-n5^>nul
echoexit^)
echoifnotexist"%destination%"md"%destination%"
)>"%batch_directory%%name%_backup.bat"
setxcopy_parameter=
if"%folder%"=="yes"(setxcopy_parameter=/e/s)else(gotofile_backup)
(
echoattrib/s/d-s-h-r"%destination%*.*"^>nul2^>nul
echosettimes=
echosetlocalenabledelayedexpansion
echofor/f"delims="%%%%iin^('xcopy/c/d/h/i/g/r%xcopy_parameter%/x/y"%source%""%destination%"'^)do^(
echoif"%%%%i"=="复制了0个文件"^(exit^)else^(
echoifnotdefinedtimescall:head
echoif^^!file_time^^!lss%%%%~tisetfile_time=%%%%~ti^&setfile_route=%%%%~dpnxi
echoifnot"%%%%~ti"==""^(echo%%%%~dpnxi%%%%~ti^>^>"%destination%%name_log%_log.log"
echo^)else^(echo.^&echo%%%%i^)^>^>"%destination%%name_log%_log.log"
echo^)
echoif"%%%%i"=="复制了1个文件"gotoend
echo^)
echo^(
echoecho.
echoecho最后更新的文件是:%%file_route%%,更新操作发生在%%file_time%%。
echo^)^>^>"%destination%%name_log%_log.log"
echo:end
echoattrib/s/d+s+r"%destination%*.*"^>nul2^>nul
echostart"""%destination%%name_log%_log.log"
echogoto:eof
echo.
)>>"%batch_directory%%name%_backup.bat"
call:build_head
gotobuild_revert
:file_backup
(
echoxcopy/c/d/h/i/g/q/x/y"%source%""%destination%"^|findstr/b/e/c:"复制了0个文件"^>nul^&^&goto:eof
echoattrib-s-h-r"%destination%*.*"^>nul2^>nul
echoecho.^>^>"%destination%%name_log%_log.log"
echofor/f"skip=1tokens=1,2"%%%%iin^('dir/a-d/tw"%source%"^^^|find"-"'^)do^(
echoecho^^^<%%date:~0,10%%%%time:~0,8%%备份记录^^^>文件最后一次更新时间:%%%%i%%%%j^>^>"%destination%%name_log%_log.log"
echo^)
echoattrib+s+r"%destination%*.*"^>nul2^>nul
echostart"""%destination%%name_log%_log.log"
)>>"%batch_directory%%name%_backup.bat"
rem========创建文件恢复脚本程序========
:build_revert
::恢复备份后文件(夹)的完整路径
for%%iin("%source%")dosetSourceFileName=%%~nxi
::判断%source%是文件还是文件夹
if"%folder%"=="yes"(setSourceFiles=%destination%)else(setSourceFiles=%destination%%SourceFileName%)
(
echo@echooff
echomodeconlines=25
echocolor1f
echotitle文件备份器-%name%_revert
echo.
echorem功能说明
echo.
echorem本程序由"文件备份器V2.3"生成CodebyJM2006-10-19QQ:13132002
echo.
echorembuildon%date%%time:~0,-3%by%username%
echo.
echorem原理:在创建备份任务时,把源文件的原始属性记录下来。当需要恢复文件时,
echorem则复制备份后的文件覆盖源文件,并去掉覆盖后所有文件的属性,最后
echorem从恢复程序中读出原始属性并重新设置。
echoifnotexist"%destination%"^(
echotitle文件丢失
echocolor0c
echoecho.
echoecho.
echoecho.
echoecho.
echoecho.
echoecho.
echoecho________________________________________________________________________________
echoecho.
echoecho文件"%destination%"不存在,可能已被改名、移动或者删除
echoecho.
echoecho________________________________________________________________________________
echoping127.1-n5^>nul
echoexit^)
echoecho.
echoecho.
echoecho.
echoecho.
echoecho.
echoecho.
echoecho________________________________________________________________________________
echoecho.
echoecho正在把文件从"%destination%"恢复到"%source%",请稍侯...
echoecho.
echoecho________________________________________________________________________________
)>"%batch_directory%%name%_revert.bat"
if"%folder%"=="yes"echoifnotexist"%source%"md"%source%">>"%batch_directory%%name%_revert.bat"
echoattrib/s/d-h-r-s"%source%"^>nul2^>nul>>"%batch_directory%%name%_revert.bat"
if"%folder%"=="yes"(gotofolder_copy)else(gotofile_copy)
:file_copy
for/f"tokens=*"%%iin("%source%")do(setfile_root=%%~dpi)
(
echoxcopy/c/h/q/r%xcopy_parameter%/x/y"%SourceFiles%""%file_root%"^>nul2^>nul
echoattrib-h-r-s"%source%"^>nul2^>nul
)>>"%batch_directory%%name%_revert.bat"
gotoget_attrib
:folder_copy
(
echoxcopy/c/e/h/i/g/q/r/s/x/y"%SourceFiles%""%source%"^>nul2^>nul
echodel/a/f"%source%%name_log%_log.log"^>nul2^>nul
)>>"%batch_directory%%name%_revert.bat"
rem========获取文件(夹)的属性=============
:get_attrib
::根据文件(夹)来取舍dir中的/s参数,以防%suorce%为文件时多列路径
::但是当%source%为文件的时候,dir/a/b"%source%"不会显示绝对路径
if"%folder%"=="yes"(setdir_='dir/a/b/s"%source%"')else(setdir_="%source%")
setlocalenabledelayedexpansion
for/f"tokens=*"%%iin(%dir_%)do(
setvar=%%~ai
setattrib_=
ifnot"!var:~1,1!"=="-"setattrib_=+!var:~1,1!
ifnot"!var:~3,1!"=="-"setattrib_=!attrib_!+!var:~3,1!
ifnot"!var:~4,1!"=="-"setattrib_=!attrib_!+!var:~4,1!
ifnot"!attrib_!"==""echoattrib!attrib_!"%%i">>"%batch_directory%%name%_revert.bat"
)
:add_to_reg
cls
color1f
title文件备份器-开机自运行选项
echo.
echo╭────────╮
echo╭─────────┤开机自运行选项├─────────╮
echo│╰────────╯│
echo│操作说明:│
echo││
echo│本操作即将把备份任务加入到开机自运行│
echo││
echo│选项中。若要取消开机自运行功能,请在"开始│
echo││
echo│运行"中输入"msconfig",打开"系统配置实用│
echo││
echo│程序",在"启动"处取消以备份任务名称命名的│
echo││
echo│启动项目,或者在注册表[HKEY_LOCAL_MACHINE│
echo││
echo│SOFTWAREMicrosoftWindowsCurrentVersion│
echo││
echo│Run]下删除相应的字符串值。│
echo││
echo╰────────────────────────────╯
echo.
echo接受请直接敲回车跳过请按S
echo──────────────────────────────
echo.
setchoice=
set/pchoice=请输入操作代码(S/回车):
if/i"%choice%"=="s"gotorun_at
rem========在注册表中增添自启动项以便开机时自动备份=============
regaddHKLMSOFTWAREMicrosoftWindowsCurrentVersionRun/v%name%/tREG_SZ/d"%batch_directory%%name%_backup.bat"/f>nul2>nul
:run_at
::强制启用计划任务服务
scconfigSchedulestart=AUTO>nul2>nul
scstartSchedule>nul2>nul
rem==========导入at计划任务=========
for%%iin(%copytime%)do(
at%%i/every:%copydate%"%batch_directory%%name%_backup.bat">nul2>nul
)
attrib/s/d-s-r"%destination%*.*">nul2>nul
(
echo.
echo━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
echo.
echo于%date%%time:~0,8%创建了备份任务
echo备份对象:%source%
echo备份文件保存位置:%destination%
echo备份程序位置:%batch_directory%%name%_backup.bat
echo文件恢复程序位置:%batch_directory%%name%_revert.bat
echo.
echo━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
echo.
echo________________________________________________________________________________
)>>"%destination%%name_log%_log.log"
cls
color1f
title文件备份器-备份中……
echo.
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤正在备份文件├─────────╮
echo│╰────────╯│
echo│操作说明:│
echo││
echo│备份时间和文件大小、文件数量成正比,请│
echo││
echo│耐心等待……│
echo││
echo╰────────────────────────────╯
xcopy/c/h/i/g/q/r%xcopy_parameter%/x/y"%source%""%destination%">nul2>nul
attrib/s/d+s+r"%destination%*.*">nul2>nul
::添加当计划任务出错时提交报告的功能
::--------------------------------------------------------------------
::当使用计划任务让系统自动运行一些命令或程序时,如果运行时发生错误,
::在系统的默认设置里,计划任务不会提交错误报告。
::此设置就是让计划任务在出现错误时弹出提示信息。
::要禁用此功能,请删除注册表中SchedulingAgent下的NotifyOnTaskMiss
::--------------------------------------------------------------------
::regaddHKLMSOFTWAREMicrosoftSchedulingAgent/vNotifyOnTaskMiss/tREG_DWORD/d00000001/f>nul2>nul
cls
title备份日志
echo.
echo.
type"%destination%%name_log%_log.log"
echo.
echo.
echo.
echo按任意键继续...
pause>nul
cls
title备份任务列表
echo.
echo.
echo.
echo.
echo.
echo.
echo________________________________________________________________________________
echo.
for%%iin(%copytime%)do(
echo已经添加了每月^(周^)%copydate%日%%i对"%source%"的备份任务
)
echo.
echo________________________________________________________________________________
echo.
echo如要继续添加备份任务,请输入B,其他任意键退出...
echo.
echo.
setagain=
set/pagain=请选择下一步操作代码:
if/i"%again%"=="b"gotoinput_source
exit
rem========删除不再使用的文件或目录=============
:del_nouse
::以下语句的作用是:如果停止了某项备份任务,则检查硬盘上由本程序生成的bat文件中,
::不在at任务列表中的有哪些;如果有,则删除该bat,同时删除注册表中对应的字符串值;
::如果没有,则不作任何删除操作;
::如果由本程序在%ProgramFiles%下创建的目录为空,则删除该目录
attrib-h-r-s"%ProgramFiles%备份任务程序*.bat">nul2>nul
setlocalenabledelayedexpansion
for%%iin("%ProgramFiles%备份任务程序*_backup.bat")do(
setfull_name=%%i
setpart_name=!full_name:~0,-11!
at|find/i"%%i">nul||find/i"CodebyJM""!part_name!*.bat">nul&&(
del/f/q"!part_name!*.bat"
regdeleteHKLMSOFTWAREMicrosoftWindowsCurrentVersionRun/v%%~fi/f>nul2>nul
)
)
for%%iin("%ProgramFiles%备份任务程序*.bat")do(
find/i"CodebyJM""%%i">nul&&attrib+r"%%i"
)
ifnotexist"%ProgramFiles%备份任务程序"goto:eof
dir/a/b"%ProgramFiles%备份任务程序"|findstr.>nul||rd/q"%ProgramFiles%备份任务程序"
goto:eof
::━━━━━━━━━━━━━━━━━以下代码为出错提示━━━━━━━━━━━━━━━━━
:system_error
cls
color0c
title文件备份器-操作系统不支持
echo.
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤操作系统不支持├─────────╮
echo│╰────────╯│
echo││
echo││
echo│非常抱歉,该程序只能在XP环境下运行│
echo││
echo│程序即将退出...│
echo││
echo╰────────────────────────────╯
ping127.1-n4>nul&&goto:eof
:popedom_error
cls
color0c
title文件备份器-权限不足
echo.
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤权限不足├─────────╮
echo│╰────────╯│
echo││
echo││
echo││
echo│非常抱歉,当前用户权限太低,无法运行本程序│
echo││
echo│请换用具备管理员组权限的其他用户帐号来运行│
echo││
echo│按任意键退出...│
echo││
echo╰────────────────────────────╯
pause>nul
goto:eof
:subarea_noexist
cls
color0c
title文件备份器-磁盘"%subarea%"不存在
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤磁盘分区不存在├─────────╮
echo│╰────────╯│
echo││
echo││
echo│盘符为%subarea%的磁盘分区不存在│
echo││
echo│按任意键返回上一步重新选择路径│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_destination
:source_noexist
cls
color0c
title文件备份器-文件不存在
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤文件不存在├─────────╮
echo│╰────────╯│
echo││
echo││
echo│要备份的文件不存在│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_source
:forbid_to_backup
cls
color0c
title文件备份器-禁止备份
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤禁止备份├─────────╮
echo│╰────────╯│
echo││
echo││
echo│本程序不支持全盘备份│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_source
:forbid_to_build_1
cls
color0c
title文件备份器-禁止创建
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤禁止创建├─────────╮
echo│╰────────╯│
echo││
echo││
echo│为了数据的安全,请勿直接备份到根目录下│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_destination
:forbid_to_build_2
cls
color0c
title文件备份器-禁止创建
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤禁止创建├─────────╮
echo│╰────────╯│
echo││
echo│警告:保存位置与要备份文件的位置路径相同│
echo││
echo│或者位于要备份文件的某一目录下│
echo││
echo│为了数据的安全,请重新选择保存位置│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_destination
:destination_input_erro
cls
color0c
title文件备份器-路径输入错误
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤路径输入错误├─────────╮
echo│╰────────╯│
echo││
echo││
echo│您的路径输入有错误│
echo││
echo│请在半角状态输入冒号和反斜杠│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_destination
:date_error
cls
color0c
title文件备份器-日期输入错误
echo.
echo╭────────╮
echo╭─────────┤日期输入错误├─────────╮
echo│╰────────╯│
echo││
echo│您的日期输入有错误│
echo││
echo││
echo│1.日期不能字母和数字混用;│
echo││
echo│2.单个的数字式日期不能大于31,个数不能超过│
echo││
echo│31个;│
echo││
echo│3.字母式的日期只能是M,T,W,Th,F,S,Su中的│
echo││
echo│任意几个,不区分大小写;│
echo││
echo│4.日期之间只能用逗号分隔。│
echo││
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
pause>nul
gotoinput_date
:time_error
cls
color0c
title文件备份器-时间输入错误
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤时间输入错误├─────────╮
echo│╰────────╯│
echo││
echo││
echo│您的时间输入有错误│
echo││
echo│小时数不能大于24,分钟数不能大于60,每个时间点用空格分隔│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_time
:name_exist
cls
color0c
title文件备份器-同名程序%name%_backup.bat已经存在
echo.
echo.
echo.
echo.
echo.
echo╭────────╮
echo╭─────────┤存在同名程序├─────────╮
echo│╰────────╯│
echo││
echo││
echo│"%ProgramFiles%备份任务程序"下已存在同名的批处理程序│
echo││
echo│按任意键返回上一步重新选择│
echo││
echo╰────────────────────────────╯
echo.
pause>nul
gotoinput_name
::━━━━━━━━━━━━━━━━━以下代码为被调用的子过程━━━━━━━━━━━━━━━━━
rem========查看保存位置下的内容以决定追加/覆盖/重新选择等操作========
:view_directory
explorer"%destination%"
goto:eof
rem========简化每天都需要备份时的操作========
:all_date
setcopydate=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
gotoinput_time
goto:eof
rem========从备份文件中恢复文件========
:revert
explorer"%ProgramFiles%备份任务程序"
gotoinput_source
goto:eof
rem========显示备份清单========
:list
cls
color1f
title文件备份器-备份清单
echo.
echo________________________________________________________________________________
echo.
echo备份任务名称:"%name%"
echo.
echo要备份的文件:"%source%"
echo.
echo保存位置:"%destination%"
echo.
echo备份日期:%copydate%
echo.
echo备份时间:%copytime%
echo.
echo________________________________________________________________________________
echo.
goto:eof
rem========日志里的更新列表头========
:build_head
(
echo:head
echosettimes=1
echo^(
echoecho_____________________________________________________________________________________
echoecho.
echoecho*更新列表^^^(%%date:~0,10%%%%time:~0,8%%^^^):
echoecho.
echo^)^>^>"%destination%%name_log%_log.log"
echogoto:eof
)>>"%batch_directory%%name%_backup.bat"
goto:eof