电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

用批处理实现文件备份器V2.3


发布日期:2023/11/27
 

复制代码 代码如下:

@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

上一篇:批量安装windows补丁的批处理脚本

下一篇:ssh,scp自动登陆的实现方法