复制代码 代码如下: @echooff :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::文件备份器V(forWinXPonly)CodebyJMQQ: ::出处 :: ::功能自由指定要备份的目录(或文件)位置备份时间和任务名称 ::能检测输入是否正确 ::能生成备份日志 ::能多次添加备份任务 ::能批量停止指定的备份任务 ::能自动删除由本程序产生且不再使用的批处理程序和注册表信息 ::能从备份文件中恢复文件到源文件中并保持各文件的原始属性不变 :: ::原理只有当源文件修改时间比目标文件的修改时间新时才更新文件 :: ::要修改或完善的地方 :: ::①统一标记是文件还是文件夹 ::②禁止把文件备份到本文件夹及其子文件夹中去 :: ::更新历史 :: :: :: ::增加了记录备份文件更新列表的功能进一步完善日志功能 :: :: :: ::因at命令只能以管理员权限运行此次更新增加了用户权限的验证添加了 ::xcopy的/c参数使得复制出错的时候(尽管出现这种情况的几率非常低)能备份 ::尽可能多的文件精简了部分代码 :: :: :: ::对提取文件属性的代码做了优化使得生成备份批处理的效率大大提高 ::感谢pengfei提供代码修改了几处错误和疏漏对代码进行分块放置以便日后 ::的维护此为V :: :: :: ::由于上次精简过度代码运行会出错今天修改了一处致命错误感谢 ::pengfei的测试增加了一些操作提示和出错检测 :: :: :: ::添加了备份空目录的参数精简了部分代码 :: :: ::实现了用同一条命令复制文件和文件夹修正了几处错误 :: :: ::精简了获取属性的代码感谢willsort提供 :: ::完善了对备份后的文件进行恢复的操作使得恢复操作对文件或者文件夹 ::都适用此为V :: :: ::完善了对日期的检测 :: ::增加了恢复文件的功能对生成后的文件的属性进行了调整此为V; :: ::对显示各分区磁盘剩余空间的代码进行了修改只显示磁盘的剩余空间 ::而不会画蛇添足地显示光盘剩余空间 :: ::增加了日期和时间输入错误检测功能(感谢bagpipe提供代码) :: ::修改了查询各分区剩余空间的代码当磁盘卷标名为中文时也能准确排版 ::感谢willsort作深入分析并提供代码当备份任务创建后能自动打开备份后 ::的文件夹和创建日志以便查看备份创建结果彻底删除无用文件精简了部 ::分代码 :: ::修正了一处错误精简了部分代码 :: ::更改备份日志代码将使备份日志体积减少近一半更改了实现文件名自动 ::完成这一功能的功能键(感谢electronixtar的提醒)但需要注册表中的特定键 ::值为默认设置(有关讨论请参考 ::tid=&fpage=) :: ::修改了部分代码使得当需要每天备份的功能时避免了烦琐的输入增加 ::了文件名自动完成的功能(感谢willsort提出设想并提供代码)此为V :: ::增加了如下功能当保存备份文件时如果要对文件夹进行追加或者覆盖等 ::操作可先查看该文件夹下的内容再作决定补充了备份风险提示 :: ::对备份后文件的保存位置这部分代码进行了修改使得程序能自动适应备份 ::对象为文件和文件夹两种情况使备份后文件夹的目录结构得到保持感谢 ::willsort提供代码当备份文件即将保存到一个已经存在的目录下时增加了允 ::许追加至该目录的选择 :: ::添加和修改了了如下功能可以选择在开机时是否自动运行备份任务程序 ::开始运行本程序或者停止某项备份任务时自动删除当前计划任务中不再使用的 ::备份任务程序并删除对应的注册表键值以减少系统垃圾更改了备份任务程 ::序的保存位置去除了盘符小写转换为大写的鸡肋代码增强了路径输入为空时 ::的检测(感谢willsort提供代码)修改了几处错误精简了部分代码此为V :: ::在注册表中(位置是HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ ::CurrentVersion\Run)增添了开机自动运行备份程序的键值(以备份任务名称作 ::为键值)尽可能减少错过备份的情况如果更新了内容则备份完毕后自动打 ::开备份日志修正了几处错误此为V :: ::完善了备份流程在列出创建备份任务的清单时可更改备份任务内容在 ::创建备份任务的同时强制启动计划任务服务并立即作复制操作显示各磁盘 ::分区剩余空间情况的时候增加了显示磁盘卷标名的功能更改了注意事项界面 ::中的前景色和背景色使色调显得明快而柔和 :: ::增加了在每周的指定日期进行备份的功能添加了当计划任务出错时提交报 ::告的功能完善了日志记录功能只有当文件更新时才会改写日志完善了注意 ::事项中的内容增加了删除所有计划任务的功能此为V :: ::增加了不允许把保存路径设置为与源文件路径相同或者为源文件某一目录 ::的功能添加了注意事项提示功能修正了几处错误部分代码参照中国DOS联 ::盟论坛()网友bagpipe所发帖子使一些代码得 ::到精简此为V :: ::增加了把备份文件的保存目录拖曳到窗口执行的功能增加了批量停止指定 ::备份任务的功能修改了几处错误精简了部分代码此为V :: ::增加了把要备份的文件拖曳到窗口执行的功能感谢中国DOS联盟论坛 ::()版主willsort提供代码此为V :: ::修正了一处关键错误使得备份能顺利进行下去在中国DOS联盟论坛 ::()版主willsort等网友的热心帮助下增强了程 ::序输入错误检测能力并修正了一些拼写错误在此深表谢意 :: ::修改了显示各分区剩余空间的代码使显示界面的框线自动适应剩余空间条 ::目下不同长度的字符 :: ::增添了停止指定备份任务的功能使本程序的功能进一步完善增添了将备 ::份后的文件设置为系统+只读属性的功能从而在一定程度上提高了备份后 ::的文件的安全修正了几处错误优化了部分代码此为V :: ::头两天的算法存在备份不完全的弊端今天把copy命令更改为xcopy命令 ::从而使本程序能够备份指定目录下除空目录之外的所有文件(包括目录之下还有 ::子目录子目录内含有文件的文件嵌套)并使代码得到了精简头两天的代码 ::生成备份任务批处理的时候因为自动命名的程序名称是固定的如果有不同的 ::备份任务的话最后一次任务将把上一次的任务删除今天把备份任务的命名改 ::为手动指定增添了多次添加备份任务的功能此为V :: ::增加了系统检测功能使得该程序只能运行于XP操作系统下编写输入错误 ::检测代码使输入错误能得到及时更改统一了交互界面看上去更加美观本 ::来想增加指定每周的某几天进行备份操作的功能但是一直未能实现只好暂时 ::放弃留待下几个版本解决优化了部分冗余代码 :: ::在对本人电脑上重要资料进行备份的时候深感手工备份的烦琐而网上的 ::备份软件又有诸多限制正好本人在自学DOS批处理编程于是花了半天的时间 ::来构思本程序的核心功能编写初步代码此为V :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: remifnot%==$%comspec%/f:on/c%$&&goto:eof ::屏蔽掉上一句用Tab\Shift+Tab可实现同样功能 modeconlines= title文件备份器文件备份器 colorf cls rem=========检测系统是否支持本程序============= :check_system ver|findXP>nul||gotosystem_error rem=========检测当前用户是否具有管理员权限============= :check_popedom netusers%username%|findstr/i\*administrator>nul||gotopopedom_error call:del_nouse rem=======输入要备份文件的路径并检测输入是否正确======= :input_source modeconlines= cls colorf 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查看注意事项请按退出请按 echo────────────────────────────── echo查看已存在的备份任务请按 echo setsource=: set/psource=请输入要备份文件的路径 setsource=%source:=% ::上面这句为判断%source%中是否存在引号有则剔除 if%source%==:gotoinput_source if%source%==exit if%source%==gotonotice if%source%==gotobackup_task if/i%source%==rgotorevert ifnotexist%source%gotosource_noexist for%%iin(%source%)doif%%~fi==%%~di\gotoforbid_to_backup ::判断要备份的是文件还是文件夹为以后的操作设置标志 pushd%source%>nul>nul&&(popd&setfolder=yes)||(setfolder=) gotoinput_destination :backup_task cls colorf title文件备份器已存在的备份任务 echo at echo echo echo╔══════════════════════════════╗ echo║如果要停止某个备份任务请输入该任务的ID号然后按回车即可║ echo║║ echo║多个ID号之间用空格分隔停止所有计划任务请按A║ echo║║ echo║退出请按返回上一步请按除A和ID数字之外的任意键║ echo╚══════════════════════════════╝ echo setID= set/pID=请输入不再需要的备份任务的ID if%ID%==exit if/i%ID%==aat/delete/yes&&(call:del_nouse&&gotobackup_task) ::以下语句的作用是如果停止了某项备份任务则检查硬盘上由本程序生成的bat文件中 ::不在at任务列表中的有哪些如果有则删除该bat同时删除注册表中对应的字符串值 ::如果没有则不作任何删除操作 (for%%iin(%ID%)doat%%i/del/yes>nul>nul)&&( call:del_nouse gotobackup_task )||gotoinput_source rem=======输入文件保存路径并检测输入是否正确======= :input_destination cls colorf title文件备份器请输入目标文件路径 echo echo echo╭────────╮ echo╭─────────┤选择保存位置├─────────╮ echo│╰────────╯│ echo│操作说明│ echo││ echo│请输入保存位置的绝对路径或者相对路径│ echo││ echo│(注意必须在半角状态下输入冒号和反斜槓│ echo││ echo│请勿输入非法的路径名符号)或者把一个已│ echo││ echo│存在的文件夹拖曳至本窗口然后回车确认│ echo││ echo│╭────────────────╮│ echo╰─────┤查看各磁盘分区剩余空间请按├─────╯ echo╰────────────────╯ echo echo返回上一步请按退出请按 echo────────────────────────────── echo setdestination=: set/pdestination=请输入备份文件的保存路径 setdestination=%destination:=% ::上面这句为判断%destination%中是否存在引号有则剔除 if%destination%==:gotoinput_destination if%destination%==exit if%destination%==gotoinput_source if%destination%==gotofreesize ::下面一句针对文件或文件夹取保存位置的文件名 for/d%%iin(%source%*)dosetdestination=%destination%\%%~nxi for%%iin(%destination%)dosetdestination=%%~fi setsubarea=%destination:~% for%%iin(%destination%)doif%%~fi==%%~di\gotoforbid_to_build_ echo%destination%|findstr/i/c:%source%&&gotoforbid_to_build_ ifnotexist%subarea%:\nulgotosubarea_noexist ::下面一句取日志名为要备份文件(夹)的文件名 for%%iin(%source%)dosetname_log=%%~ni ifexist%destination%\%name_log%_logloggotowhether_add ifexist%destination%gotowhether_over :over_write attrib/s/dshr%destination%\**>nul>nul rd/q/s%destination%>nul>nul md%destination%>nul>nul (echo echo备份日志)>%destination%\%name_log%_loglog attrib/s/d+s+r%destination%\**>nul>nul :input_date cls colorf title文件备份器请输备份入日期 echo╭────────╮ echo╭─────────┤请输入备份日期├─────────╮ echo│╰────────╯│ echo││ echo│若在每月的某几天备份请输入从到的任意│ echo││ echo│数字比如若只在每月号备份请输入│ echo││ echo│若在每周的某几天备份请输入星期几的代码│ echo││ echo│(MTWThFSSu)如果指定日期较多在查看任务│ echo││ echo│列表的时候日期一栏将用省略号显示│ echo││ echo│数字与字母不可混用数字行或字母行首尾均无│ echo││ echo│任何符号其间用逗号分隔请严格按照本格式填写!│ echo││ echo╰────────────────────────────╯ echo echo返回上一步请按退出请按 echo────────────────────────────── echo每天都备份请按A echo setcopydate= set/pcopydate=请输入备份日期 if%copydate%==gotoinput_date if%copydate%==gotoinput_date if%copydate%==exit if%copydate%==gotoinput_destination if%copydate%==gotoinput_time if/i%copydate%==agotoall_date ::检查日期输入是否正确 setnum= setchar=%copydate% for/ftokens=delims=%%iin(%char%)do( echo%%i|findstr/iMTWThFSSu>nul&&gotocheck_alphabetical_date||gotocheck_numerical_date ) :check_alphabetical_date call:check_alp :loop_alp setchar=%char:*=% :check_alp for/ftokens=delims=%%iin(%char%)do( echoMTWThFSSu|findstr/i%%i>nul||gotodate_error echo%char%|find>nul&&gotoloop_alp ) gotoinput_time :check_numerical_date call:check_num :loop_num set/anum+= setchar=%char:*=% :check_num for/ftokens=delims=%%iin(%char%)dosetinput=%%i if%input%GTRgotodate_error if%num%GTRgotodate_error echo%char%|find>nul||if%num%LEQgotoinput_time||gotodate_error gotoloop_num :input_time cls colorf title文件备份器请输入时间 echo echo╭────────╮ echo╭─────────┤请输入备份时间├─────────╮ echo│╰────────╯│ echo│操作说明│ echo││ echo│请按格式输入备份时间多个时间用空格│ echo││ echo│分隔该时间用小时制(既从:到:)│ echo││ echo│的小时:分钟格式表示│ echo││ echo│例如想分别在上午点分和下午点进│ echo││ echo│行备份请在同一行输入::(注意两│ echo││ echo│个时间点之间有一个空格)│ echo││ echo╰────────────────────────────╯ echo echo返回上一步请按退出请按 echo────────────────────────────── echo setcopytime= set/pcopytime=请输入备份时间 if%copytime%==gotoinput_time if%copytime%==exit if%copytime%==gotoinput_date ::检查时间输入是否正确 for/ftokens=*%%iin(%copytime%)dosetchar=%%i call:check_time setnum= :back set/anum+= setchar=%char:*=% :check_time for/ftokens=delims=:%%iin(%char%)do( if%%iGTRgototime_error if%%jGTRgototime_error echo%char%|find>nul||gotoinput_name ) gotoback rem=======输入备份任务名称======= :input_name cls colorf title文件备份器备份任务名称 echo echo╭────────╮ echo╭─────────┤备份任务名称├─────────╮ echo│╰────────╯│ echo│操作说明│ echo││ echo│请输入备份任务的名称然后回车确认│ echo││ echo│本程序将在系统安装盘:\ProgramFiles\备份│ echo││ echo│任务程序下生成备份任务名称_backupbat│ echo││ echo│和备份任务名称_revertbat这一对备份及恢│ echo││ echo│复批处理如需更改此备份任务的部分功能│ echo││ echo│请用文本编辑工具对批处理文件进行编辑│ echo││ echo╰────────────────────────────╯ echo echo返回上一步请按退出请按 echo────────────────────────────── echo echo setname= set/pname=请输入备份任务的名称 if%name%==gotoinput_name if%name%==exit if%name%==gotoinput_time ifexist%ProgramFiles%\备份任务程序\%name%_backupbatgotoname_exist call:list echo╔══════════════════════════════╗ echo║退出请按返回上一步请按放弃并开始新的备份请按B║ echo║║ echo║继续下一步请按除和B之外的任意键║ echo╚══════════════════════════════╝ echo setchoice= set/pchoice=请选择操作代码(//B/其他键): if%choice%==exit if%choice%==gotoinput_name if/i%choice%==b( attrib/s/dshr%destination%\**>nul>nul rd/q/s%destination%>nul>nul gotoinput_source ) gotobuild_backup :notice cls modeconlines= colore title文件备份器注意事项 echo echo echo╔══════════════════════════════════╗ echo║║ echo║当程序提示某路径已存在时强烈建议在作出覆盖操作前先查║ echo║║ echo║看该目录下的内容以免程序错误删除该目录下的所有内容给您带║ echo║║ echo║灾难性的损失备份有风险操作请谨慎!║ echo║║ echo║路径名中除了允许冒号和反斜槓符号紧跟盘符之外其他位║ echo║║ echo║置不能再含有半角状态下的以下个符号分别为\/:*?║ echo║║ echo║<>()|输入其中任意一个符号都会引起无法预料的错║ echo║║ echo║误在本程序中文件名的命名也应遵守以上规定!║ echo║║ echo║如果只输入盘符+冒号格式的路径程序会把路径当作指定║ echo║║ echo║盘的当前路径来处理而不是指定盘的根目录比如假设系统安装║ echo║║ echo║在C盘在路径中只输入C:则并不会认为是C盘根目录而是C盘的║ echo║║ echo║当前路径默认为C:\ducumentsandsettings\当前用户名║ echo║║ echo║如果输入的路径不带盘符则作为相对路径处理║ echo║║ echo║本程序工作原理为通过比较备份后文件与源文件的时间早晚║ echo║║ echo║来决定是否进行复制操作因此任何改动备份后文件修改时间的操║ echo║║ echo║作都会使程序不能及时更新源文件改动过的数据请勿对备份后的文件║ echo║║ echo║进行改名添加或删除子文件等操作!║ echo║║ echo╚══════════════════════════════════╝ echo echo按任意键返回上一步 pause>nul gotoinput_source :whether_over cls colorc title文件备份器路径已存在 echo echo echo echo echo echo________________________________________________________________________________ echo echo您输入的路径%destination%已经存在覆盖还是追加? echo echo________________________________________________________________________________ echo echo╔══════════════════════════════════╗ echo║按O覆盖按A追加按V查看保存目录按返回上一步按退出║ echo╚══════════════════════════════════╝ echo echo setchoice= set/pchoice=请选择(O/A/V//): if/i%choice%==ocls&&gotoover_write if/i%choice%==agotoinput_date if/i%choice%==vcall:view_directory&&gotowhether_over if%choice%==exit if%choice%==gotoinput_destination gotowhether_over :whether_add cls colorc title文件备份器路径已存在 echo echo echo echo echo echo________________________________________________________________________________ echo echo%destination%下似乎已经存在以前的备份覆盖还是追加? echo echo________________________________________________________________________________ echo echo╔═══════════════════════════════════╗ echo║按V查看保存目录按O覆盖按A追加按返回上一步按退出║ echo╚═══════════════════════════════════╝ echo echo setchoice= set/pchoice=请选择(V/O/A//): if/i%choice%==ogotoover_write if/i%choice%==acls&&gotoinput_date if/i%choice%==vcall:view_directory&&gotowhether_add if%choice%==exit if%choice%==gotoinput_destination gotowhether_add :freesize ::假设字符串freesize长度范围为~(假设硬盘最大G换算成以M为单位则是位数) ::则首先在freesize前补足个空格然后直接取字符串的后个字符即可得到右对齐排列 ::的数字freesize同理假设字符串volume的长度范围为~(卷标名最长可达位但是 ::为了兼顾排版的显示只取后位) cls colore title文件备份器各分区剩余空间情况 setlocalEnableDelayedExpansion echo echo echo╔══════════════════════════════╗ echo║磁盘分区磁盘卷标名剩余空间(MB)║ echo║_____________________________________________________║ for%%din(CDEFGHIJKLMNOPQRSTUVWXYZ)do( ifexist%%d:\nul( for/ftokens=%%zin(dir/c%%d:\)dosetfreesize=%%z ifnot!freesize!==( set/afreesize=!freesize:~!/>nul setfreesize=!freesize! setfreesize=!freesize:~! for/ftokens=*%%vin(vol%%d:)dosetvolume=%%w setvolume=!volume! setvolume=!volume:~! 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/drhs%batch_directory%\**>nul>nul ::因为把所有的批处理内容只用一句>%batch_directory%\%name%_backupbat来接收 ::所以其中的括号都要用^来转义 ( echo@echooff echomodeconcols=lines= echocolorf echotitle文件备份器%name%_backup echo echorem功能说明 echo echorem本程序由文件备份器V生成CodebyJMQQ: echo echorembuildon%date%%time:~%by%username% echo echorem原理比较原始文件和备份文件修改日期的早晚如果原始文件修改时间晚于备份文件 echorem则复制原始文件覆盖备份文件如果时间没差别则不作任何处理 echo echoifnotexist%source%^( echotitle文件丢失 echocolorc echoecho echoecho___________________________________ echoecho echoecho文件%source% echoecho echoecoh不存在可能已被改名移动或者删除 echoecho echoecho___________________________________ echopingn^>nul echoexit^) echoifnotexist%destination%md%destination% )>%batch_directory%\%name%_backupbat setxcopy_parameter= if%folder%==yes(setxcopy_parameter=/e/s)else(gotofile_backup) ( echoattrib/s/dshr%destination%\**^>nul^>nul echosettimes= echosetlocalenabledelayedexpansion echofor/fdelims=%%%%iin^(xcopy/c/d/h/i/g/r%xcopy_parameter%/x/y%source%%destination%^)do^( echoif%%%%i==复制了个文件^(exit^)else^( echoifnotdefinedtimescall:head echoif^^!file_time^^!lss%%%%~tisetfile_time=%%%%~ti^&setfile_route=%%%%~dpnxi echoifnot%%%%~ti==^(echo%%%%~dpnxi%%%%~ti^>^>%destination%\%name_log%_loglog echo^)else^(echo^&echo%%%%i^)^>^>%destination%\%name_log%_loglog echo^) echoif%%%%i==复制了个文件gotoend echo^) echo^( echoecho echoecho最后更新的文件是%%file_route%%更新操作发生在%%file_time%% echo^)^>^>%destination%\%name_log%_loglog echo:end echoattrib/s/d+s+r%destination%\**^>nul^>nul echostart%destination%\%name_log%_loglog echogoto:eof echo )>>%batch_directory%\%name%_backupbat call:build_head gotobuild_revert :file_backup ( echoxcopy/c/d/h/i/g/q/x/y%source%%destination%^|findstr/b/e/c:复制了个文件^>nul^&^&goto:eof echoattribshr%destination%\**^>nul^>nul echoecho^>^>%destination%\%name_log%_loglog echofor/fskip=tokens=%%%%iin^(dir/ad/tw%source%^^^|find^)do^( echoecho^^^<%%date:~%%%%time:~%%备份记录^^^>文件最后一次更新时间%%%%i%%%%j^>^>%destination%\%name_log%_loglog echo^) echoattrib+s+r%destination%\**^>nul^>nul echostart%destination%\%name_log%_loglog )>>%batch_directory%\%name%_backupbat rem========创建文件恢复脚本程序======== :build_revert ::恢复备份后文件(夹)的完整路径 for%%iin(%source%)dosetSourceFileName=%%~nxi ::判断%source%是文件还是文件夹 if%folder%==yes(setSourceFiles=%destination%)else(setSourceFiles=%destination%\%SourceFileName%) ( echo@echooff echomodeconlines= echocolorf echotitle文件备份器%name%_revert echo echorem功能说明 echo echorem本程序由文件备份器V生成CodebyJMQQ: echo echorembuildon%date%%time:~%by%username% echo echorem原理在创建备份任务时把源文件的原始属性记录下来当需要恢复文件时 echorem则复制备份后的文件覆盖源文件并去掉覆盖后所有文件的属性最后 echorem从恢复程序中读出原始属性并重新设置 echoifnotexist%destination%^( echotitle文件丢失 echocolorc echoecho echoecho echoecho echoecho echoecho echoecho echoecho________________________________________________________________________________ echoecho echoecho文件%destination%不存在可能已被改名移动或者删除 echoecho echoecho________________________________________________________________________________ echopingn^>nul echoexit^) echoecho echoecho echoecho echoecho echoecho echoecho echoecho________________________________________________________________________________ echoecho echoecho正在把文件从%destination%恢复到%source%请稍侯 echoecho echoecho________________________________________________________________________________ )>%batch_directory%\%name%_revertbat if%folder%==yesechoifnotexist%source%md%source%>>%batch_directory%\%name%_revertbat echoattrib/s/dhrs%source%^>nul^>nul>>%batch_directory%\%name%_revertbat if%folder%==yes(gotofolder_copy)else(gotofile_copy) :file_copy for/ftokens=*%%iin(%source%)do(setfile_root=%%~dpi) ( echoxcopy/c/h/q/r%xcopy_parameter%/x/y%SourceFiles%%file_root%^>nul^>nul echoattribhrs%source%^>nul^>nul )>>%batch_directory%\%name%_revertbat gotoget_attrib :folder_copy ( echoxcopy/c/e/h/i/g/q/r/s/x/y%SourceFiles%%source%^>nul^>nul echodel/a/f%source%\%name_log%_loglog^>nul^>nul )>>%batch_directory%\%name%_revertbat 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/ftokens=*%%iin(%dir_%)do( setvar=%%~ai setattrib_= ifnot!var:~!==setattrib_=+!var:~! ifnot!var:~!==setattrib_=!attrib_!+!var:~! ifnot!var:~!==setattrib_=!attrib_!+!var:~! ifnot!attrib_!==echoattrib!attrib_!%%i>>%batch_directory%\%name%_revertbat ) :add_to_reg cls colorf 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%==sgotorun_at rem========在注册表中增添自启动项以便开机时自动备份============= regaddHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run/v%name%/tREG_SZ/d%batch_directory%\%name%_backupbat/f>nul>nul :run_at ::强制启用计划任务服务 scconfigSchedulestart=AUTO>nul>nul scstartSchedule>nul>nul rem==========导入at计划任务========= for%%iin(%copytime%)do( at%%i/every:%copydate%%batch_directory%\%name%_backupbat>nul>nul ) attrib/s/dsr%destination%\**>nul>nul ( echo echo━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ echo echo于%date%%time:~%创建了备份任务 echo备份对象%source% echo备份文件保存位置%destination% echo备份程序位置%batch_directory%\%name%_backupbat echo文件恢复程序位置%batch_directory%\%name%_revertbat echo echo━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ echo echo________________________________________________________________________________ )>>%destination%\%name_log%_loglog cls colorf 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%>nul>nul attrib/s/d+s+r%destination%\**>nul>nul ::添加当计划任务出错时提交报告的功能 :: ::当使用计划任务让系统自动运行一些命令或程序时如果运行时发生错误 ::在系统的默认设置里计划任务不会提交错误报告 ::此设置就是让计划任务在出现错误时弹出提示信息 ::要禁用此功能请删除注册表中SchedulingAgent下的NotifyOnTaskMiss :: ::regaddHKLM\SOFTWARE\Microsoft\SchedulingAgent/vNotifyOnTaskMiss/tREG_DWORD/d/f>nul>nul cls title备份日志 echo echo type%destination%\%name_log%_loglog 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%==bgotoinput_source exit rem========删除不再使用的文件或目录============= :del_nouse ::以下语句的作用是如果停止了某项备份任务则检查硬盘上由本程序生成的bat文件中 ::不在at任务列表中的有哪些如果有则删除该bat同时删除注册表中对应的字符串值 ::如果没有则不作任何删除操作 ::如果由本程序在%ProgramFiles%下创建的目录为空则删除该目录 attribhrs%ProgramFiles%\备份任务程序\*bat>nul>nul setlocalenabledelayedexpansion for%%iin(%ProgramFiles%\备份任务程序\*_backupbat)do( setfull_name=%%i setpart_name=!full_name:~! at|find/i%%i>nul||find/iCodebyJM!part_name!*bat>nul&&( del/f/q!part_name!*bat regdeleteHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run/v%%~fi/f>nul>nul ) ) for%%iin(%ProgramFiles%\备份任务程序\*bat)do( find/iCodebyJM%%i>nul&&attrib+r%%i ) ifnotexist%ProgramFiles%\备份任务程序goto:eof dir/a/b%ProgramFiles%\备份任务程序|findstr>nul||rd/q%ProgramFiles%\备份任务程序 goto:eof ::━━━━━━━━━━━━━━━━━以下代码为出错提示━━━━━━━━━━━━━━━━━ :system_error cls colorc title文件备份器操作系统不支持 echo echo echo echo echo echo echo╭────────╮ echo╭─────────┤操作系统不支持├─────────╮ echo│╰────────╯│ echo││ echo││ echo│非常抱歉该程序只能在XP环境下运行│ echo││ echo│程序即将退出│ echo││ echo╰────────────────────────────╯ pingn>nul&&goto:eof :popedom_error cls colorc 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 colorc 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 colorc 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 colorc title文件备份器禁止备份 echo echo echo echo echo echo╭────────╮ echo╭─────────┤禁止备份├─────────╮ echo│╰────────╯│ echo││ echo││ echo│本程序不支持全盘备份│ echo││ echo│按任意键返回上一步重新选择│ echo││ echo╰────────────────────────────╯ echo pause>nul gotoinput_source :forbid_to_build_ cls colorc title文件备份器禁止创建 echo echo echo echo echo echo╭────────╮ echo╭─────────┤禁止创建├─────────╮ echo│╰────────╯│ echo││ echo││ echo│为了数据的安全请勿直接备份到根目录下│ echo││ echo│按任意键返回上一步重新选择│ echo││ echo╰────────────────────────────╯ echo pause>nul gotoinput_destination :forbid_to_build_ cls colorc 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 colorc 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 colorc title文件备份器日期输入错误 echo echo╭────────╮ echo╭─────────┤日期输入错误├─────────╮ echo│╰────────╯│ echo││ echo│您的日期输入有错误│ echo││ echo││ echo│日期不能字母和数字混用│ echo││ echo│单个的数字式日期不能大于个数不能超过│ echo││ echo│个│ echo││ echo│字母式的日期只能是MTWThFSSu中的│ echo││ echo│任意几个不区分大小写│ echo││ echo│日期之间只能用逗号分隔│ echo││ echo││ echo│按任意键返回上一步重新选择│ echo││ echo╰────────────────────────────╯ pause>nul gotoinput_date :time_error cls colorc title文件备份器时间输入错误 echo echo echo echo echo echo╭────────╮ echo╭─────────┤时间输入错误├─────────╮ echo│╰────────╯│ echo││ echo││ echo│您的时间输入有错误│ echo││ echo│小时数不能大于分钟数不能大于每个时间点用空格分隔│ echo││ echo│按任意键返回上一步重新选择│ echo││ echo╰────────────────────────────╯ echo pause>nul gotoinput_time :name_exist cls colorc title文件备份器同名程序%name%_backupbat已经存在 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= gotoinput_time goto:eof rem========从备份文件中恢复文件======== :revert explorer%ProgramFiles%\备份任务程序 gotoinput_source goto:eof rem========显示备份清单======== :list cls colorf 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= echo^( echoecho_____________________________________________________________________________________ echoecho echoecho*更新列表^^^(%%date:~%%%%time:~%%^^^): echoecho echo^)^>^>%destination%\%name_log%_loglog echogoto:eof )>>%batch_directory%\%name%_backupbat goto:eof |