[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 文件备份,文件对比的批处理是否能再快一点?

以下代码,是我找别人帮写的!备份文件、文件夹。复制前要作文件对比!只复制更新、新增的文件、文件夹。复制完会生成txt日志。
但是文件多的话 速度比较慢。例如几千个小文件,200MB不到。需要好几分钟时间!
不知道有无其他代码、方法可以快一点。
  1. @echo off&setlocal enabledelayedexpansion
  2. @rem 生成log文件名
  3. set output=%date:~,4%-%date:~5,2%-%date:~8,2%_%time%.txt
  4. set output=%output::=-%
  5. set output=%output: =%
  6. @rem 调用函数完成功能,5个参数分别是源目录,目标目录,用户名,密码,log文件名
  7. @rem 因为windows不允许文件名里有冒号,所以这里把:换成-
  8. call :s 源地址 目标地址 用户 密码 %output::=-%
  9. @echo 文件已备份完成,30秒后自动关闭窗口
  10. @ping -n 30 127.0.0.1>nul
  11. goto :eof
  12. :s
  13. @echo %1 %2 %3 %4 %5
  14. set src_path=%1
  15. set dst_path=%2
  16. set username=%3
  17. set password=%4
  18. @rem log生成在目标路径
  19. set log_file=!dst_path!\rizhi\%5
  20. @rem 创建目录
  21. @md !dst_path!\rizhi
  22. @rem 复制前关掉xx1.exe和xx2.exe进程
  23. TASKKILL /IM xx1.exe
  24. TASKKILL /IM xx2.exe
  25. @rem 自动登录局域网电脑(不映射盘),先重启explorer
  26. net use !dst_path! /user:!username! !password!
  27. taskkill /f /im explorer.exe
  28. start explorer.exe
  29. @rem 生成log文件
  30. @echo>!log_file!
  31. @rem 复制前能进行对比,已有的文件一模一样无更新的·不复制。反之替换掉!
  32. for /f "delims=" %%f in ('dir /b/s/a-d^ !src_path!') do (
  33.     @rem 遍历所有子目录,获得文件%%f,然后将%%f中的原路径替换成目标路径,便于比较文件
  34.     set cur_file="%%f"
  35.     call set dst_file=%%cur_file:%src_path%=%dst_path%%%
  36.     set pathb=%%~dpf
  37.     call set dst_path=%%pathb:%src_path%=%dst_path%%%
  38.     @rem 创建子目录
  39.     if not exist !dst_path! (@md !dst_path!)
  40.     @rem 这里是正式覆盖,并且写入log文件
  41.     @echo xcopy /d /y !cur_file! !dst_path!
  42.     set need_proc=0
  43.     for /F %%i in ('xcopy /d /y !cur_file! !dst_path!^|findstr "复制了 1 个文件"') do (
  44.         set need_proc=1
  45.     )
  46.     if !need_proc!==1 (@echo !cur_file!>>!log_file!)
  47. )
  48. :eof
复制代码

回复 5# Batcher


    只测试了一下小文件,应该就几百个吧

TOP

回复 6# Gin_Q


    能否把你的测试用例和测试结果发出来看看?errorlevel在哪些xcopy的场景下会发生变化
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

xcopy后直接判断!errorlevel!应该快一些

TOP

回复 4# bat456


    处理几千个文件的情况下,3楼代码和1楼代码相比没有任何速度提升是吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 3# Batcher


    谢谢大哥,不过简单测试了一下,都是40多秒。

TOP

回复 1# bat456


功能逻辑暂时不动,for循环内部的命令进行初步优化:
1. 把写日志的操作放到for循环外面
2. 减少call命令的使用
试试这样能否稍微快一点点
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 生成log文件名
  4. set output=%date:~,4%-%date:~5,2%-%date:~8,2%_%time%.txt
  5. rem 因为windows不允许文件名里有冒号,所以这里把:换成-
  6. set output=%output::=-%
  7. set output=%output: =%
  8. rem 调用函数完成功能,5个参数分别是源目录,目标目录,用户名,密码,log文件名
  9. call :s 源地址 目标地址 用户 密码 %output%
  10. echo 文件已备份完成,30秒后自动关闭窗口
  11. ping -n 30 127.0.0.1>nul
  12. goto :eof
  13. :s
  14. echo %1 %2 %3 %4 %5
  15. set src_path=%1
  16. set dst_path=%2
  17. set username=%3
  18. set password=%4
  19. rem log生成在目标路径
  20. set log_file=!dst_path!\rizhi\%5
  21. rem 创建目录
  22. md !dst_path!\rizhi
  23. rem 复制前关掉xx1.exe和xx2.exe进程
  24. taskkill /f /im xx1.exe /im xx2.exe
  25. rem 自动登录局域网电脑(不映射盘),先重启explorer
  26. net use !dst_path! /user:!username! !password!
  27. taskkill /f /im explorer.exe
  28. start explorer.exe
  29. rem 复制前能进行对比,已有的文件一模一样无更新的·不复制。反之替换掉!
  30. (for /f "delims=" %%f in ('dir /b /s /a-d !src_path!') do (
  31.     rem 遍历所有子目录,获得文件%%f,然后将%%f中的原路径替换成目标路径,便于比较文件
  32.     set cur_file="%%f"
  33.     REM call set dst_file=%%cur_file:%src_path%=%dst_path%%%
  34.     set pathb=%%~dpf
  35.     REM call set dst_path=%%pathb:%src_path%=%dst_path%%%
  36.     set dst_path=!pathb:%src_path%=%dst_path%!
  37.     rem 创建子目录
  38.     if not exist !dst_path! (md !dst_path!)
  39.     rem 这里是正式覆盖,并且写入log文件
  40.     REM echo xcopy /d /y !cur_file! !dst_path!
  41.     set need_proc=0
  42.     for /f %%i in ('xcopy /d /y !cur_file! !dst_path!^|findstr "复制了 1 个文件"') do (
  43.         set need_proc=1
  44.     )
  45.     if !need_proc!==1 (echo !cur_file!)
  46. ))>"!log_file!"
  47. :eof
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. robocopy /M
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

返回列表