Board logo

标题: [文本处理] 批处理文件备份器V2.4[2007-4-8] [打印本页]

作者: namejm    时间: 2008-10-12 01:35     标题: 批处理文件备份器V2.4[2007-4-8]

  这是本人在cn-dos发表的第一个成形作品,也是本人投入精力最多、更新时间最长的超长代码。此代码虽历经多次修改,仍难免有不易察觉的疏漏之处,限于本人精力,已难全面排除,各位发现问题请及时跟帖提出。原帖地址:http://www.cn-dos.net/forum/viewthread.php?tid=20747

  在编写这个代码的过程中,得到了cn-dos众多高手的倾力相助,此时回想起那一长串熟悉的ID,总有一种感动涌上心头,他们是:willsort、bagpipe、pengfei、3742668、climbing、无奈何。willsort是cn-dos的开国元老,曾是批处理室等几个版块的版主,本人在编写这个代码的时候,他几乎是手把手地教会了我批处理;他的热情、公正、理智,堪称cn-dos论坛的楷模;他申请离职之时,整个论坛为之黯然;他的离职,也开创了cn-dos论坛管理层升迁流转的新风气;willsort已成为cn-dos的神话,他在论坛里留下的各种言论,深刻地影响着众多的后来者;bagpipe,中文含义为风笛,一个浪漫的ID,善于发掘各种奇妙的批处理语法,大大地简化代码,令人惊叹,目前正在努力成为论坛的"坏人",哀其不幸,怒其不争的言论常散见于各种讨论帖,黑色幽默的方式让人哑然;pengfei,对批处理的狂热,一如我当年的执着,常陪我挑灯夜战,彻夜不眠;3742668,脚本多面手,代码简洁、一题多解是他的拿手好戏;climbing,网络独行侠,他的话语总是在无意之中给人以警醒;无奈何,功力不知深几何,简洁是一贯风格,晦涩是鲜明特征,"无奈人做无奈事,却原是无可奈何",辛酸的话语闪烁着生活的哲理,引发了无数人人的共鸣……还有众多的网友,在我编写这个代码的时候,他们陪伴在我左右,为我摇旗呐喊,为我加油打气。2006~2007年的cn-dos,充满着蓬勃的朝气,热烈的讨论弥漫整个论坛,此时旧事重提,仍然令人心驰神往,只可惜现在很多熟悉的ID已经离开联盟,神龙不见首尾,暗淡于忙碌的QQ上,消失在茫茫的人海中。

  谨以此代码,重温那段激情澎湃的岁月,纪念那些令人心驰神往的日子,追忆那些让我备受感动的ID。
  1. @echo off
  2. ::    文件备份器V2.4(for WinXP only)  Code by JM  Renew on 2007-4-8
  3. ::         Thanks to willsort、bagpipe、pengfei……
  4. ::    出处:http://www.cn-dos.net/forum/viewthread.php?tid=20747
  5. ::
  6. ::  功能:1、自由指定要备份的目录(或文件)、位置、备份时间和任务名称
  7. ::        2、能检测输入是否正确
  8. ::        3、能生成备份日志
  9. ::        4、能多次添加备份任务
  10. ::        5、能批量停止指定的备份任务
  11. ::        6、能自动删除由本程序产生且不再使用的批处理程序和注册表信息
  12. ::
  13. ::  原理:只有当源文件修改时间比目标文件的修改时间新时才更新文件
  14. :: if not "%1"=="$" %comspec% /f:on /c %0 $ && goto :eof
  15. :: 屏蔽掉上一句,用Tab\Shift+Tab可实现同样功能
  16. mode con lines=26
  17. title 文件备份器
  18. color 1f
  19. cls
  20. rem   =========检测系统是否支持本程序=============
  21. :check_system
  22. ver|find "XP">nul || goto system_error
  23. rem   =========检测当前用户是否具有管理员权限=============
  24. :check_popedom
  25. net users %username%|findstr /i "\*administrator ">nul || goto popedom_error
  26. rem    =======输入要备份文件的路径并检测输入是否正确=======
  27. :input_source
  28. mode con lines=26
  29. cls
  30. color 1f
  31. title 文件备份器-请输入源文件路径
  32. echo                               ╭────────╮
  33. echo           ╭─────────┤选择要备份的文件├─────────╮
  34. echo           │                  ╰────────╯                  │
  35. echo           │                                                        │
  36. echo           │         本程序能把指定文件在指定时间内备份到指定位     │
  37. echo           │                                                        │
  38. echo           │    置。请把要备份的文件(或文件夹)拖曳至本窗口(推荐     │
  39. echo           │                                                        │
  40. echo           │    做法),或者手工输入需要备份文件的绝对路径或相对     │
  41. echo           │                                                        │
  42. echo           │    路径(请勿输入非法符号),然后回车确认。              │
  43. echo           │                                                        │
  44. echo           │        自动完成文件名请按Tab\Shift+Tab,可多次选择。   │
  45. echo           │                                                        │
  46. echo           │        为了不错误删除数据,使用本软件前请查看注意      │
  47. echo           │                                                        │
  48. echo           │    事项!切记切记! (查看备份脚本程序请按 V )          │
  49. echo           │                                                        │
  50. echo           ╰────────────────────────────╯
  51. echo.
  52. echo            查看注意事项请按 1                              退出请按 0
  53. echo           ──────────────────────────────
  54. echo                                查看已存在的备份任务请按 2                 
  55. echo.
  56. set source=:
  57. :: 上面这句为后面去除引号做铺垫,冒号绝对不能省略;否则,当输入为空时按下回车会出错。
  58. set /p source=           请输入要备份文件的路径:
  59. set "source=%source:"=%"
  60. :: 上面这句为判断%source%中是否存在引号,有则剔除。
  61. if "%source%"==":" goto input_source
  62. if "%source%"=="0" exit
  63. if "%source%"=="1" goto notice
  64. if "%source%"=="2" goto backup_tasks
  65. if /i "%source%"=="v" goto view_batch
  66. if not exist "%source%" goto source_noexist
  67. for %%i in ("%source%") do if "%%~fi"=="%%~di\" goto forbid_to_backup
  68. :: 判断要备份的是文件还是文件夹,为以后的xcopy操作设置标志
  69. pushd "%source%" 2>nul && (popd & set folder=yes) || (set folder=)
  70. goto input_destination
  71. :backup_tasks
  72. cls
  73. color 1f
  74. title 文件备份器-已存在的备份任务
  75. echo.
  76. at
  77. echo -------------------------------------------------------------------------------
  78. echo.
  79. echo         ╔══════════════════════════════╗
  80. echo         ║ 如果要停止某个备份任务,请输入该任务的ID号,然后按回车即可 ║
  81. echo         ║                                                            ║
  82. echo         ║       多个ID号之间用空格分隔,停止所有计划任务请按 A       ║
  83. echo         ║                                                            ║
  84. echo         ║     退出请按 0 ,返回上一步请按除0、A和ID数字之外的任意键  ║
  85. echo         ╚══════════════════════════════╝
  86. echo.
  87. set ID=
  88. set /p ID=           请输入不再需要的备份任务的ID:
  89. if "%ID%"=="0" exit
  90. if /i "%ID%"=="a" (
  91.     at /del /yes
  92.     call :del_unused
  93.     goto backup_tasks
  94. )
  95. :: 以下语句的作用是:如果停止了某项备份任务,则检查硬盘上由本程序生成的cmd文件中,
  96. :: 不在at任务列表中的有哪些;如果有,则删除该cmd,同时删除注册表中对应的字符串值;
  97. :: 如果没有,则不作任何删除操作;
  98. (for %%i in (%ID%) do at %%i /del /yes 2>nul) && (
  99.     call :del_unused
  100.     goto backup_tasks
  101. ) || goto input_source
  102. rem    =======输入文件保存路径并检测输入是否正确=======
  103. :input_destination
  104. cls
  105. color 1f
  106. title 文件备份器-请输入目标文件路径
  107. echo.
  108. echo.
  109. echo                               ╭────────╮
  110. echo           ╭─────────┤  选择保存位置  ├─────────╮
  111. echo           │                  ╰────────╯                  │
  112. echo           │        操作说明:                                      │
  113. echo           │                                                        │
  114. echo           │            请输入保存位置的绝对路径或者相对路径        │
  115. echo           │                                                        │
  116. echo           │        (注意:必须在半角状态下输入冒号和反斜杠;       │
  117. echo           │                                                        │
  118. echo           │        请勿输入非法的路径名符号),或者把一个已         │
  119. echo           │                                                        │
  120. echo           │        存在的文件夹拖曳至本窗口,然后回车确认。        │
  121. echo           │                                                        │
  122. echo           │          ╭────────────────╮          │
  123. echo           ╰─────┤  查看各磁盘分区剩余空间请按 9  ├─────╯
  124. echo                       ╰────────────────╯
  125. echo.
  126. echo            返回上一步请按 1                                退出请按 0
  127. echo           ──────────────────────────────
  128. echo.
  129. set destination=:
  130. set /p destination=           请输入备份文件的保存路径:
  131. set "destination=%destination:"=%"
  132. :: 上面这句为判断%destination%中是否存在引号,有则剔除
  133. if "%destination%"==":" goto input_destination
  134. if "%destination%"=="0" exit
  135. if "%destination%"=="1" goto input_source
  136. if "%destination%"=="9" goto freesize
  137. :: 取文件夹保存位置完整路径或者文件保存位置的目录名
  138. for /d %%i in ("%source%.*") do set "destination=%destination%\%%~nxi"
  139. for %%i in ("%destination%") do set "destination=%%~fi"
  140. set "subarea=%destination:~0,1%"
  141. for %%i in ("%destination%") do if "%%~fi"=="%%~di\" goto forbid_to_build_1
  142. echo "%destination%" | findstr /i /c:"%source%">nul && goto forbid_to_build_2
  143. if not exist %subarea%:\ goto subarea_noexist
  144. :: 下面一句取日志名为要备份文件(夹)的文件名
  145. for %%i in ("%source%") do set "name_log=%%~ni"
  146. if exist "%destination%\%name_log%_log.log" goto whether_add
  147. if exist "%destination%" goto whether_over
  148. :over_write
  149. rd /q /s "%destination%" 2>nul
  150. md "%destination%" 2>nul
  151. (echo.
  152. echo                                 备份日志)>"%destination%\%name_log%_log.log"
  153. :input_date
  154. cls
  155. color 1f
  156. title 文件备份器-请输备份入日期
  157. echo                               ╭────────╮
  158. echo           ╭─────────┤ 请输入备份日期 ├─────────╮
  159. echo           │                  ╰────────╯                  │
  160. echo           │                                                        │
  161. echo           │        1.若在每月的某几天备份,请输入从1到31的任意     │
  162. echo           │                                                        │
  163. echo           │    数字,比如1,3,4;若只在每月1号备份,请输入"1,";   │
  164. echo           │                                                        │
  165. echo           │        2.若在每周的某几天备份,请输入星期几的代码      │
  166. echo           │                                                        │
  167. echo           │    (M,T,W,Th,F,S,Su);如果指定日期较多,在查看任务     │
  168. echo           │                                                        │
  169. echo           │    列表的时候,日期一栏将用省略号显示;                │
  170. echo           │                                                        │
  171. echo           │        3.数字与字母不可混用;数字行或字母行首尾均无    │
  172. echo           │                                                        │
  173. echo           │    任何符号,其间用逗号分隔;请严格按照本格式填写!    │
  174. echo           │                                                        │
  175. echo           ╰────────────────────────────╯
  176. echo.
  177. echo            返回上一步请按 1                                退出请按 0
  178. echo           ──────────────────────────────
  179. echo                                   每天都备份请按 A
  180. echo.
  181. set copydate=
  182. set /p copydate=          请输入备份日期:
  183. if "%copydate%"=="" goto input_date
  184. if "%copydate%"=="," goto input_date
  185. if "%copydate%"=="0" exit
  186. if "%copydate%"=="1" goto input_destination
  187. if "%copydate%"=="1," goto input_time
  188. if /i "%copydate%"=="a" goto all_date
  189. :: 检查日期输入是否正确
  190. set /a num="%copydate:~0,1%" 2>nul&&(
  191.     goto check_numerical_date) || (
  192.     goto check_alphabetical_date
  193. )
  194. :check_alphabetical_date
  195. for %%i in (%copydate%) do (
  196.     echo "M T W Th F S Su"|findstr /i "%%i">nul || goto date_error
  197. )
  198. goto input_time
  199. :check_numerical_date
  200. for %%i in (%copydate%) do (
  201.     if %%i lss 1 goto date_error
  202.     if %%i gtr 31 goto date_error
  203. )
  204. :input_time
  205. cls
  206. color 1f
  207. title 文件备份器-请输入时间
  208. echo.
  209. echo                               ╭────────╮
  210. echo           ╭─────────┤ 请输入备份时间 ├─────────╮
  211. echo           │                  ╰────────╯                  │
  212. echo           │        操作说明:                                      │
  213. echo           │                                                        │
  214. echo           │            请按格式输入备份时间,多个时间用空格        │
  215. echo           │                                                        │
  216. echo           │        分隔。该时间用24小时制(既从00:00到23:59)        │
  217. echo           │                                                        │
  218. echo           │        的小时:分钟格式表示。                           │
  219. echo           │                                                        │
  220. echo           │            例如:想分别在上午8点30分和下午4点进        │
  221. echo           │                                                        │
  222. echo           │        行备份,请在同一行输入8:30 16:00(注意:两       │
  223. echo           │                                                        │
  224. echo           │        个时间点之间有一个空格)                         │
  225. echo           │                                                        │
  226. echo           ╰────────────────────────────╯
  227. echo.
  228. echo            返回上一步请按 1                                退出请按 0
  229. echo           ──────────────────────────────
  230. echo.
  231. set copytime=
  232. set /p copytime=           请输入备份时间:
  233. if "%copytime%"=="" goto input_time
  234. if "%copytime%"=="0" exit
  235. if "%copytime%"=="1" goto input_date
  236. :: 检查时间输入是否正确
  237. for %%i in (%copytime%) do (
  238.     for /f "tokens=1* delims=:" %%j in (%%i) do (
  239.         if %%j lss 0 goto time_error
  240.         if %%j gtr 23 goto time_error
  241.         if %%k lss 0 goto time_error
  242.         if %%k gtr 59 goto time_error
  243.     )
  244. )
  245. rem    =======输入备份任务名称=======
  246. :input_name
  247. cls
  248. color 1f
  249. title 文件备份器-备份任务名称
  250. echo.
  251. echo                               ╭────────╮
  252. echo           ╭─────────┤  备份任务名称  ├─────────╮
  253. echo           │                  ╰────────╯                  │
  254. echo           │        操作说明:                                      │
  255. echo           │                                                        │
  256. echo           │            请输入备份任务的名称,然后回车确认。        │
  257. echo           │                                                        │
  258. echo           │        本程序将在"系统安装盘:\Program Files\备份       │
  259. echo           │                                                        │
  260. echo           │        任务程序"下生成"备份任务名称_backup.cmd"        │
  261. echo           │                                                        │
  262. echo           │        这一备份批处理脚本程序。如需更改此备份任务      │
  263. echo           │                                                        │
  264. echo           │        的部分功能,请用文本编辑工具对批处理文件        │
  265. echo           │                                                        │
  266. echo           │        进行编辑。                                      │
  267. echo           │                                                        │
  268. echo           ╰────────────────────────────╯
  269. echo.
  270. echo            返回上一步请按 1                                退出请按 0
  271. echo           ──────────────────────────────
  272. echo.&echo.
  273. set name=
  274. set /p name=           请输入备份任务的名称:
  275. if "%name%"=="" goto input_name
  276. if "%name%"=="0" exit
  277. if "%name%"=="1" goto input_time
  278. if exist "%ProgramFiles%\备份任务程序\%name%_backup.cmd" goto name_exist
  279. call :list
  280. echo         ╔══════════════════════════════╗
  281. echo         ║  退出请按 0 ,返回上一步请按 1 ,放弃并开始新的备份请按 B  ║
  282. echo         ║                                                            ║
  283. echo         ║             继续下一步请按除0、1和B之外的任意键            ║
  284. echo         ╚══════════════════════════════╝
  285. echo.
  286. set choice=
  287. set /p choice=       请选择操作代码(0/1/B/其他键):
  288. if "%choice%"=="0" exit
  289. if "%choice%"=="1" goto input_name
  290. if /i "%choice%"=="b" (
  291.     attrib /s /d -s -h -r "%destination%\*.*" 2>nul
  292.     rd /q /s "%destination%" 2>nul
  293.     goto input_source
  294. )
  295. goto build_backup
  296. :notice
  297. cls
  298. mode con lines=40
  299. color 8e
  300. title 文件备份器-注意事项
  301. echo.
  302. echo.
  303. echo     ╔══════════════════════════════════╗
  304. echo     ║                                                                    ║
  305. echo     ║        1. 当程序提示某路径已存在时,强烈建议在作出覆盖操作前先查   ║
  306. echo     ║                                                                    ║
  307. echo     ║    看该目录下的内容,以免程序错误删除该目录下的所有内容,给您带    ║
  308. echo     ║                                                                    ║
  309. echo     ║    灾难性的损失。备份有风险,操作请谨慎!                          ║
  310. echo     ║                                                                    ║
  311. echo     ║        2. 路径名中,除了允许冒号和反斜杠符号紧跟盘符之外,其他位   ║
  312. echo     ║                                                                    ║
  313. echo     ║    置不能再含有半角状态下的以下11个符号,分别为:\、/、:、*、?、   ║
  314. echo     ║                                                                    ║
  315. echo     ║    "、<、>、(、)、|。输入其中任意一个符号,都会引起无法预料的错    ║
  316. echo     ║                                                                    ║
  317. echo     ║    误;在本程序中,文件名的命名也应遵守以上规定!                  ║
  318. echo     ║                                                                    ║
  319. echo     ║        3. 如果只输入"盘符+冒号"格式的路径,程序会把路径当作指定    ║
  320. echo     ║                                                                    ║
  321. echo     ║    盘的当前路径来处理,而不是指定盘的根目录。比如:假设系统安装    ║
  322. echo     ║                                                                    ║
  323. echo     ║    在C盘,在路径中只输入 C: ,则并不会认为是C盘根目录,而是C盘的   ║
  324. echo     ║                                                                    ║
  325. echo     ║    当前路径,默认为"C:\ducuments and settings\当前用户名";        ║
  326. echo     ║                                                                    ║
  327. echo     ║        4. 如果输入的路径不带盘符,则作为相对路径处理;             ║
  328. echo     ║                                                                    ║
  329. echo     ║        5. 本程序工作原理为:通过比较备份后文件与源文件的时间早晚   ║
  330. echo     ║                                                                    ║
  331. echo     ║    来决定是否进行复制操作,因此,任何改动备份后文件修改时间的操    ║
  332. echo     ║                                                                    ║
  333. echo     ║    作都会使程序不能及时更新源文件改动过的数据,请勿对备份后的文件  ║
  334. echo     ║                                                                    ║
  335. echo     ║    进行改名、添加或删除子文件等操作!                              ║
  336. echo     ║                                                                    ║
  337. echo     ╚══════════════════════════════════╝
  338. echo.
  339. echo                                                      按任意键返回上一步...
  340. pause>nul
  341. goto input_source
  342. :whether_over
  343. cls
  344. color 0c
  345. title 文件备份器-路径已存在
  346. echo.
  347. echo.
  348. echo.
  349. echo.
  350. echo.
  351. echo ________________________________________________________________________________
  352. echo.
  353. echo          您输入的路径"%destination%"已经存在,覆盖还是追加?
  354. echo.
  355. echo ________________________________________________________________________________
  356. echo.
  357. echo     ╔══════════════════════════════════╗
  358. echo     ║   按O覆盖,按A追加,按V查看保存目录,按 1 返回上一步,按 0 退出    ║
  359. echo     ╚══════════════════════════════════╝
  360. echo.
  361. echo.
  362. set choice=
  363. set /p choice=                           请选择(O/A/V/0/1):
  364. if /i "%choice%"=="o" cls && goto over_write
  365. if /i "%choice%"=="a" goto input_date
  366. if /i "%choice%"=="v" call :view_directory && goto whether_over
  367. if "%choice%"=="0" exit
  368. if "%choice%"=="1" goto input_destination
  369. goto whether_over
  370. :whether_add
  371. cls
  372. color 0c
  373. title 文件备份器-备份文件已存在
  374. echo.&echo.&echo.&echo.&echo.
  375. echo ________________________________________________________________________________
  376. echo.
  377. echo              "%destination%"
  378. echo.
  379. echo          下似乎已经存在以前的备份文件,覆盖此目录还是追加到此目录?
  380. echo.
  381. echo ________________________________________________________________________________
  382. echo.
  383. echo    ╔═══════════════════════════════════╗
  384. echo    ║  按 V 查看保存目录,按 O 覆盖,按 A 追加,按 1 返回上一步,按 0 退出 ║
  385. echo    ╚═══════════════════════════════════╝
  386. echo.&echo.
  387. set choice=
  388. set /p choice=                           请选择(V/O/A/0/1):
  389. if /i "%choice%"=="o" goto over_write
  390. if /i "%choice%"=="a" cls && goto input_date
  391. if /i "%choice%"=="v" call :view_directory && goto whether_add
  392. if "%choice%"=="0" exit
  393. if "%choice%"=="1" goto input_destination
  394. goto whether_add
  395. :freesize
  396. ::     假设字符串freesize长度范围为0~7(假设硬盘最大999G,换算成以M为单位则是7位数),
  397. ::  则首先在freesize前补足7个空格,然后直接取字符串的后7个字符,即可得到右对齐排列
  398. ::  的数字freesize。同理,假设字符串volume的长度范围为0~20(卷标名最长可达32位,但是
  399. ::  为了兼顾排版的显示,只取后20位)。
  400. ::  主体代码由willsort提供
  401. cls
  402. color 2e
  403. title 文件备份器-各分区剩余空间情况
  404. setlocal EnableDelayedExpansion
  405. echo.&echo.
  406. echo        ╔══════════════════════════════╗
  407. echo        ║        磁盘分区         磁盘卷标名      剩余空间(MB)       ║
  408. echo        ║    _____________________________________________________   ║
  409. for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  410.     if exist %%i:\ (
  411.         for /f "tokens=3" %%j in ('dir /-c %%i:\') do set freesize=%%j
  412.         if not "!freesize!"=="0" (
  413.             set /a freesize=!freesize:~0,-3!/1049
  414.             set freesize=       !freesize!
  415.             set freesize=!freesize:~-7!
  416.             for /f "tokens=3*" %%k in ('vol %%i:') do set volume=%%l
  417.             set volume=                    !volume!
  418.             set volume=!volume:~-20!
  419.             echo        ║           %%i: !volume!     !freesize!              ║
  420.         )
  421.     )
  422. )
  423. endlocal
  424. echo        ╚══════════════════════════════╝
  425. echo.&echo.&echo.&echo.
  426. echo                                                按任意键返回上一步...
  427. pause>nul
  428. goto input_destination
  429. rem  ========创建备份任务脚本程序,要考虑到生成多个批处理文件的情况=============
  430. :build_backup
  431. call :list
  432. title 文件备份器-正在生成备份程序...
  433. md "%ProgramFiles%\备份任务程序" 2>nul
  434. set batch_directory=%ProgramFiles%\备份任务程序
  435. attrib /s /d -r -h -s "%batch_directory%\*.*" 2>nul
  436. :: 因为把所有的批处理内容只用一句 >"%batch_directory%\%name%_backup.cmd" 来接收,
  437. :: 所以其中的括号都要用 ^ 来转义
  438. (
  439. echo @echo off
  440. echo mode con cols=35 lines=10
  441. echo color 1f
  442. echo title 文件备份器-"%name%_backup"
  443. echo ::        本程序由"文件备份器V2.4"生成  Code by JM  Renew on 2007-4-8 QQ:13132002
  444. echo ::                 build on %date% %time:~0,-3% by %username%
  445. echo.
  446. echo ::    原理:比较原始文件和备份文件修改日期的早晚,如果原始文件修改时间晚于备份文件,
  447. echo ::          则复制原始文件覆盖备份文件;如果时间没差别,则不作任何处理。
  448. echo.
  449. echo if not exist "%source%" ^(
  450. echo title 文件丢失
  451. echo color 0c
  452. echo echo.
  453. echo echo ___________________________________
  454. echo echo.
  455. echo echo 文件"%source%"
  456. echo echo.
  457. echo ecoh 不存在,可能已被改名、移动或者删除
  458. echo echo.
  459. echo echo ___________________________________
  460. echo ping -n 5 127.1>nul
  461. echo exit^)
  462. echo md "%destination%" 2^>nul
  463. )>"%batch_directory%\%name%_backup.cmd"
  464. set xcopy_parameter=
  465. if "%folder%"=="yes" (set xcopy_parameter=/e /s) else (goto file_backup)
  466. (
  467. echo set times=
  468. echo setlocal enabledelayedexpansion
  469. echo for /f "delims=" %%%%i in ^('xcopy /c /d /h /i /g /r %xcopy_parameter% /x /y "%source%" "%destination%"'^) do ^(
  470. echo     if "%%%%i"=="复制了 0 个文件" ^(exit^) else ^(
  471. echo         if not defined times call :head
  472. echo         if ^^!file_time^^! lss %%%%~ti set file_time=%%%%~ti^&set file_route=%%%%~dpnxi
  473. echo         if not "%%%%~ti"=="" ^(echo     %%%%~dpnxi    %%%%~ti^>^>"%destination%\%name_log%_log.log"
  474. echo         ^) else ^(echo.^&echo                                                %%%%i^)^>^>"%destination%\%name_log%_log.log"
  475. echo     ^)
  476. echo     if "%%%%i"=="复制了 1 个文件" goto end
  477. echo ^)
  478. echo ^(
  479. echo echo.
  480. echo echo     最后更新的文件是:%%file_route%% ,更新操作发生在 %%file_time%% 。
  481. echo ^)^>^>"%destination%\%name_log%_log.log"
  482. echo :end
  483. echo start "" "%destination%\%name_log%_log.log"
  484. echo goto :eof
  485. echo.
  486. )>>"%batch_directory%\%name%_backup.cmd"
  487. call :build_head
  488. goto add_to_reg
  489. :file_backup
  490. (
  491. echo xcopy /c /d /h /i /g /q /x /y "%source%" "%destination%"^|findstr /b /e /c:"复制了 0 个文件"^>nul^&^&goto :eof
  492. echo echo.^>^>"%destination%\%name_log%_log.log"
  493. echo for /f "skip=1 tokens=1,2" %%%%i in ^('dir /a-d /tw "%source%"^^^|find "-"'^) do ^(
  494. echo     echo ^^^<%%date:~0,10%% %%time:~0,8%% 备份记录^^^> 文件最后一次更新时间:%%%%i %%%%j^>^>"%destination%\%name_log%_log.log"
  495. echo ^)
  496. echo start "" "%destination%\%name_log%_log.log"
  497. )>>"%batch_directory%\%name%_backup.cmd"
  498. :add_to_reg
  499. cls
  500. color 1f
  501. title 文件备份器-开机自运行选项
  502. echo.
  503. echo                               ╭────────╮
  504. echo           ╭─────────┤ 开机自运行选项 ├─────────╮
  505. echo           │                  ╰────────╯                  │
  506. echo           │        操作说明:                                      │
  507. echo           │                                                        │
  508. echo           │            本操作即将把备份任务加入到开机自运行        │
  509. echo           │                                                        │
  510. echo           │        选项中。若要取消开机自运行功能,请在"开始       │
  511. echo           │                                                        │
  512. echo           │        \运行"中输入"msconfig",打开"系统配置实用       │
  513. echo           │                                                        │
  514. echo           │        程序",在"启动"处取消以备份任务名称命名的       │
  515. echo           │                                                        │
  516. echo           │        启动项目,或者在注册表[HKEY_LOCAL_MACHINE\      │
  517. echo           │                                                        │
  518. echo           │        SOFTWARE\Microsoft\Windows\CurrentVersion\      │
  519. echo           │                                                        │
  520. echo           │        Run]下删除相应的字符串值。                      │
  521. echo           │                                                        │
  522. echo           ╰────────────────────────────╯
  523. echo.
  524. echo            接受请直接敲回车                                跳过请按 S
  525. echo           ──────────────────────────────
  526. echo.
  527. set choice=
  528. set /p choice=           请输入操作代码(S/回车):
  529. if /i "%choice%"=="s" goto run_at
  530. rem  ========在注册表中增添自启动项以便开机时自动备份=============
  531. reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "%name%" /t REG_SZ /d "%batch_directory%\%name%_backup.cmd" /f >nul 2>nul
  532. :run_at
  533. :: 强制启用计划任务服务
  534. sc config Schedule start= AUTO >nul 2>nul
  535. sc start Schedule>nul 2>nul
  536. rem  ==========导入at计划任务=========
  537. for %%i in (%copytime%) do (
  538.     at %%i /every:%copydate%  "%batch_directory%\%name%_backup.cmd" 2>nul
  539. )
  540. (
  541. echo.&echo.
  542. echo   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  543. echo.
  544. echo       于%date% %time:~0,8%创建了备份任务
  545. echo       备份对象:"%source%"
  546. echo       备份文件保存位置:"%destination%"
  547. echo       备份程序位置:"%batch_directory%\%name%_backup.cmd"
  548. echo.
  549. echo   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  550. echo.
  551. echo ________________________________________________________________________________
  552. )>>"%destination%\%name_log%_log.log"
  553. cls
  554. color 1f
  555. title 文件备份器-备份中……
  556. echo.&echo.&echo.&echo.&echo.&echo.
  557. echo                               ╭────────╮
  558. echo           ╭─────────┤  正在备份文件  ├─────────╮
  559. echo           │                  ╰────────╯                  │
  560. echo           │        操作说明:                                      │
  561. echo           │                                                        │
  562. echo           │            备份时间和文件大小、文件数量成正比,请      │
  563. echo           │                                                        │
  564. echo           │        耐心等待……                                    │
  565. echo           │                                                        │
  566. echo           ╰────────────────────────────╯
  567. xcopy /c /h /i /g /q /r %xcopy_parameter% /x /y "%source%" "%destination%" 2>nul
  568. ::  添加当计划任务出错时提交报告的功能
  569. :: --------------------------------------------------------------------
  570. :: 当使用计划任务让系统自动运行一些命令或程序时,如果运行时发生错误,
  571. :: 在系统的默认设置里,计划任务不会提交错误报告。
  572. :: 此设置就是让计划任务在出现错误时弹出提示信息。
  573. :: 要禁用此功能,请删除注册表中SchedulingAgent下的 NotifyOnTaskMiss
  574. :: 默认不开通;若要开通,请去掉以下reg语句前的注释符号
  575. :: --------------------------------------------------------------------
  576. :: reg add HKLM\SOFTWARE\Microsoft\SchedulingAgent /v NotifyOnTaskMiss /t REG_DWORD /d 00000001 /f >nul 2>nul
  577. cls
  578. title 备份日志
  579. echo.&echo.
  580. type "%destination%\%name_log%_log.log"
  581. echo.&echo.&echo.
  582. echo                                                        按任意键继续...
  583. pause>nul
  584. cls
  585. title 备份任务列表
  586. echo.&echo.&echo.&echo.&echo.&echo.
  587. echo ________________________________________________________________________________
  588. echo.
  589. for %%i in (%copytime%) do (
  590.     echo          已经添加了每月^(周^) %copydate% 日 %%i 对"%source%"的备份任务
  591. )
  592. echo.
  593. echo ________________________________________________________________________________
  594. echo.
  595. echo                     如要继续添加备份任务,请输入 B ,其他任意键退出...
  596. echo.&echo.
  597. set again=
  598. set /p again=                             请选择下一步操作代码:
  599. if /i "%again%"=="b" goto input_source
  600. exit
  601. rem  ========删除不再使用的文件或目录=============
  602. :del_unused
  603. :: 以下语句的作用是:如果停止了某项备份任务,则检查硬盘上由本程序生成的cmd文件中,
  604. :: 不在at任务列表中的有哪些;如果有,则删除该cmd,同时删除注册表中对应的字符串值;
  605. :: 如果没有,则不作任何删除操作;
  606. :: 如果由本程序在%ProgramFiles%下创建的目录为空,则删除该目录
  607. for %%i in ("%ProgramFiles%\备份任务程序\*_backup.cmd") do (
  608.     at|find /i "%%i">nul || find /i "Code by JM" "%%i">nul && (
  609.         del /a /f /q "%%i"
  610.         reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "%name%" /f >nul 2>nul
  611.     )
  612. )
  613. if not exist "%ProgramFiles%\备份任务程序" goto :eof
  614. rd "%ProgramFiles%\备份任务程序" 2>nul
  615. goto :eof
  616. :: ━━━━━━━━━━━━━━━━━以下代码为出错提示━━━━━━━━━━━━━━━━━
  617. :system_error
  618. cls
  619. color 0c
  620. title 文件备份器-操作系统不支持
  621. echo.&echo.&echo.&echo.&echo.&echo.
  622. echo                               ╭────────╮
  623. echo           ╭─────────┤ 操作系统不支持 ├─────────╮
  624. echo           │                  ╰────────╯                  │
  625. echo           │                                                        │
  626. echo           │                                                        │
  627. echo           │         非常抱歉,该程序只能在XP环境下运行             │
  628. echo           │                                                        │
  629. echo           │                     程序即将退出...                    │
  630. echo           │                                                        │
  631. echo           ╰────────────────────────────╯
  632. ping -n 4 127.1>nul && goto :eof
  633. :popedom_error
  634. cls
  635. color 0c
  636. title 文件备份器-权限不足
  637. echo.&echo.&echo.&echo.&echo.&echo.
  638. echo                               ╭────────╮
  639. echo           ╭─────────┤    权限不足    ├─────────╮
  640. echo           │                  ╰────────╯                  │
  641. echo           │                                                        │
  642. echo           │                                                        │
  643. echo           │                                                        │
  644. echo           │      非常抱歉,当前用户权限太低,无法运行本程序        │
  645. echo           │                                                        │
  646. echo           │      请换用具备管理员组权限的其他用户帐号来运行        │
  647. echo           │                                                        │
  648. echo           │                    按任意键退出...                     │
  649. echo           │                                                        │
  650. echo           ╰────────────────────────────╯
  651. pause>nul
  652. goto :eof
  653. :subarea_noexist
  654. cls
  655. color 0c
  656. title 文件备份器-磁盘 "%subarea%" 不存在
  657. echo.&echo.&echo.&echo.&echo.
  658. echo                               ╭────────╮
  659. echo           ╭─────────┤ 磁盘分区不存在 ├─────────╮
  660. echo           │                  ╰────────╯                  │
  661. echo           │                                                        │
  662. echo           │                                                        │
  663. echo           │                盘符为 %subarea% 的磁盘分区不存在               │
  664. echo           │                                                        │
  665. echo           │             按任意键返回上一步重新选择路径             │
  666. echo           │                                                        │
  667. echo           ╰────────────────────────────╯
  668. echo.
  669. pause>nul
  670. goto input_destination
  671. :source_noexist
  672. cls
  673. color 0c
  674. title 文件备份器-文件不存在
  675. echo.&echo.&echo.&echo.&echo.
  676. echo                               ╭────────╮
  677. echo           ╭─────────┤   文件不存在   ├─────────╮
  678. echo           │                  ╰────────╯                  │
  679. echo           │                                                        │
  680. echo           │                                                        │
  681. echo           │                   要备份的文件不存在                   │
  682. echo           │                                                        │
  683. echo           │               按任意键返回上一步重新选择               │
  684. echo           │                                                        │
  685. echo           ╰────────────────────────────╯
  686. echo.
  687. pause>nul
  688. goto input_source
  689. :forbid_to_backup
  690. cls
  691. color 0c
  692. title 文件备份器-禁止备份
  693. echo.&echo.&echo.&echo.&echo.
  694. echo                               ╭────────╮
  695. echo           ╭─────────┤    禁止备份    ├─────────╮
  696. echo           │                  ╰────────╯                  │
  697. echo           │                                                        │
  698. echo           │                                                        │
  699. echo           │                  本程序不支持全盘备份                  │
  700. echo           │                                                        │
  701. echo           │               按任意键返回上一步重新选择               │
  702. echo           │                                                        │
  703. echo           ╰────────────────────────────╯
  704. echo.
  705. pause>nul
  706. goto input_source
  707. :forbid_to_build_1
  708. cls
  709. color 0c
  710. title 文件备份器-禁止创建
  711. echo.&echo.&echo.&echo.&echo.
  712. echo                               ╭────────╮
  713. echo           ╭─────────┤    禁止创建    ├─────────╮
  714. echo           │                  ╰────────╯                  │
  715. echo           │                                                        │
  716. echo           │                                                        │
  717. echo           │         为了数据的安全,请勿直接备份到根目录下         │
  718. echo           │                                                        │
  719. echo           │               按任意键返回上一步重新选择               │
  720. echo           │                                                        │
  721. echo           ╰────────────────────────────╯
  722. echo.
  723. pause>nul
  724. goto input_destination
  725. :forbid_to_build_2
  726. cls
  727. color 0c
  728. title 文件备份器-禁止创建
  729. echo.&echo.&echo.&echo.&echo.
  730. echo                               ╭────────╮
  731. echo           ╭─────────┤    禁止创建    ├─────────╮
  732. echo           │                  ╰────────╯                  │
  733. echo           │                                                        │
  734. echo           │        警告:保存位置与要备份文件的位置路径相同        │
  735. echo           │                                                        │
  736. echo           │              或者位于要备份文件的某一目录下            │
  737. echo           │                                                        │
  738. echo           │            为了数据的安全,请重新选择保存位置          │
  739. echo           │                                                        │
  740. echo           │               按任意键返回上一步重新选择               │
  741. echo           │                                                        │
  742. echo           ╰────────────────────────────╯
  743. echo.
  744. pause>nul
  745. goto input_destination
  746. :destination_input_erro
  747. cls
  748. color 0c
  749. title 文件备份器-路径输入错误
  750. echo.&echo.&echo.&echo.&echo.
  751. echo                               ╭────────╮
  752. echo           ╭─────────┤  路径输入错误  ├─────────╮
  753. echo           │                  ╰────────╯                  │
  754. echo           │                                                        │
  755. echo           │                                                        │
  756. echo           │                   您的路径输入有错误                   │
  757. echo           │                                                        │
  758. echo           │              请在半角状态输入冒号和反斜杠              │
  759. echo           │                                                        │
  760. echo           │               按任意键返回上一步重新选择               │
  761. echo           │                                                        │
  762. echo           ╰────────────────────────────╯
  763. echo.
  764. pause>nul
  765. goto input_destination
  766. :date_error
  767. cls
  768. color 0c
  769. title 文件备份器-日期输入错误
  770. echo.&echo.
  771. echo                               ╭────────╮
  772. echo           ╭─────────┤  日期输入错误  ├─────────╮
  773. echo           │                  ╰────────╯                  │
  774. echo           │                                                        │
  775. echo           │                   您的日期输入有错误                   │
  776. echo           │                                                        │
  777. echo           │                                                        │
  778. echo           │        1. 日期不能字母和数字混用;                     │
  779. echo           │                                                        │
  780. echo           │        2. 单个的数字式日期不能大于31;                  │
  781. echo           │                                                        │
  782. echo           │        3. 字母式的日期只能是 M,T,W,Th,F,S,Su 中的      │
  783. echo           │                                                        │
  784. echo           │    任意几个,不区分大小写;                            │
  785. echo           │                                                        │
  786. echo           │        4. 日期之间只能用逗号分隔。                     │
  787. echo           │                                                        │
  788. echo           │                                                        │
  789. echo           │               按任意键返回上一步重新选择               │
  790. echo           │                                                        │
  791. echo           ╰────────────────────────────╯
  792. pause>nul
  793. goto input_date
  794. :time_error
  795. cls
  796. color 0c
  797. title 文件备份器-时间输入错误
  798. echo.&echo.&echo.&echo.&echo.
  799. echo                               ╭────────╮
  800. echo           ╭─────────┤  时间输入错误  ├─────────╮
  801. echo           │                  ╰────────╯                  │
  802. echo           │                                                        │
  803. echo           │                                                        │
  804. echo           │                   您的时间输入有错误                   │
  805. echo           │                                                        │
  806. echo           │小时数不能大于23,分钟数不能大于59,每个时间点用空格分隔│
  807. echo           │                                                        │
  808. echo           │               按任意键返回上一步重新选择               │
  809. echo           │                                                        │
  810. echo           ╰────────────────────────────╯
  811. echo.
  812. pause>nul
  813. goto input_time
  814. :name_exist
  815. cls
  816. color 0c
  817. title 文件备份器-同名程序 "%name%_backup.cmd" 已经存在
  818. echo.&echo.&echo.&echo.&echo.
  819. echo                               ╭────────╮
  820. echo           ╭─────────┤  存在同名程序  ├─────────╮
  821. echo           │                  ╰────────╯                  │
  822. echo           │                                                        │
  823. echo           │                                                        │
  824. echo           │ "%ProgramFiles%\备份任务程序"下已存在同名的批处理程序│
  825. echo           │                                                        │
  826. echo           │               按任意键返回上一步重新选择               │
  827. echo           │                                                        │
  828. echo           ╰────────────────────────────╯
  829. echo.
  830. pause>nul
  831. goto input_name
  832. :: ━━━━━━━━━━━━━━━━━以下代码为被调用的子过程━━━━━━━━━━━━━━━━━
  833. rem  ========查看保存位置下的内容以决定 追加/覆盖/重新选择 等操作========
  834. :view_directory
  835. explorer "%destination%"
  836. goto :eof
  837. rem  ========简化每天都需要备份时的操作========
  838. :all_date
  839. set copydate=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
  840. goto input_time
  841. goto :eof
  842. rem  ========查看备份脚本程序========
  843. :view_batch
  844. explorer "%ProgramFiles%\备份任务程序"
  845. goto input_source
  846. goto :eof
  847. rem  ========显示备份清单========
  848. :list
  849. cls
  850. color 1f
  851. title 文件备份器-备份清单
  852. echo.
  853. echo ________________________________________________________________________________
  854. echo.
  855. echo                         备份任务名称:"%name%"
  856. echo.
  857. echo                         要备份的文件:"%source%"
  858. echo.
  859. echo                         保存位置:"%destination%"
  860. echo.
  861. echo                         备份日期: %copydate%
  862. echo.
  863. echo                         备份时间:%copytime%
  864. echo.
  865. echo ________________________________________________________________________________
  866. echo.
  867. goto :eof
  868. rem  ========日志里的更新列表头========
  869. :build_head
  870. (
  871. echo :head
  872. echo set times=1
  873. echo ^(
  874. echo echo _____________________________________________________________________________________
  875. echo echo.
  876. echo echo *更新列表^^^(%%date:~0,10%% %%time:~0,8%%^^^):
  877. echo echo.
  878. echo ^)^>^>"%destination%\%name_log%_log.log"
  879. echo goto :eof
  880. )>>"%batch_directory%\%name%_backup.cmd"
  881. goto :eof
