Board logo

标题: [文件管理] 差异备份文件夹的批处理 [打印本页]

作者: 悬崖之树    时间: 2018-7-28 13:12     标题: 差异备份文件夹的批处理

本帖最后由 悬崖之树 于 2018-7-29 13:34 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. echo              差异备份文件夹
  3. echo ---------------------------------------------------
  4. echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
  5. echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
  6. echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
  7. echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
  8. echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
  9. echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
  10. echo 否则后果自负。不要备份含有特殊字符如^(^),^&等的文件夹。
  11. echo ---------------------------------------------------
  12. echo.&echo.&echo.
  13. set /p "src=请输入源文件夹地址:"
  14. set /p "des=请输入目标文件夹地址:"
  15. set s=%src:"=%
  16. set d=%des:"=%
  17. echo 开始删除目标文件夹内的无用文件。。。
  18. ::删除无用文件
  19. for /f "delims=" %%i in ('dir %des% /b /a-d /s') do (
  20.    set flag=1
  21.    ::flag为0表示不删除,1表示要删除
  22.    set i=%%i
  23.    ::%%i和i表示目标文件夹文件的绝对路径
  24.    set j=!i:%d%=%s%!
  25.    ::j表示对应的源文件夹文件的绝对路径
  26.    if exist "!j!" (
  27.       call:md5 "!i!" m
  28.       call:md5 "!j!" n   
  29.       if !m!==!n! set flag=0
  30.    )
  31.    
  32.    if !flag!==1 (
  33.       echo 删除 "!i!" & del /f "!i!")
  34.    )
  35. echo 无用文件删除完成&pause
  36. echo 开始删除无用文件夹。。。
  37. ::删除无用文件夹
  38. for /f "delims=" %%i in ('dir %des% /b /ad /s^|sort /r /+300') do (
  39.    set i=%%i
  40.    ::%%i和i表示目标文件夹文件的绝对路径
  41.    set j=!i:%d%=%s%!
  42.    ::j表示对应的源文件夹文件的绝对路径
  43.    if not exist "!j!" (
  44.       echo 删除 "!i!" & rd "!i!"
  45.    )
  46. )
  47. echo 无用文件夹删除完成&pause
  48. echo 开始在目标文件夹内创建目录结构。。。
  49. ::在目标文件夹中创建源文件夹目录结构
  50. for /d /r %src% %%j in (*) do (
  51.    set j=%%j
  52.    ::j表示源文件夹的路径
  53.    set i=!j:%s%=%d%!
  54.    ::i表示对应的目标文件夹的路径
  55.    echo 创建 "!i!" & md "!i!"
  56. )
  57. echo 目录结构创建完成&pause
  58. echo 开始复制源文件夹文件至目标文件夹。。。
  59. ::复制源文件夹文件至目标文件夹
  60. for /f "delims=" %%j in ('dir %src% /a-d /b /s') do (
  61.    set "j=%%j"
  62.    ::j表示源文件夹的路径
  63.    set "i=!j:%s%=%d%!"
  64.    ::i表示对应的目标文件夹的路径
  65.    if not exist "!i!" (
  66.       echo 复制 "!j!" & copy "!j!" "!i!"
  67.    )
  68. )
  69. echo 文件复制完成&pause&exit
  70. :md5
  71. for /f "skip=1 delims=" %%k in ('certutil -hashfile %1') do (
  72.    set %2=%%k
  73.    goto:eof
  74. )
复制代码

作者: 悬崖之树    时间: 2018-7-30 13:33

