用批处理实现文件备份器V2.3
用批处理实现文件备份器V2.3
发布时间:2016-12-28 来源:查字典编辑
摘要:复制代码代码如下:@echooff:::::::::::::::::::::::::::::::::::::::::::::::::::::...

复制代码 代码如下:

@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

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新DOS/BAT学习
热门DOS/BAT学习
脚本专栏子分类