返回列表 发帖

[文件管理] 差异备份文件夹的批处理

本帖最后由 悬崖之树 于 2018-7-29 13:34 编辑
@echo off&setlocal enabledelayedexpansion
echo              差异备份文件夹
echo ---------------------------------------------------
echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
echo 否则后果自负。不要备份含有特殊字符如^(^),^&等的文件夹。
echo ---------------------------------------------------
echo.&echo.&echo.
set /p "src=请输入源文件夹地址:"
set /p "des=请输入目标文件夹地址:"
set s=%src:"=%
set d=%des:"=%
echo 开始删除目标文件夹内的无用文件。。。
::删除无用文件
for /f "delims=" %%i in ('dir %des% /b /a-d /s') do (
   set flag=1
   ::flag为0表示不删除,1表示要删除
   set i=%%i
   ::%%i和i表示目标文件夹文件的绝对路径
   set j=!i:%d%=%s%!
   ::j表示对应的源文件夹文件的绝对路径
   if exist "!j!" (
      call:md5 "!i!" m
      call:md5 "!j!" n   
      if !m!==!n! set flag=0
   )
   
   if !flag!==1 (
      echo 删除 "!i!" & del /f "!i!")
   )
echo 无用文件删除完成&pause
echo 开始删除无用文件夹。。。
::删除无用文件夹
for /f "delims=" %%i in ('dir %des% /b /ad /s^|sort /r /+300') do (
   set i=%%i
   ::%%i和i表示目标文件夹文件的绝对路径
   set j=!i:%d%=%s%!
   ::j表示对应的源文件夹文件的绝对路径
   if not exist "!j!" (
      echo 删除 "!i!" & rd "!i!"
   )
)
echo 无用文件夹删除完成&pause
echo 开始在目标文件夹内创建目录结构。。。
::在目标文件夹中创建源文件夹目录结构
for /d /r %src% %%j in (*) do (
   set j=%%j
   ::j表示源文件夹的路径
   set i=!j:%s%=%d%!
   ::i表示对应的目标文件夹的路径
   echo 创建 "!i!" & md "!i!"
)
echo 目录结构创建完成&pause
echo 开始复制源文件夹文件至目标文件夹。。。
::复制源文件夹文件至目标文件夹
for /f "delims=" %%j in ('dir %src% /a-d /b /s') do (
   set "j=%%j"
   ::j表示源文件夹的路径
   set "i=!j:%s%=%d%!"
   ::i表示对应的目标文件夹的路径
   if not exist "!i!" (
      echo 复制 "!j!" & copy "!j!" "!i!"
   )
)
echo 文件复制完成&pause&exit
:md5
for /f "skip=1 delims=" %%k in ('certutil -hashfile %1') do (
   set %2=%%k
   goto:eof
)COPY
时光荏苒||新陈代谢&&涛声依旧||本性难移

上面的速度太慢,这个比较快一点。
@echo off&setlocal enabledelayedexpansion
echo              差异备份文件夹
echo ---------------------------------------------------
echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
echo 否则后果自负。不要备份含有特殊字符如^(^),^&等的文件夹。
echo ---------------------------------------------------
echo.&echo.&echo.
set /p "src=请输入源文件夹地址:"
set /p "des=请输入目标文件夹地址:"
set s=%src:"=%
set d=%des:"=%
echo 开始删除目标文件夹内的无用文件。。。
::删除无用文件
for /f "delims=" %%i in ('dir %des% /b /a-d /s') do (
   set flag=1
   ::flag为0表示不删除,为1表示删除
   set i=%%i
   ::%%i和i表示目标文件夹文件的绝对路径
   set j=!i:%d%=%s%!
   ::j和%%j表示对应的源文件夹文件的绝对路径
   for /f "delims=" %%j in ("!j!") do (
      if exist "%%j" (
         if  "%%~zj" == "%%~zi" (
            set flag=0
         )
      )
   )
   
   if !flag!==1 (
      echo 删除 "!i!" && del /f "!i!"
   )
)
echo 无用文件删除完成&pause
echo 开始删除无用文件夹。。。
::删除无用文件夹
for /f "delims=" %%i in ('dir %des% /b /ad /s^|sort /r /+300') do (
   set i=%%i
   ::%%i和i表示目标文件夹文件的绝对路径
   set j=!i:%d%=%s%!
   ::j表示对应的源文件夹文件的绝对路径
   if not exist "!j!" (
      echo 删除 "!i!" & rd "!i!"
   )
)
echo 无用文件夹删除完成&pause
echo 开始在目标文件夹内创建目录结构。。。
::在目标文件夹中创建源文件夹目录结构
for /d /r %src% %%j in (*) do (
   set j=%%j
   ::j表示源文件夹的路径
   set i=!j:%s%=%d%!
   ::i表示对应的目标文件夹的路径
   md "!i!" 2>nul && echo 创建 "!i!"
)
echo 目录结构创建完成&pause
echo 开始复制源文件夹文件至目标文件夹。。。
::复制源文件夹文件至目标文件夹
for /f "delims=" %%j in ('dir %src% /a-d /b /s') do (
   set "j=%%j"
   ::j表示源文件夹的路径
   set "i=!j:%s%=%d%!"
   ::i表示对应的目标文件夹的路径
   if not exist "!i!" (
      echo 复制 "!j!" & copy "!j!" "!i!"
   )
)
echo 文件复制完成&pauseCOPY
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

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