上面的速度太慢,这个比较快一点。
  1. @echo off&setlocal enabledelayedexpansion
  2. echo              差异备份文件夹
  3. echo ---------------------------------------------------
  4. echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
  5. echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
  6. echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
  7. echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
  8. echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
  9. echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
  10. echo 否则后果自负。不要备份含有特殊字符如^(^),^&等的文件夹。
  11. echo ---------------------------------------------------
  12. echo.&echo.&echo.
  13. set /p "src=请输入源文件夹地址:"
  14. set /p "des=请输入目标文件夹地址:"
  15. set s=%src:"=%
  16. set d=%des:"=%
  17. echo 开始删除目标文件夹内的无用文件。。。
  18. ::删除无用文件
  19. for /f "delims=" %%i in ('dir %des% /b /a-d /s') do (
  20.    set flag=1
  21.    ::flag为0表示不删除,为1表示删除
  22.    set i=%%i
  23.    ::%%i和i表示目标文件夹文件的绝对路径
  24.    set j=!i:%d%=%s%!
  25.    ::j和%%j表示对应的源文件夹文件的绝对路径
  26.    for /f "delims=" %%j in ("!j!") do (
  27.       if exist "%%j" (
  28.          if  "%%~zj" == "%%~zi" (
  29.             set flag=0
  30.          )
  31.       )
  32.    )
  33.    
  34.    if !flag!==1 (
  35.       echo 删除 "!i!" && del /f "!i!"
  36.    )
  37. )
  38. echo 无用文件删除完成&pause
  39. echo 开始删除无用文件夹。。。
  40. ::删除无用文件夹
  41. for /f "delims=" %%i in ('dir %des% /b /ad /s^|sort /r /+300') do (
  42.    set i=%%i
  43.    ::%%i和i表示目标文件夹文件的绝对路径
  44.    set j=!i:%d%=%s%!
  45.    ::j表示对应的源文件夹文件的绝对路径
  46.    if not exist "!j!" (
  47.       echo 删除 "!i!" & rd "!i!"
  48.    )
  49. )
  50. echo 无用文件夹删除完成&pause
  51. echo 开始在目标文件夹内创建目录结构。。。
  52. ::在目标文件夹中创建源文件夹目录结构
  53. for /d /r %src% %%j in (*) do (
  54.    set j=%%j
  55.    ::j表示源文件夹的路径
  56.    set i=!j:%s%=%d%!
  57.    ::i表示对应的目标文件夹的路径
  58.    md "!i!" 2>nul && echo 创建 "!i!"
  59. )
  60. echo 目录结构创建完成&pause
  61. echo 开始复制源文件夹文件至目标文件夹。。。
  62. ::复制源文件夹文件至目标文件夹
  63. for /f "delims=" %%j in ('dir %src% /a-d /b /s') do (
  64.    set "j=%%j"
  65.    ::j表示源文件夹的路径
  66.    set "i=!j:%s%=%d%!"
  67.    ::i表示对应的目标文件夹的路径
  68.    if not exist "!i!" (
  69.       echo 复制 "!j!" & copy "!j!" "!i!"
  70.    )
  71. )
  72. echo 文件复制完成&pause
复制代码

作者: 悬崖之树    时间: 2018-7-30 19:31

本帖最后由 悬崖之树 于 2018-8-1 19:58 编辑

这个支持备份含有特殊字符的文件夹
  1. @echo off&setlocal enabledelayedexpansion
  2. echo              差异备份文件夹
  3. echo ---------------------------------------------------
  4. echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
  5. echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
  6. echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
  7. echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
  8. echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
  9. echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
  10. echo 否则后果自负。支持备份含有特殊字符如^(^),^&等的文件夹。
  11. echo ---------------------------------------------------
  12. echo.&echo.&echo.
  13. set /p "src=请输入源文件夹地址:"
  14. set /p "des=请输入目标文件夹地址:"
  15. set t=^"
  16. set s=!src:%t%=!
  17. set d=!des:%t%=!
  18. echo 开始删除目标文件夹内的无用文件。。。
  19. ::删除无用文件
  20. for /f "delims=" %%i in ('dir "%d%" /b /a-d /s') do (
  21.    set flag=1
  22.    ::flag为0表示不删除,为1表示删除
  23.    set "i=%%i"
  24.    ::%%i和i表示目标文件夹文件的绝对路径
  25.    set "j=!i:%d%=%s%!"
  26.    ::j和%%j表示对应的源文件夹文件的绝对路径
  27.    for /f "delims=" %%j in ("!j!") do (
  28.       if exist "%%j" (
  29.          if  "%%~zj" == "%%~zi" (
  30.             set flag=0
  31.          )
  32.       )
  33.    )
  34.    
  35.    if !flag!==1 (
  36.       echo 删除 "!i!" && del /f "!i!"
  37.    )
  38. )
  39. echo 无用文件删除完成&pause
  40. echo 开始删除无用文件夹。。。
  41. ::删除无用文件夹
  42. for /f "delims=" %%i in ('dir "%d%" /b /ad /s^|sort /r /+300') do (
  43.    set "i=%%i"
  44.    ::%%i和i表示目标文件夹文件的绝对路径
  45.    set "j=!i:%d%=%s%!"
  46.    ::j表示对应的源文件夹文件的绝对路径
  47.    if not exist "!j!" (
  48.       echo 删除 "!i!" & rd "!i!"
  49.    )
  50. )
  51. echo 无用文件夹删除完成&pause
  52. echo 开始在目标文件夹内创建目录结构。。。
  53. ::在目标文件夹中创建源文件夹目录结构
  54. for /d /r "%s%" %%j in (*) do (
  55.    set "j=%%j"
  56.    ::j表示源文件夹的路径
  57.    set "i=!j:%s%=%d%!"
  58.    ::i表示对应的目标文件夹的路径
  59.    md "!i!" 2>nul && echo 创建 "!i!"
  60. )
  61. echo 目录结构创建完成&pause
  62. echo 开始复制源文件夹文件至目标文件夹。。。
  63. ::复制源文件夹文件至目标文件夹
  64. for /f "delims=" %%j in ('dir "%s%" /a-d /b /s') do (
  65.    set "j=%%j"
  66.    ::j表示源文件夹的路径
  67.    set "i=!j:%s%=%d%!"
  68.    ::i表示对应的目标文件夹的路径
  69.    if not exist "!i!" (
  70.       echo 复制 "!j!" & copy "!j!" "!i!"
  71.    )
  72. )
  73. echo 文件复制完成&pause
