用批处理实现文件备份器V2.3
作者 佚名
来源 批处理
浏览
发布时间 2013-07-09
复制代码 代码如下: @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_MACHINE\Software\Microsoft\Windows\ ::CurrentVersion\Run)增添了开机自动运行备份程序的键值(以备份任务名称作 ::为键值),尽可能减少错过备份的情况;如果更新了内容,则备份完毕后自动打 ::开备份日志;修正了几处错误;此为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%0content&goto:eof ::屏蔽掉上一句,用Tab\Shift+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│自动完成文件名请按Tab\Shift+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│SOFTWARE\Microsoft\Windows\CurrentVersion\│ echo││ echo│Run]下删除相应的字符串值。│ echo││ echo╰────────────────────────────╯ echo. echo接受请直接敲回车跳过请按S echo────────────────────────────── echo. setchoice= set/pchoice=请输入操作代码(S/回车): if/i"%choice%"=="s"gotorun_at rem========在注册表中增添自启动项以便开机时自动备份============= regaddHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run/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 ::-------------------------------------------------------------------- ::regaddHKLM\SOFTWARE\Microsoft\SchedulingAgent/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" regdeleteHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run/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 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Del (erase) 删除指定文件下一篇: 关于批处理中FOR语句的使用说明与学习技巧
关于用批处理实现文件备份器V2.3的所有评论