Board logo

标题: [已解决]批处理实现进度条的新想法,求如何解决? [打印本页]

作者: cd309420    时间: 2011-5-13 11:04     标题: [已解决]批处理实现进度条的新想法,求如何解决?

本帖最后由 cd309420 于 2011-5-13 23:47 编辑

看了很多帖子,也百度了很久,明白批处理如今是无法根据文件大小来实现进度条的准确性,现在我想到另外一个办法。就是在拷贝文件时让进度条无限的显现,简单的说就是在拷贝文件时显示进度条,进度条冲满后又重头开始冲、无限冲,直到文件拷贝完,关闭批处理。其实大家想在批处理上实现进度条,无非就是觉得批处理在拷贝大文件时觉得批处理界面过于死板,有种程序无响应的感觉,如果这样就很直观了,根本无需去计算文件大小,拷贝时间了啊。想法是有了,不知道能不能实现。

就以我的文件拷贝代码为例吧!其实也是想各位大大帮忙结合下,我的能力实在不敢恭维。
  1. @echo off&setlocal enabledelayedexpansion
  2. mode con cols=85 lines=13
  3. set C1=C:\Docume~1
  4. set C2=C:\Progra~1
  5. set ping=ping -n 3 127.1
  6. net use \\192.168.1.100 "123456" /user:administrator>nul 2>nul
  7. for /f %%a in ('hostname') do set dir=\\192.168.1.100\server\%%a\%DATE:~0,10%
  8. mkdir %dir%>nul 2>nul
  9. set "str=3秒后开始复制文件。"
  10. for /l %%a in (0 1 50) do (
  11.       if "!str:~%%a,1!" neq "" (
  12.           set/p=!str:~%%a,1!<nul
  13.           for /l %%i in (1 1 400) do echo.>nul
  14.          ) else (
  15.          %ping%>nul 2>nul
  16.      )
  17. )
  18. for /d %%a in (C1 C2 d: e: f: g: h: i: j: k:) do xcopy /d/s/c/q/r/y %%a\*.xls  %dir%>nul 2>nul
  19. for /d %%a in (C1 C2 d: e: f: g: h: i: j: k:) do xcopy /d/s/c/q/r/y %%a\*.doc  %dir%>nul 2>nul
复制代码
进度条我在论坛里看到一贴还不错,不知道是否能结合起来。
  1. @echo off&mode con cols=70 lines=7
  2. echo.&echo                              正在复制文件...&echo.
  3. ::创建带删除符的文件,文件名为█
  4. set /p=<nul>█
  5. set ys=abde12345689
  6. :a
  7. set p=-1
  8. :b
  9. set /a p+=1
  10. call set q=%%ys:~%p%,1%%
  11. set /a kk+=1
  12. set /a k=0
  13. set /p=            <nul
  14. :s
  15. set /a k+=1
  16. ::颜色输出的关键一步,利用findstr /a:输出颜色
  17. findstr /a:%q% . █*
  18. ::删除掉 :
  19. set /p=<nul
  20. ::控制每次循环都比上一次多一个█
  21. if %k% == %kk% (goto h) else (goto s)
  22. :h
  23. ::控制循环结束
  24. if %kk% == 21 del █&echo &pause>nul&exit
  25. set /a n=21-%KK%
  26. for /l %%a in (1 1 %n%) do (set /p=█<nul)
  27. for /l %%a in (1 1 6) do (set /p=<nul)
  28. :: 控制颜色循环
  29. if %p% gtr 10 (goto a) else (goto b)
复制代码

作者: plp626    时间: 2011-5-13 11:53

开两个进程,一个拷贝,另一个直接输出滚动条(可以echo ... 也可以title ... ),代码简洁又可读性好。
作者: cd309420    时间: 2011-5-13 13:38

这样虽然简单了,但却有2个窗口了。自己虽然知道,但其他人根本不知道2个窗口有什么用了。
作者: CrLf    时间: 2011-5-13 13:42

用start /b就是单窗口了,不过注意显示内容不能换行,否则会乱
作者: cd309420    时间: 2011-5-13 14:32

那上面那个进度条如何使它重复显示呢?滚动完一次继续第二次、第三次……无限的重复。
作者: batman    时间: 2011-5-13 20:18

本帖最后由 batman 于 2011-5-13 20:24 编辑

效果演示:
  1. @echo off&setlocal enabledelayedexpansion
  2. if defined flag goto next
  3. title 进度条
  4. mode con cols=60 lines=10
  5. call :get_tab tab
  6. for /l %%a in (1,1,22) do set "t=!t!"
  7. echo,&echo,&echo,
  8. echo %tab%┌────────────────────┐
  9. echo %tab%│                                        │
  10. echo %tab%└────────────────────┘
  11. echo %tab%%t%&set /p=%tab%│<nul
  12. set "flag=a"
  13. start /b %~fs0
  14. :lp
  15. for /l %%a in (1,1,20) do (
  16.    set /p=■<nul
  17.    for /l %%a in (1,1,500) do echo>nul
  18. )
  19. for /l %%a in (1,1,40) do (
  20.     set /p= <nul
  21.     for /l %%a in (1,1,500) do echo>nul
  22. )
  23. goto lp   
  24. :next
  25. ::::::这里改成你的代码::::::
  26. for /l %%a in (1,1,100000) do echo>nul
  27. ::::::这里改成你的代码::::::
  28. taskkill /f /fi "windowtitle eq 进度条*" /im "cmd.exe">nul 2>nul
  29. exit
  30. :get_tab
  31. for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined %1 set "%1=%%a"
  32. call,set "%1=%%%1:~,-1%%"
复制代码

作者: cd309420    时间: 2011-5-13 23:42

超版这代码写得太棒了。我不要进度条倒退的效果,只要重复前进的效果怎么改呢?
作者: cd309420    时间: 2011-5-13 23:44

OK,问题解决,把倒退时间改成0就OK了。  谢谢超版。
作者: batman    时间: 2011-5-13 23:46

7# cd309420
  1. @echo off&setlocal enabledelayedexpansion
  2. if defined flag goto next
  3. title 进度条
  4. mode con cols=60 lines=10
  5. call :get_tab tab
  6. for /l %%a in (1,1,22) do set "t=!t!"
  7. for /l %%a in (1,1,40) do set "cl=!cl! "
  8. echo,&echo,&echo,
  9. echo %tab%┌────────────────────┐
  10. echo %tab%│                                        │
  11. echo %tab%└────────────────────┘
  12. echo %tab%%t%&set /p=%tab%│<nul
  13. set "flag=a"
  14. start /b %~fs0
  15. :lp
  16. for /l %%a in (1,1,20) do (
  17.    set /p=■<nul
  18.    for /l %%a in (1,1,500) do echo>nul
  19. )
  20. set /p=%cl%<nul
  21. goto lp   
  22. :next
  23. ::::::这里改成你的代码::::::
  24. for /l %%a in (1,1,100000) do echo>nul
  25. ::::::这里改成你的代码::::::
  26. taskkill /f /fi "windowtitle eq 进度条*" /im "cmd.exe">nul 2>nul
  27. exit
  28. :get_tab
  29. for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined %1 set "%1=%%a"
  30. call,set "%1=%%%1:~,-1%%"
复制代码

作者: applba    时间: 2011-5-16 03:20

学习了,我只知道续行的两个方法:
<nul
echo ^
作者: batman    时间: 2011-5-16 10:53

10# applba
这可不是续行,这是多行回退技术!
作者: cd309420    时间: 2011-5-16 16:51

11# batman


超版,这种方法确实解决了这个问题,不过用这种方法CPU占用率相当高。不太理想。




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