标题: [文本处理] 批处理文件备份器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。- @echo off
- :: 文件备份器V2.4(for WinXP only) Code by JM Renew on 2007-4-8
- :: Thanks to willsort、bagpipe、pengfei……
- :: 出处:http://www.cn-dos.net/forum/viewthread.php?tid=20747
- ::
- :: 功能:1、自由指定要备份的目录(或文件)、位置、备份时间和任务名称
- :: 2、能检测输入是否正确
- :: 3、能生成备份日志
- :: 4、能多次添加备份任务
- :: 5、能批量停止指定的备份任务
- :: 6、能自动删除由本程序产生且不再使用的批处理程序和注册表信息
- ::
- :: 原理:只有当源文件修改时间比目标文件的修改时间新时才更新文件
-
- :: if not "%1"=="$" %comspec% /f:on /c %0 $ && goto :eof
- :: 屏蔽掉上一句,用Tab\Shift+Tab可实现同样功能
- mode con lines=26
- title 文件备份器
- color 1f
- cls
-
- rem =========检测系统是否支持本程序=============
- :check_system
- ver|find "XP">nul || goto system_error
-
- rem =========检测当前用户是否具有管理员权限=============
- :check_popedom
- net users %username%|findstr /i "\*administrator ">nul || goto popedom_error
-
- rem =======输入要备份文件的路径并检测输入是否正确=======
- :input_source
- mode con lines=26
- cls
- color 1f
- title 文件备份器-请输入源文件路径
- echo ╭────────╮
- echo ╭─────────┤选择要备份的文件├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ 本程序能把指定文件在指定时间内备份到指定位 │
- echo │ │
- echo │ 置。请把要备份的文件(或文件夹)拖曳至本窗口(推荐 │
- echo │ │
- echo │ 做法),或者手工输入需要备份文件的绝对路径或相对 │
- echo │ │
- echo │ 路径(请勿输入非法符号),然后回车确认。 │
- echo │ │
- echo │ 自动完成文件名请按Tab\Shift+Tab,可多次选择。 │
- echo │ │
- echo │ 为了不错误删除数据,使用本软件前请查看注意 │
- echo │ │
- echo │ 事项!切记切记! (查看备份脚本程序请按 V ) │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- echo 查看注意事项请按 1 退出请按 0
- echo ──────────────────────────────
- echo 查看已存在的备份任务请按 2
- echo.
- set source=:
- :: 上面这句为后面去除引号做铺垫,冒号绝对不能省略;否则,当输入为空时按下回车会出错。
- set /p source= 请输入要备份文件的路径:
- set "source=%source:"=%"
- :: 上面这句为判断%source%中是否存在引号,有则剔除。
- if "%source%"==":" goto input_source
- if "%source%"=="0" exit
- if "%source%"=="1" goto notice
- if "%source%"=="2" goto backup_tasks
- if /i "%source%"=="v" goto view_batch
- if not exist "%source%" goto source_noexist
- for %%i in ("%source%") do if "%%~fi"=="%%~di\" goto forbid_to_backup
- :: 判断要备份的是文件还是文件夹,为以后的xcopy操作设置标志
- pushd "%source%" 2>nul && (popd & set folder=yes) || (set folder=)
- goto input_destination
-
-
- :backup_tasks
- cls
- color 1f
- title 文件备份器-已存在的备份任务
- echo.
- at
- echo -------------------------------------------------------------------------------
- echo.
- echo ╔══════════════════════════════╗
- echo ║ 如果要停止某个备份任务,请输入该任务的ID号,然后按回车即可 ║
- echo ║ ║
- echo ║ 多个ID号之间用空格分隔,停止所有计划任务请按 A ║
- echo ║ ║
- echo ║ 退出请按 0 ,返回上一步请按除0、A和ID数字之外的任意键 ║
- echo ╚══════════════════════════════╝
- echo.
- set ID=
- set /p ID= 请输入不再需要的备份任务的ID:
- if "%ID%"=="0" exit
- if /i "%ID%"=="a" (
- at /del /yes
- call :del_unused
- goto backup_tasks
- )
- :: 以下语句的作用是:如果停止了某项备份任务,则检查硬盘上由本程序生成的cmd文件中,
- :: 不在at任务列表中的有哪些;如果有,则删除该cmd,同时删除注册表中对应的字符串值;
- :: 如果没有,则不作任何删除操作;
- (for %%i in (%ID%) do at %%i /del /yes 2>nul) && (
- call :del_unused
- goto backup_tasks
- ) || goto input_source
-
- rem =======输入文件保存路径并检测输入是否正确=======
- :input_destination
- cls
- color 1f
- 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.
- set destination=:
- set /p destination= 请输入备份文件的保存路径:
- set "destination=%destination:"=%"
- :: 上面这句为判断%destination%中是否存在引号,有则剔除
- if "%destination%"==":" goto input_destination
- if "%destination%"=="0" exit
- if "%destination%"=="1" goto input_source
- if "%destination%"=="9" goto freesize
- :: 取文件夹保存位置完整路径或者文件保存位置的目录名
- for /d %%i in ("%source%.*") do set "destination=%destination%\%%~nxi"
- for %%i in ("%destination%") do set "destination=%%~fi"
- set "subarea=%destination:~0,1%"
- for %%i in ("%destination%") do if "%%~fi"=="%%~di\" goto forbid_to_build_1
- echo "%destination%" | findstr /i /c:"%source%">nul && goto forbid_to_build_2
- if not exist %subarea%:\ goto subarea_noexist
- :: 下面一句取日志名为要备份文件(夹)的文件名
- for %%i in ("%source%") do set "name_log=%%~ni"
- if exist "%destination%\%name_log%_log.log" goto whether_add
- if exist "%destination%" goto whether_over
-
- :over_write
- rd /q /s "%destination%" 2>nul
- md "%destination%" 2>nul
- (echo.
- echo 备份日志)>"%destination%\%name_log%_log.log"
-
- :input_date
- cls
- color 1f
- 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.
- set copydate=
- set /p copydate= 请输入备份日期:
- if "%copydate%"=="" goto input_date
- if "%copydate%"=="," goto input_date
- if "%copydate%"=="0" exit
- if "%copydate%"=="1" goto input_destination
- if "%copydate%"=="1," goto input_time
- if /i "%copydate%"=="a" goto all_date
- :: 检查日期输入是否正确
- set /a num="%copydate:~0,1%" 2>nul&&(
- goto check_numerical_date) || (
- goto check_alphabetical_date
- )
-
- :check_alphabetical_date
- for %%i in (%copydate%) do (
- echo "M T W Th F S Su"|findstr /i "%%i">nul || goto date_error
- )
- goto input_time
-
- :check_numerical_date
- for %%i in (%copydate%) do (
- if %%i lss 1 goto date_error
- if %%i gtr 31 goto date_error
- )
-
- :input_time
- cls
- color 1f
- 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:30 16:00(注意:两 │
- echo │ │
- echo │ 个时间点之间有一个空格) │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- echo 返回上一步请按 1 退出请按 0
- echo ──────────────────────────────
- echo.
- set copytime=
- set /p copytime= 请输入备份时间:
- if "%copytime%"=="" goto input_time
- if "%copytime%"=="0" exit
- if "%copytime%"=="1" goto input_date
- :: 检查时间输入是否正确
- for %%i in (%copytime%) do (
- for /f "tokens=1* delims=:" %%j in (%%i) do (
- if %%j lss 0 goto time_error
- if %%j gtr 23 goto time_error
- if %%k lss 0 goto time_error
- if %%k gtr 59 goto time_error
- )
- )
-
- rem =======输入备份任务名称=======
- :input_name
- cls
- color 1f
- title 文件备份器-备份任务名称
- echo.
- echo ╭────────╮
- echo ╭─────────┤ 备份任务名称 ├─────────╮
- echo │ ╰────────╯ │
- echo │ 操作说明: │
- echo │ │
- echo │ 请输入备份任务的名称,然后回车确认。 │
- echo │ │
- echo │ 本程序将在"系统安装盘:\Program Files\备份 │
- echo │ │
- echo │ 任务程序"下生成"备份任务名称_backup.cmd" │
- echo │ │
- echo │ 这一备份批处理脚本程序。如需更改此备份任务 │
- echo │ │
- echo │ 的部分功能,请用文本编辑工具对批处理文件 │
- echo │ │
- echo │ 进行编辑。 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- echo 返回上一步请按 1 退出请按 0
- echo ──────────────────────────────
- echo.&echo.
- set name=
- set /p name= 请输入备份任务的名称:
- if "%name%"=="" goto input_name
- if "%name%"=="0" exit
- if "%name%"=="1" goto input_time
- if exist "%ProgramFiles%\备份任务程序\%name%_backup.cmd" goto name_exist
-
- call :list
- echo ╔══════════════════════════════╗
- echo ║ 退出请按 0 ,返回上一步请按 1 ,放弃并开始新的备份请按 B ║
- echo ║ ║
- echo ║ 继续下一步请按除0、1和B之外的任意键 ║
- echo ╚══════════════════════════════╝
- echo.
- set choice=
- set /p choice= 请选择操作代码(0/1/B/其他键):
- if "%choice%"=="0" exit
- if "%choice%"=="1" goto input_name
- if /i "%choice%"=="b" (
- attrib /s /d -s -h -r "%destination%\*.*" 2>nul
- rd /q /s "%destination%" 2>nul
- goto input_source
- )
- goto build_backup
-
- :notice
- cls
- mode con lines=40
- color 8e
- 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:\ducuments and settings\当前用户名"; ║
- echo ║ ║
- echo ║ 4. 如果输入的路径不带盘符,则作为相对路径处理; ║
- echo ║ ║
- echo ║ 5. 本程序工作原理为:通过比较备份后文件与源文件的时间早晚 ║
- echo ║ ║
- echo ║ 来决定是否进行复制操作,因此,任何改动备份后文件修改时间的操 ║
- echo ║ ║
- echo ║ 作都会使程序不能及时更新源文件改动过的数据,请勿对备份后的文件 ║
- echo ║ ║
- echo ║ 进行改名、添加或删除子文件等操作! ║
- echo ║ ║
- echo ╚══════════════════════════════════╝
- echo.
- echo 按任意键返回上一步...
- pause>nul
- goto input_source
-
- :whether_over
- cls
- color 0c
- title 文件备份器-路径已存在
- echo.
- echo.
- echo.
- echo.
- echo.
- echo ________________________________________________________________________________
- echo.
- echo 您输入的路径"%destination%"已经存在,覆盖还是追加?
- echo.
- echo ________________________________________________________________________________
- echo.
- echo ╔══════════════════════════════════╗
- echo ║ 按O覆盖,按A追加,按V查看保存目录,按 1 返回上一步,按 0 退出 ║
- echo ╚══════════════════════════════════╝
- echo.
- echo.
- set choice=
- set /p choice= 请选择(O/A/V/0/1):
- if /i "%choice%"=="o" cls && goto over_write
- if /i "%choice%"=="a" goto input_date
- if /i "%choice%"=="v" call :view_directory && goto whether_over
- if "%choice%"=="0" exit
- if "%choice%"=="1" goto input_destination
- goto whether_over
-
- :whether_add
- cls
- color 0c
- title 文件备份器-备份文件已存在
- echo.&echo.&echo.&echo.&echo.
- echo ________________________________________________________________________________
- echo.
- echo "%destination%"
- echo.
- echo 下似乎已经存在以前的备份文件,覆盖此目录还是追加到此目录?
- echo.
- echo ________________________________________________________________________________
- echo.
- echo ╔═══════════════════════════════════╗
- echo ║ 按 V 查看保存目录,按 O 覆盖,按 A 追加,按 1 返回上一步,按 0 退出 ║
- echo ╚═══════════════════════════════════╝
- echo.&echo.
- set choice=
- set /p choice= 请选择(V/O/A/0/1):
- if /i "%choice%"=="o" goto over_write
- if /i "%choice%"=="a" cls && goto input_date
- if /i "%choice%"=="v" call :view_directory && goto whether_add
- if "%choice%"=="0" exit
- if "%choice%"=="1" goto input_destination
- goto whether_add
-
- :freesize
- :: 假设字符串freesize长度范围为0~7(假设硬盘最大999G,换算成以M为单位则是7位数),
- :: 则首先在freesize前补足7个空格,然后直接取字符串的后7个字符,即可得到右对齐排列
- :: 的数字freesize。同理,假设字符串volume的长度范围为0~20(卷标名最长可达32位,但是
- :: 为了兼顾排版的显示,只取后20位)。
- :: 主体代码由willsort提供
- cls
- color 2e
- title 文件备份器-各分区剩余空间情况
- setlocal EnableDelayedExpansion
- echo.&echo.
- echo ╔══════════════════════════════╗
- echo ║ 磁盘分区 磁盘卷标名 剩余空间(MB) ║
- echo ║ _____________________________________________________ ║
- 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 (
- if exist %%i:\ (
- for /f "tokens=3" %%j in ('dir /-c %%i:\') do set freesize=%%j
- if not "!freesize!"=="0" (
- set /a freesize=!freesize:~0,-3!/1049
- set freesize= !freesize!
- set freesize=!freesize:~-7!
- for /f "tokens=3*" %%k in ('vol %%i:') do set volume=%%l
- set volume= !volume!
- set volume=!volume:~-20!
- echo ║ %%i: !volume! !freesize! ║
- )
- )
- )
- endlocal
- echo ╚══════════════════════════════╝
- echo.&echo.&echo.&echo.
- echo 按任意键返回上一步...
- pause>nul
- goto input_destination
-
- rem ========创建备份任务脚本程序,要考虑到生成多个批处理文件的情况=============
- :build_backup
- call :list
- title 文件备份器-正在生成备份程序...
- md "%ProgramFiles%\备份任务程序" 2>nul
- set batch_directory=%ProgramFiles%\备份任务程序
- attrib /s /d -r -h -s "%batch_directory%\*.*" 2>nul
-
- :: 因为把所有的批处理内容只用一句 >"%batch_directory%\%name%_backup.cmd" 来接收,
- :: 所以其中的括号都要用 ^ 来转义
-
- (
- echo @echo off
- echo mode con cols=35 lines=10
- echo color 1f
- echo title 文件备份器-"%name%_backup"
- echo :: 本程序由"文件备份器V2.4"生成 Code by JM Renew on 2007-4-8 QQ:13132002
- echo :: build on %date% %time:~0,-3% by %username%
- echo.
- echo :: 原理:比较原始文件和备份文件修改日期的早晚,如果原始文件修改时间晚于备份文件,
- echo :: 则复制原始文件覆盖备份文件;如果时间没差别,则不作任何处理。
- echo.
- echo if not exist "%source%" ^(
- echo title 文件丢失
- echo color 0c
- echo echo.
- echo echo ___________________________________
- echo echo.
- echo echo 文件"%source%"
- echo echo.
- echo ecoh 不存在,可能已被改名、移动或者删除
- echo echo.
- echo echo ___________________________________
- echo ping -n 5 127.1>nul
- echo exit^)
- echo md "%destination%" 2^>nul
- )>"%batch_directory%\%name%_backup.cmd"
-
- set xcopy_parameter=
- if "%folder%"=="yes" (set xcopy_parameter=/e /s) else (goto file_backup)
-
- (
- echo set times=
- echo setlocal enabledelayedexpansion
- echo for /f "delims=" %%%%i in ^('xcopy /c /d /h /i /g /r %xcopy_parameter% /x /y "%source%" "%destination%"'^) do ^(
- echo if "%%%%i"=="复制了 0 个文件" ^(exit^) else ^(
- echo if not defined times call :head
- echo if ^^!file_time^^! lss %%%%~ti set file_time=%%%%~ti^&set file_route=%%%%~dpnxi
- echo if not "%%%%~ti"=="" ^(echo %%%%~dpnxi %%%%~ti^>^>"%destination%\%name_log%_log.log"
- echo ^) else ^(echo.^&echo %%%%i^)^>^>"%destination%\%name_log%_log.log"
- echo ^)
- echo if "%%%%i"=="复制了 1 个文件" goto end
- echo ^)
-
- echo ^(
- echo echo.
- echo echo 最后更新的文件是:%%file_route%% ,更新操作发生在 %%file_time%% 。
- echo ^)^>^>"%destination%\%name_log%_log.log"
- echo :end
- echo start "" "%destination%\%name_log%_log.log"
- echo goto :eof
- echo.
- )>>"%batch_directory%\%name%_backup.cmd"
- call :build_head
- goto add_to_reg
-
- :file_backup
- (
- echo xcopy /c /d /h /i /g /q /x /y "%source%" "%destination%"^|findstr /b /e /c:"复制了 0 个文件"^>nul^&^&goto :eof
- echo echo.^>^>"%destination%\%name_log%_log.log"
- echo for /f "skip=1 tokens=1,2" %%%%i in ^('dir /a-d /tw "%source%"^^^|find "-"'^) do ^(
- echo echo ^^^<%%date:~0,10%% %%time:~0,8%% 备份记录^^^> 文件最后一次更新时间:%%%%i %%%%j^>^>"%destination%\%name_log%_log.log"
- echo ^)
- echo start "" "%destination%\%name_log%_log.log"
- )>>"%batch_directory%\%name%_backup.cmd"
-
- :add_to_reg
- cls
- color 1f
- 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.
- set choice=
- set /p choice= 请输入操作代码(S/回车):
- if /i "%choice%"=="s" goto run_at
-
- rem ========在注册表中增添自启动项以便开机时自动备份=============
- reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "%name%" /t REG_SZ /d "%batch_directory%\%name%_backup.cmd" /f >nul 2>nul
-
- :run_at
- :: 强制启用计划任务服务
- sc config Schedule start= AUTO >nul 2>nul
- sc start Schedule>nul 2>nul
- rem ==========导入at计划任务=========
- for %%i in (%copytime%) do (
- at %%i /every:%copydate% "%batch_directory%\%name%_backup.cmd" 2>nul
- )
- (
- echo.&echo.
- echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- echo.
- echo 于%date% %time:~0,8%创建了备份任务
- echo 备份对象:"%source%"
- echo 备份文件保存位置:"%destination%"
- echo 备份程序位置:"%batch_directory%\%name%_backup.cmd"
- echo.
- echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- echo.
- echo ________________________________________________________________________________
- )>>"%destination%\%name_log%_log.log"
-
- cls
- color 1f
- 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%" 2>nul
-
- :: 添加当计划任务出错时提交报告的功能
- :: --------------------------------------------------------------------
- :: 当使用计划任务让系统自动运行一些命令或程序时,如果运行时发生错误,
- :: 在系统的默认设置里,计划任务不会提交错误报告。
- :: 此设置就是让计划任务在出现错误时弹出提示信息。
- :: 要禁用此功能,请删除注册表中SchedulingAgent下的 NotifyOnTaskMiss
- :: 默认不开通;若要开通,请去掉以下reg语句前的注释符号
- :: --------------------------------------------------------------------
- :: reg add HKLM\SOFTWARE\Microsoft\SchedulingAgent /v NotifyOnTaskMiss /t REG_DWORD /d 00000001 /f >nul 2>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 %%i in (%copytime%) do (
- echo 已经添加了每月^(周^) %copydate% 日 %%i 对"%source%"的备份任务
- )
- echo.
- echo ________________________________________________________________________________
- echo.
- echo 如要继续添加备份任务,请输入 B ,其他任意键退出...
- echo.&echo.
- set again=
- set /p again= 请选择下一步操作代码:
- if /i "%again%"=="b" goto input_source
- exit
-
- rem ========删除不再使用的文件或目录=============
- :del_unused
- :: 以下语句的作用是:如果停止了某项备份任务,则检查硬盘上由本程序生成的cmd文件中,
- :: 不在at任务列表中的有哪些;如果有,则删除该cmd,同时删除注册表中对应的字符串值;
- :: 如果没有,则不作任何删除操作;
- :: 如果由本程序在%ProgramFiles%下创建的目录为空,则删除该目录
- for %%i in ("%ProgramFiles%\备份任务程序\*_backup.cmd") do (
- at|find /i "%%i">nul || find /i "Code by JM" "%%i">nul && (
- del /a /f /q "%%i"
- reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "%name%" /f >nul 2>nul
- )
- )
- if not exist "%ProgramFiles%\备份任务程序" goto :eof
- rd "%ProgramFiles%\备份任务程序" 2>nul
- goto :eof
-
-
- :: ━━━━━━━━━━━━━━━━━以下代码为出错提示━━━━━━━━━━━━━━━━━
-
- :system_error
- cls
- color 0c
- title 文件备份器-操作系统不支持
- echo.&echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 操作系统不支持 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 非常抱歉,该程序只能在XP环境下运行 │
- echo │ │
- echo │ 程序即将退出... │
- echo │ │
- echo ╰────────────────────────────╯
- ping -n 4 127.1>nul && goto :eof
-
- :popedom_error
- cls
- color 0c
- 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
- color 0c
- title 文件备份器-磁盘 "%subarea%" 不存在
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 磁盘分区不存在 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 盘符为 %subarea% 的磁盘分区不存在 │
- echo │ │
- echo │ 按任意键返回上一步重新选择路径 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_destination
-
- :source_noexist
- cls
- color 0c
- title 文件备份器-文件不存在
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 文件不存在 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 要备份的文件不存在 │
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_source
-
- :forbid_to_backup
- cls
- color 0c
- title 文件备份器-禁止备份
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 禁止备份 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 本程序不支持全盘备份 │
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_source
-
- :forbid_to_build_1
- cls
- color 0c
- title 文件备份器-禁止创建
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 禁止创建 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 为了数据的安全,请勿直接备份到根目录下 │
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_destination
-
- :forbid_to_build_2
- cls
- color 0c
- title 文件备份器-禁止创建
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 禁止创建 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ 警告:保存位置与要备份文件的位置路径相同 │
- echo │ │
- echo │ 或者位于要备份文件的某一目录下 │
- echo │ │
- echo │ 为了数据的安全,请重新选择保存位置 │
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_destination
-
- :destination_input_erro
- cls
- color 0c
- title 文件备份器-路径输入错误
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 路径输入错误 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 您的路径输入有错误 │
- echo │ │
- echo │ 请在半角状态输入冒号和反斜杠 │
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_destination
-
- :date_error
- cls
- color 0c
- title 文件备份器-日期输入错误
- echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 日期输入错误 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ 您的日期输入有错误 │
- echo │ │
- echo │ │
- echo │ 1. 日期不能字母和数字混用; │
- echo │ │
- echo │ 2. 单个的数字式日期不能大于31; │
- echo │ │
- echo │ 3. 字母式的日期只能是 M,T,W,Th,F,S,Su 中的 │
- echo │ │
- echo │ 任意几个,不区分大小写; │
- echo │ │
- echo │ 4. 日期之间只能用逗号分隔。 │
- echo │ │
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- pause>nul
- goto input_date
-
- :time_error
- cls
- color 0c
- title 文件备份器-时间输入错误
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 时间输入错误 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ 您的时间输入有错误 │
- echo │ │
- echo │小时数不能大于23,分钟数不能大于59,每个时间点用空格分隔│
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_time
-
- :name_exist
- cls
- color 0c
- title 文件备份器-同名程序 "%name%_backup.cmd" 已经存在
- echo.&echo.&echo.&echo.&echo.
- echo ╭────────╮
- echo ╭─────────┤ 存在同名程序 ├─────────╮
- echo │ ╰────────╯ │
- echo │ │
- echo │ │
- echo │ "%ProgramFiles%\备份任务程序"下已存在同名的批处理程序│
- echo │ │
- echo │ 按任意键返回上一步重新选择 │
- echo │ │
- echo ╰────────────────────────────╯
- echo.
- pause>nul
- goto input_name
-
- :: ━━━━━━━━━━━━━━━━━以下代码为被调用的子过程━━━━━━━━━━━━━━━━━
-
- rem ========查看保存位置下的内容以决定 追加/覆盖/重新选择 等操作========
- :view_directory
- explorer "%destination%"
- goto :eof
-
- rem ========简化每天都需要备份时的操作========
- :all_date
- 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
- goto input_time
- goto :eof
-
- rem ========查看备份脚本程序========
- :view_batch
- explorer "%ProgramFiles%\备份任务程序"
- goto input_source
- goto :eof
-
- rem ========显示备份清单========
- :list
- cls
- color 1f
- 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
- echo set times=1
- echo ^(
- echo echo _____________________________________________________________________________________
- echo echo.
- echo echo *更新列表^^^(%%date:~0,10%% %%time:~0,8%%^^^):
- echo echo.
- echo ^)^>^>"%destination%\%name_log%_log.log"
- echo goto :eof
- )>>"%batch_directory%\%name%_backup.cmd"
- goto :eof
复制代码
更新历史:复制代码
与本程序相关的讨论主要有:
[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 |