这个支持备份含有特殊字符的文件夹
@echo off&setlocal enabledelayedexpansion
echo              差异备份文件夹
echo ---------------------------------------------------
echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
echo 否则后果自负。支持备份含有特殊字符如^(^),^&等的文件夹。
echo ---------------------------------------------------
echo.&echo.&echo.
set /p "src=请输入源文件夹地址:"
set /p "des=请输入目标文件夹地址:"
set t=^"
set s=!src:%t%=!
set d=!des:%t%=!
echo 开始删除目标文件夹内的无用文件。。。
::删除无用文件
for /f "delims=" %%i in ('dir "%d%" /b /a-d /s') do (
   set flag=1
   ::flag为0表示不删除,为1表示删除
   set "i=%%i"
   ::%%i和i表示目标文件夹文件的绝对路径
   set "j=!i:%d%=%s%!"
   ::j和%%j表示对应的源文件夹文件的绝对路径
   for /f "delims=" %%j in ("!j!") do (
      if exist "%%j" (
         if  "%%~zj" == "%%~zi" (
            set flag=0
         )
      )
   )
   
   if !flag!==1 (
      echo 删除 "!i!" && del /f "!i!"
   )
)
echo 无用文件删除完成&pause
echo 开始删除无用文件夹。。。
::删除无用文件夹
for /f "delims=" %%i in ('dir "%d%" /b /ad /s^|sort /r /+300') do (
   set "i=%%i"
   ::%%i和i表示目标文件夹文件的绝对路径
   set "j=!i:%d%=%s%!"
   ::j表示对应的源文件夹文件的绝对路径
   if not exist "!j!" (
      echo 删除 "!i!" & rd "!i!"
   )
)
echo 无用文件夹删除完成&pause
echo 开始在目标文件夹内创建目录结构。。。
::在目标文件夹中创建源文件夹目录结构
for /d /r "%s%" %%j in (*) do (
   set "j=%%j"
   ::j表示源文件夹的路径
   set "i=!j:%s%=%d%!"
   ::i表示对应的目标文件夹的路径
   md "!i!" 2>nul && echo 创建 "!i!"
)
echo 目录结构创建完成&pause
echo 开始复制源文件夹文件至目标文件夹。。。
::复制源文件夹文件至目标文件夹
for /f "delims=" %%j in ('dir "%s%" /a-d /b /s') do (
   set "j=%%j"
   ::j表示源文件夹的路径
   set "i=!j:%s%=%d%!"
   ::i表示对应的目标文件夹的路径
   if not exist "!i!" (
      echo 复制 "!j!" & copy "!j!" "!i!"
   )
)
echo 文件复制完成&pauseCOPY
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

差异备份文件夹

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

这个支持特殊字符和驱动器
@echo off&setlocal enabledelayedexpansion
echo              差异备份文件夹
echo ---------------------------------------------------
echo 本程序通过差异备份把源文件夹的内容备份到目标文件夹内,
echo 删除目标文件夹内的无用文件和文件夹,保留有效的文件和
echo 文件夹,再把要备份的文件和文件夹复制到目标文件夹内,
echo 不替换目标文件夹内的有效文件和文件夹,最后达到两个文件
echo 夹得内容完全一致。源文件夹是指要备份的文件夹,目标文件
echo 夹是指存放源文件夹内容副本的文件夹,千万不要弄错了,
echo 否则后果自负。支持备份含有特殊字符如^(^),^&等的文件夹,
echo 但是不支持备份的文件路径或名字有“!”的文件哦!
echo ---------------------------------------------------
echo.&echo.&echo.
set /p "src=请输入源文件夹地址:"
set /p "des=请输入目标文件夹地址:"
set t=^"
set s=!src:%t%=!
set d=!des:%t%=!
if "%s:~-1,1%" == "\" set "s=%s:~0,-1%"
if "%d:~-1,1%" == "\" set "d=%d:~0,-1%"
echo 开始删除目标文件夹内的无用文件。。。
::删除无用文件
for /f "delims=" %%i in ('dir "%d%" /b /a-d /s') do (
   set flag=1
   ::flag为0表示不删除,为1表示删除
   set i=%%i
   ::%%i和i表示目标文件夹文件的绝对路径
   set "j=!i:%d%=%s%!"
   ::j和%%j表示对应的源文件夹文件的绝对路径
   for /f "delims=" %%j in ("!j!") do (
      if exist "%%j" (
         if  "%%~zj" == "%%~zi" (
            set flag=0
         )
      )
   )
   
   if !flag!==1 (
      echo 删除 "!i!" && del /f "!i!"
   )
)
echo 无用文件删除完成&pause
echo 开始删除无用文件夹。。。
::删除无用文件夹
for /f "delims=" %%i in ('dir "%d%" /b /ad /s^|sort /r /+300') do (
   set "i=%%i"
   ::%%i和i表示目标文件夹的...
   set "j=!i:%d%=%s%!"
   ::j表示对应的源文件夹的...
   if not exist "!j!" (
      echo 删除 "!i!" & rd "!i!"
   )
)
echo 无用文件夹删除完成&pause
echo 开始在目标文件夹内创建目录结构。。。
::在目标文件夹中创建源文件夹内目录结构
for /d /r "%s%" %%j in (*) do (
   set "j=%%j"
   ::j表示源文件夹的...
   set "i=!j:%s%=%d%!"
   ::i表示对应的目标文件夹的...
   md "!i!" 2>nul && echo 创建 "!i!"
)
echo 目录结构创建完成&pause
echo 开始复制源文件夹文件至目标文件夹。。。
::复制源文件夹文件至目标文件夹
for /f "delims=" %%j in ('dir "%s%" /a-d /b /s') do (
   set "j=%%j"
   ::j表示源文件夹的...
   set "i=!j:%s%=%d%!"
   ::i表示对应的目标文件夹的...
   if not exist "!i!" (
      echo 复制 "!j!" & copy "!j!" "!i!"
   )
)
echo 文件复制完成&pauseCOPY
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

支持LZ

TOP

简练的代码就是美

TOP

支持!支持!复杂化简

TOP

返回列表