Board logo

标题: 批处理复制进度条 [打印本页]

作者: defanive    时间: 2009-4-25 19:13     标题: 批处理复制进度条

平时复制文件的时候,都有一个窗口显示复制的百分比。。。
窗口里面有进度条显示,还有剩余的时间。。。
以前尝试过写这个功能,不过最终以失败告终。。。
原因是无论是copy还是xcopy,其复制时,即使未完成,显示的文件大小都是不变的。。。
以前也有试过用type,先不考虑文件是否完整,其速度实在让人吐血。。。
网上搜索了相关的资料,未果。。。
注意,进度条显示的是已复制和欲复制的百分比。。。
如果完成的话,剩余时间的显示也不成问题了。。。
然后就是复制一个文件夹时,当前复制的文件有一个进度条,整个的进度也有一个进度条。。。
可能会难很多。。。
希望众高人一起看下,个人觉得实在有难度。。。
PS:第三方免了。。。


目前进度:

1、实现单文件复制
2、实现基本进度条及百分比显示

调用方法:
CopyX.bat 源路径 新路径

CopyX代码(可从附件下载):
  1. @echo off
  2. :: Made By Defanive
  3. setlocal enabledelayedexpansion
  4. mode con: cols=26 lines=3
  5. title 复制中,请稍候
  6. color 71
  7. del /f /q Copy._tmp 2>nul
  8. cls
  9. mshta vbscript:createobject("wscript.shell").run("Cmd /c Copy /z "+""""+"%~1"+""""+" "+""""+"%~2"+""""+" >"+""""+"%~dp0\Copy._tmp"+"""",0)(window.close)
  10. set "bar=>>>>>>>>>>>>>>>>>>>>--------------------"
  11. echo 复制中,请稍候
  12. :ready
  13. if not exist Copy._tmp goto ready
  14. :copying
  15. for /f "tokens=*" %%a in ('type Copy._tmp') do (
  16. set "str=%%a"
  17. if "!str:~-4!"=="已复制 " (
  18. set /a "per=!str:~-9,3!"
  19. set /a "pt=20-per/5"
  20. call set "barn=%%bar:~!pt!,20%%"
  21. set /p=!barn! !per!%%<nul
  22. goto copying
  23. )
  24. )
  25. cls
  26. del /f /q Copy._tmp 2>nul
  27. title 复制完成!
  28. cls
  29. echo.
  30. echo 复制完成!
  31. ping -n 2 127.0.0.1>nul
  32. exit
复制代码
链接: https://pan.baidu.com/s/1hluuahxtZz7azrLT1CwO7g?pwd=m5q8
作者: 随风    时间: 2009-4-25 19:22

感觉这类东西,平白无辜消费系统大量资源,真正华而不实。况且即使写出来了,得到也不可能是真正的进度,只是模拟进度。
作者: batman    时间: 2009-4-25 19:45

多年前就有n人进行了努力尝试,最终结论都是——费力不得好。。。
作者: defanive    时间: 2009-4-25 20:54

如果能得到复制时的大小,也就能算出百分比了。。。

至于前辈们的尝试,我还没有找到相关的资料。。。
作者: wangjmh    时间: 2009-4-26 13:14

真正的百分比应该不好得到,最多只能自己设定进度,然后在某一条件成立时显示出来吧
作者: a794685135    时间: 2009-4-27 13:19

单算文件个数做百分比吧,,
作者: pusofalse    时间: 2009-4-27 13:38

能调用api的话一切都OK,期待有人能写个批处理调用api的工具出来。
作者: batman    时间: 2009-4-29 10:40

复制文件的进度条没做到,但做了个简单的,示例如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>num.txt&echo.
  3. for /l %%a in (1,1,10000) do (
  4.      echo %%a >>num.txt
  5.      set /a a=%%a%%500
  6.      if !a! equ 0 set /p=★<nul
  7. )
  8. start num.txt
复制代码

作者: Batcher    时间: 2009-4-29 13:03

copy /z不是可以显示百分比么?
http://www.bathome.net/viewthread.php?tid=780#pid27947
作者: defanive    时间: 2009-5-1 23:02

9L强大。。。
那么,现在进度条如何处理?
作者: defanive    时间: 2009-5-2 10:22

报告进度:
通过Copy /Z功能已实现基本进度条和百分比显示,目前只支持单文件
代码及下载在主楼
作者: netbenton    时间: 2009-5-3 20:58

根据文件大小来做百分比。
  1. @echo off
  2. if "%date:~-3,2%" equ "星期" (set 中=y)
  3. if defined 中 (
  4.         set ec1=正在准备,请稍候。。。&set ec2=当前目录
  5.         set ec3=当前进度&set ec4=总进度&set ec5=正在考拷贝&set ec6=完成
  6. ) else (
  7.         set ec1=Please wait...&set ec2=Directory&set ec3=copying
  8.         set ec4=Total&set ec5=File&set "ec6=OK!!"
  9. )
  10. echo %ec1%
  11. setlocal enabledelayedexpansion
  12. set n=1
  13. for /f "skip=2 delims=" %%a in ('dir /s /-c /a-d %1') do (
  14.         set "str=%%a"
  15.         if defined 中 (
  16.                 if "!str:~-3!" equ "的目录" (set/a d+=1&set #!d!n=!str:~1,-4!) else (
  17.                 for /f "tokens=1,2,3*" %%b in ("%%a") do (
  18.                         if "%%d" neq "" (
  19.                         set var=%%d
  20.                         if defined end (set/a total=!var:~,-3!+0&goto :next) else (
  21.                         if "%%c" equ "个文件" (set #!d!s=%%b&set/a n=1,#!d!z=!var:~,-3!+1) else (set #!d!.!n!=%%e&set/a #!d!.!n!.=!var:~,-1!+0,n+=1)
  22.                         )) else (set end=y)
  23.                 ))
  24.         ) else (
  25.                 if "!str:~1,9!" equ "Directory" (set/a d+=1&set #!d!n=!str:~14!) else (
  26.                 for /f "tokens=1,2,3*" %%b in ("%%a") do (
  27.                         if "%%b" neq "Total" (
  28.                         set var=%%d
  29.                         if defined end (set/a total=!var:~,-3!+0&goto :next) else (
  30.                         if "%%c" equ "File(s)" (set #!d!s=%%b&set/a n=1,#!d!z=!var:~,-3!+1) else (set #!d!.!n!=%%e&set/a #!d!.!n!.=!var:~,-1!+0,n+=1)
  31.                         )) else (set end=y)
  32.                 ))
  33.         )
  34. )
  35. :next
  36. set "bbb=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
  37. set "eee= =============================="
  38. for /l %%a in (1,1,%d%) do (
  39.         set dir=
  40.         set num=
  41.         for /l %%b in (1,1,!#%%as!) do (set/a num+=#%%a.%%b.
  42.                 set/a ec=!num! / !#%%az!
  43.                 set/a tot+=#%%a.%%b.
  44.                 set/a et=!tot! / !total!
  45.                 set/a b1=ec/3+1,b2=et/3+1
  46.                 rem copy /z !#%%an!\!#%%a.%%b! %2 >nul
  47.                 cls
  48.                 echo.&echo.&echo.&echo.
  49.                 echo  %ec5%: !#%%a.%%b!
  50.                 for /f "tokens=1,2" %%c in ("!b1! !b2!") do (
  51.                         echo  %ec2%: !#%%an!      
  52.                         echo  %ec3%: !bbb:~-%%c!!ec!%%!eee:~%%c!
  53.                         echo.
  54.                         echo  %ec4%: !bbb:~-%%d!!et!%%!eee:~%%d!
  55.                 )
  56.                 ping -n 1 127.1 >nul
  57.                 ping -n 1 127.1 >nul
  58.         )
  59. )
  60. echo !ec6!
  61. pause
复制代码

[ 本帖最后由 netbenton 于 2009-5-3 21:00 编辑 ]
作者: defanive    时间: 2009-5-17 11:44

12L,代码强大。。。
作者: 523066680    时间: 2009-6-14 15:24

安装程序时详细的进度条,纯粹是效果
  1. @echo off&setlocal enabledelayedexpansion&mode con cols=25 lines=1
  2. title 进度条
  3. set /a a=0
  4. :a
  5. set /a a+=1
  6. for %%a in (▏ ▎ ▍ ▌ ▋ ▊ ▉) do (set /p=%%a<nul &ping -n 1 127.1>nul &ping -n 1 127.1>nul &ping -n 1 127.1>nul &set /p=   <nul)
  7. set /p=█<nul
  8. if %a% lss 10 (goto :a)
  9. set /p= End<nul&pause>nul
复制代码

[ 本帖最后由 523066680 于 2009-6-14 15:27 编辑 ]
作者: canyuexiaolang    时间: 2009-8-26 15:23

没那种技术,再说不借助第三方软件也不行啊
作者: airen007    时间: 2010-3-13 10:59

拷贝指定文件该怎么做呢?拷贝完继续执行其他命令又该怎么处理
作者: airen007    时间: 2010-3-13 11:00

如有解决办法,请高手们通知下。谢谢QQ:844780466.。。。
作者: ejzhang    时间: 2010-8-2 12:10

这也行?真是PF啊!




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