复制代码
  更新历史:
  1. 更新历史:
  2. 07.4.7~8
  3.      搁置了将近半年之久,再次更新代码。此次更新动作较大,主要做了以下改动:
  4.          ① 考虑到恢复原始文件属性的操作有很大风险(比如丢失了属性配置batch
  5.    文件会导致无法恢复文件的原始属性,从而给文件读写带来无尽的麻烦),因此,
  6.    取消了对备份后文件加上"系统+只读"属性的操作;相应地,一并取消了恢复备份
  7.    的脚本程序,使得备份效率大为提升;
  8.      ② 修改了不能正确删除注册表中相关项目的bug;
  9.      ③ 优化了日期及时间的输入检测功能,备份速度有所提高;
  10.      ④ 全面精简了代码;
  11.      ⑤ 把更新历史从代码中分离出来,减少了cmd文件的体积。
  12.      此为V2.4;若功能方面没有什么大的bug,将作为final版推出,不再更新。
  13. 06.11.4
  14.          增加了记录备份文件更新列表的功能,进一步完善日志功能;
  15. 06.10.19
  16.          因at命令只能以管理员权限运行,此次更新增加了用户权限的验证;添加了
  17.      xcopy的/c参数,使得复制出错的时候(尽管出现这种情况的几率非常低),能备份
  18.      尽可能多的文件;精简了部分代码;
  19. 06.9.14
  20.          对提取文件属性的代码做了优化,使得生成备份批处理的效率大大提高,
  21.      感谢pengfei提供代码;修改了几处错误和疏漏;对代码进行分块放置以便日后
  22.      的维护;此为V2.3
  23. 06.9.3
  24.          由于上次精简过度,代码运行会出错,今天修改了一处致命错误,感谢
  25.      pengfei的测试;增加了一些操作提示和出错检测;
  26. 06.8.5
  27.          添加了备份空目录的参数,精简了部分代码;
  28. 06.8.1
  29.          实现了用同一条命令复制文件和文件夹;修正了几处错误;
  30. 06.7.29
  31.          精简了获取属性的代码,感谢willsort提供;
  32. 06.7.28
  33.          完善了对备份后的文件进行恢复的操作,使得恢复操作对文件或者文件夹
  34.      都适用;此为V2.2
  35. 06.7.1
  36.          完善了对日期的检测;
  37. 06.6.29
  38.          增加了恢复文件的功能;对生成后的文件的属性进行了调整;此为V2.1;
  39. 06.6.20
  40.          对显示各分区磁盘剩余空间的代码进行了修改,只显示磁盘的剩余空间,
  41.      而不会画蛇添足地显示光盘剩余空间;
  42. 06.6.15
  43.          增加了日期和时间输入错误检测功能(感谢bagpipe提供代码);
  44. 06.6.12
  45.          修改了查询各分区剩余空间的代码,当磁盘卷标名为中文时也能准确排版。
  46.      感谢willsort作深入分析并提供代码;当备份任务创建后,能自动打开备份后
  47.      的文件夹和创建日志,以便查看备份创建结果;彻底删除无用文件;精简了部
  48.      分代码;
  49. 06.6.10
  50.          修正了一处错误;精简了部分代码;
  51. 06.6.9  
  52.          更改备份日志代码,将使备份日志体积减少近一半;更改了实现文件名自动
  53.      完成这一功能的功能键(感谢electronixtar的提醒),但需要注册表中的特定键
  54.      值为默认设置(有关讨论请参考http://www.cn-dos.net/forum/viewthread.php?
  55.      tid=21091&fpage=1);
  56. 06.6.6
  57.         修改了部分代码,使得当需要每天备份的功能时,避免了烦琐的输入;增加
  58.     了文件名自动完成的功能(感谢willsort提出设想并提供代码);此为V1.9;
  59. 06.6.4  
  60.         增加了如下功能:当保存备份文件时,如果要对文件夹进行追加或者覆盖等
  61.     操作,可先查看该文件夹下的内容再作决定;补充了备份风险提示;
  62. 06.6.3  
  63.         对备份后文件的保存位置这部分代码进行了修改,使得程序能自动适应备份
  64.     对象为文件和文件夹两种情况,使备份后文件夹的目录结构得到保持,感谢
  65.     willsort提供代码;当备份文件即将保存到一个已经存在的目录下时,增加了允
  66.     许追加至该目录的选择;
  67. 06.6.2
  68.         添加和修改了了如下功能:可以选择在开机时是否自动运行备份任务程序;
  69.     开始运行本程序或者停止某项备份任务时,自动删除当前计划任务中不再使用的
  70.     备份任务程序,并删除对应的注册表键值,以减少系统垃圾;更改了备份任务程
  71.     序的保存位置;去除了盘符小写转换为大写的鸡肋代码;增强了路径输入为空时
  72.     的检测(感谢willsort提供代码);修改了几处错误;精简了部分代码,此为V1.8;
  73. 06.5.31   
  74.         在注册表中( 位置是:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\
  75.     CurrentVersion\Run) 增添了开机自动运行备份程序的键值( 以备份任务名称作
  76.     为键值) ,尽可能减少错过备份的情况;如果更新了内容,则备份完毕后自动打
  77.     开备份日志;修正了几处错误;此为V1.7;
  78. 06.5.30   
  79.         完善了备份流程,在列出创建备份任务的清单时,可更改备份任务内容;在
  80.     创建备份任务的同时,强制启动计划任务服务,并立即作复制操作;显示各磁盘
  81.     分区剩余空间情况的时候,增加了显示磁盘卷标名的功能;更改了注意事项界面
  82.     中的前景色和背景色,使色调显得明快而柔和;
  83. 06.5.28   
  84.         增加了在每周的指定日期进行备份的功能;添加了当计划任务出错时提交报
  85.     告的功能;完善了日志记录功能,只有当文件更新时才会改写日志;完善了注意
  86.     事项中的内容;增加了删除所有计划任务的功能;此为 V1.6 ;
  87. 06.5.26   
  88.         增加了不允许把保存路径设置为与源文件路径相同、或者为源文件某一目录
  89.     的功能;添加了注意事项提示功能;修正了几处错误;部分代码参照中国DOS 联
  90.     盟论坛(http://www.cn-dos.net/forum) 网友bagpipe所发帖子,使一些代码得
  91.     到精简;此为V1.5;
  92. 06.5.25   
  93.         增加了把备份文件的保存目录拖曳到窗口执行的功能;增加了批量停止指定
  94.     备份任务的功能;修改了几处错误;精简了部分代码;此为V1.4;
  95. 06.5.24   
  96.         增加了把要备份的文件拖曳到窗口执行的功能;感谢中国DOS 联盟论坛
  97.     (http://www.cn-dos.net/forum)版主willsort提供代码;此为V1.3;
  98. 06.5.23   
  99.         修正了一处关键错误,使得备份能顺利进行下去;在中国DOS 联盟论坛
  100.     (http://www.cn-dos.net/forum)版主willsort等网友的热心帮助下,增强了程
  101.     序输入错误检测能力,并修正了一些拼写错误,在此深表谢意;
  102. 06.5.22   
  103.         修改了显示各分区剩余空间的代码,使显示界面的框线自动适应剩余空间条
  104.     目下不同长度的字符;
  105. 06.5.21   
  106.         增添了停止指定备份任务的功能,使本程序的功能进一步完善;增添了将备
  107.     份后的文件设置为" 系统+ 只读" 属性的功能,从而在一定程度上提高了备份后
  108.     的文件的安全;修正了几处错误;优化了部分代码;此为V1.2;
  109. 06.5.20   
  110.         头两天的算法存在备份不完全的弊端,今天把copy命令更改为xcopy 命令,
  111.     从而使本程序能够备份指定目录下除空目录之外的所有文件( 包括目录之下还有
  112.     子目录、子目录内含有文件的文件嵌套) ,并使代码得到了精简;头两天的代码
  113.     生成备份任务批处理的时候,因为自动命名的程序名称是固定的,如果有不同的
  114.     备份任务的话,最后一次任务将把上一次的任务删除,今天把备份任务的命名改
  115.     为手动指定;增添了多次添加备份任务的功能;此为V1.1;
  116. 06.5.19   
  117.         增加了系统检测功能,使得该程序只能运行于XP操作系统下;编写输入错误
  118.     检测代码,使输入错误能得到及时更改;统一了交互界面,看上去更加美观;本
  119.     来想增加指定每周的某几天进行备份操作的功能,但是一直未能实现,只好暂时
  120.     放弃,留待下几个版本解决;优化了部分冗余代码;
  121. 06.5.18   
  122.         在对本人电脑上重要资料进行备份的时候,深感手工备份的烦琐,而网上的
  123.     备份软件又有诸多限制,正好本人在自学DOS 批处理编程,于是花了半天的时间
  124.     来构思本程序的核心功能,编写初步代码;此为V1.0;
复制代码
  与本程序相关的讨论主要有:

[1]什么情况下该使用变量延迟?
http://www.cn-dos.net/forum/viewthread.php?tid=20733

[2]监视文件操作的批处理该如何编写?        
http://www.cn-dos.net/forum/viewthread.php?tid=20732

[3]如何用固定长度显示长度不一致的字符?
http://www.cn-dos.net/forum/viewthread.php?tid=20734

[4]怎样去掉DOS窗口的下拉条
http://www.cn-dos.net/forum/viewthread.php?tid=20040

[5]at命令中为什么无法显示%username%
http://www.cn-dos.net/forum/viewthread.php?tid=20238

[6][部分已结]如何显示磁盘的剩余空间?
http://www.cn-dos.net/forum/viewthread.php?tid=19738

[7]长文件名如何应用于批处理文件中
http://www.cn-dos.net/forum/viewthread.php?tid=19223

[8][求助]在2K环境下date命令的运行结果
http://www.cn-dos.net/forum/viewthread.php?tid=20043

[9]如何检测文件名带空格的文件夹是否存在
http://www.cn-dos.net/forum/viewthread.php?tid=19836

[10]怎样复制指定内容到指定文件里去
http://www.cn-dos.net/forum/viewthread.php?tid=19855

[11][已结]dir命令查询目录找不到文件是什么原因
http://www.cn-dos.net/forum/viewthread.php?tid=19803
作者: ibm    时间: 2008-11-10 20:32

这帖子看来是没人关注,过了近一个月时间只有我回复了,
我是搜索关于“备份”内容时才找到了这个帖子,但却不是我想要的。

我想要 BAT+RAR 实现的备份,
备份方式可选:完全、差异、增量备份

在 Vista 系统下,没有了 XP 的备份程序,取而代之的是 Vista 新的备份程序。
虽然从资料上看,系统提供的是增量备份,但程序的初次备份会强行选中系统分区,
要知道 Vista 系统太庞大了,这样的备份可不太好,
所以想制作一个BAT的备份程序,在提取具有存档属性的文件路径时,遇到了相当大的挑战。
作者: Batcher    时间: 2008-11-11 12:15     标题: 回复 2楼 的帖子

代码不是你想要的,但思路和方法值得学习和借鉴。
作者: masterxml    时间: 2008-11-21 16:59

啊,精品啊,研究一下,自己也用用。
作者: gs133790    时间: 2008-11-21 18:24

学习学习,感谢楼主。
作者: ciciwenwen    时间: 2008-11-28 17:28

这个。。。有点夸张!!
作者: microfans    时间: 2011-8-9 09:26

真的很经典的一篇帖子,无人关注我觉得很奇怪!但是很感动!
作者: 931805085    时间: 2012-1-19 16:58

这么长,应该是好东西吧,先研究研究
作者: zhou926    时间: 2012-7-27 11:34

好东西,值得研究一下里面包含的知识内容
作者: a3101477    时间: 2012-12-26 16:46

好像没有差异性备份啊
可以再加一个差异性备份+自动ZIP文件吗?
谢谢
作者: starifly    时间: 2013-1-29 23:09

mark一下,明日再研究
作者: 狱渊    时间: 2013-4-29 15:15

谢谢你的分享  支持
作者: lky216    时间: 2013-4-30 13:24

神一样的男人
作者: kakasae    时间: 2013-5-17 21:02

强大!!!!!!!!!
作者: zxsg_521    时间: 2013-6-11 23:54

太牛逼了,感觉很震颤
作者: smileLZG    时间: 2021-4-22 14:39

膜拜膜拜膜拜膜拜膜拜膜拜膜拜




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2