复制代码

作者: 悬崖之树    时间: 2018-8-1 12:37     标题: 差异备份文件夹

本帖最后由 悬崖之树 于 2018-8-1 19:52 编辑

这个支持特殊字符和驱动器
  1. @echo off&setlocal enabledelayedexpansion
  2. echo              差异备份文件夹
  3. echo ---------------------------------------------------
  4. echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
  5. echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
  6. echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
  7. echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
  8. echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
  9. echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
  10. echo 否则后果自负。支持备份含有特殊字符如^(^),^&等的文件夹,
  11. echo 但是不支持备份的文件路径或名字有“!”的文件哦!
  12. echo ---------------------------------------------------
  13. echo.&echo.&echo.
  14. set /p "src=请输入源文件夹地址:"
  15. set /p "des=请输入目标文件夹地址:"
  16. set t=^"
  17. set s=!src:%t%=!
  18. set d=!des:%t%=!
  19. if "%s:~-1,1%" == "\" set "s=%s:~0,-1%"
  20. if "%d:~-1,1%" == "\" set "d=%d:~0,-1%"
  21. echo 开始删除目标文件夹内的无用文件。。。
  22. ::删除无用文件
  23. for /f "delims=" %%i in ('dir "%d%" /b /a-d /s') do (
  24.    set flag=1
  25.    ::flag为0表示不删除,为1表示删除
  26.    set i=%%i
  27.    ::%%i和i表示目标文件夹文件的绝对路径
  28.    set "j=!i:%d%=%s%!"
  29.    ::j和%%j表示对应的源文件夹文件的绝对路径
  30.    for /f "delims=" %%j in ("!j!") do (
  31.       if exist "%%j" (
  32.          if  "%%~zj" == "%%~zi" (
  33.             set flag=0
  34.          )
  35.       )
  36.    )
  37.    
  38.    if !flag!==1 (
  39.       echo 删除 "!i!" && del /f "!i!"
  40.    )
  41. )
  42. echo 无用文件删除完成&pause
  43. echo 开始删除无用文件夹。。。
  44. ::删除无用文件夹
  45. for /f "delims=" %%i in ('dir "%d%" /b /ad /s^|sort /r /+300') do (
  46.    set "i=%%i"
  47.    ::%%i和i表示目标文件夹的...
  48.    set "j=!i:%d%=%s%!"
  49.    ::j表示对应的源文件夹的...
  50.    if not exist "!j!" (
  51.       echo 删除 "!i!" & rd "!i!"
  52.    )
  53. )
  54. echo 无用文件夹删除完成&pause
  55. echo 开始在目标文件夹内创建目录结构。。。
  56. ::在目标文件夹中创建源文件夹内目录结构
  57. for /d /r "%s%" %%j in (*) do (
  58.    set "j=%%j"
  59.    ::j表示源文件夹的...
  60.    set "i=!j:%s%=%d%!"
  61.    ::i表示对应的目标文件夹的...
  62.    md "!i!" 2>nul && echo 创建 "!i!"
  63. )
  64. echo 目录结构创建完成&pause
  65. echo 开始复制源文件夹文件至目标文件夹。。。
  66. ::复制源文件夹文件至目标文件夹
  67. for /f "delims=" %%j in ('dir "%s%" /a-d /b /s') do (
  68.    set "j=%%j"
  69.    ::j表示源文件夹的...
  70.    set "i=!j:%s%=%d%!"
  71.    ::i表示对应的目标文件夹的...
  72.    if not exist "!i!" (
  73.       echo 复制 "!j!" & copy "!j!" "!i!"
  74.    )
  75. )
  76. echo 文件复制完成&pause
复制代码

作者: 1410029385    时间: 2018-8-4 15:28

支持LZ
作者: zhqiao    时间: 2018-9-23 12:07

简练的代码就是美
作者: 网络民工    时间: 2019-4-11 09:55

支持!支持!复杂化简




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