Board logo

标题: [数值计算] 进度条中的百分比计算 [打印本页]

作者: cjiabing    时间: 2011-8-4 20:44     标题: 进度条中的百分比计算

用搜索文件的方式做了尝试,没有做成其它通用版。
计算过程中仍然有些小问题,使得文件数目较大时出现错误。
其它问题有待改善。

计算方法介绍:
假设拷贝20(z)个文件,复制到第11(x)个时,
它的进度(y)是:11/20
将它换算成公式:y=x/z
再折换成百分比:N=M/100
它们成等比关系:
        x         M
N = ---- = ------  = 1
        z        100

X随着复制文件的进行而递增,是可知的,则M也随之递增,是可求解的。
比如,当复制到第11个时,M的值(每次递增的百分数)应该是:

M=X*100/Z=11*100/20=55

所以,此时的百分比应该是 55%。
但是,当文件超过100个时,M=X*100/Z,就不成立了。需要相应地修改成 M=X*1000/Z 、M=X*10000/Z 等其它更大的分子。
所以,在计算前你还需判断文件多少的区间。

由于SET无法进行浮点运算,运算结果往往会产生很大的误差。可以使用三方的conset.exe计算,不过在文件比较多时,就会拖慢速度了。
使用进度条本身也会给原程序造成累赘,比如一个copy命令可以直接拷贝完所有文件,但假如用进度条后,就得一个一个数着文件来copy了。
进度条虽然花哨了点,但在P人看来,它使得我们的P更多了点乐趣。不足之处请指正。

  1. @echo off
  2. title 进度条中的百分比计算V1.0
  3. call :JinDuTiao
  4. pause
  5. exit
  6. :JinDuTiao
  7. set tm=%time%
  8. if "%1"=="" call :JinDuTiao0 echo&echo 结束时间:%time%&goto :eof
  9. :JinDuTiao0
  10. setlocal enabledelayedexpansion
  11. echo;正在统计文件总数……
  12. set /a JDT=J_ZS=J_QJ=J_JS=0
  13. for /f "tokens=1,2" %%a in ('dir /s %2') do if 个文件==%%b set J_ZS=%%a
  14. echo 共 !J_ZS! 个文件
  15. echo 开始查找文件……
  16. ::判断文件个数区间段。0-100,100-1000,……
  17. for %%a in (0,100,1000,10000,100000,1000000) do (
  18. if !J_ZS! leq %%a if !J_ZS! gtr !J_QJ! (
  19. set J_QJ0=%%a
  20. set /a J_QJ1=!J_QJ!/100
  21. )
  22. set J_QJ=%%a
  23. )
  24. ::将数据与100进行等比,比例计算基础:x\zs=y\100(x,单个文件进度;zs,文件总数;y,单个百分数;100,百分百区间段)
  25. for /f "tokens=*" %%a in ('dir /s /b %2') do (
  26. set /a J_JS+=1
  27. set /a J_JS1=!J_JS!*!J_QJ0!/!J_ZS!
  28. if !J_ZS! leq 100 (set /a JDT=!J_JS1!/1) else (set /a JDT=!J_JS1!/!J_QJ1!/10)
  29. set /a J_JS2=!JDT!/2
  30. )>nul 2>nul&(
  31. %1 %%a
  32. for /l %%i in (1,1,!J_JS2!) do set /p=^><nul
  33. if !J! lss 101 (set /p= 进度: !JDT!%%<nul) else (set /p= 进度: 100%%<nul)
  34. echo,
  35. )
  36. echo,
  37. echo —————————————————
  38. echo 处理文件:!J_ZS! 个;
  39. echo 开始时间:%tm:~0,2% 时 %tm:~3,2% 分 %tm:~6,2% 秒;
  40. echo 结束时间:%time:~0,2% 时 %time:~3,2% 分 %time:~6,2% 秒。
  41. echo —————————————————
  42. echo,
  43. goto :eof
  44. ::调用方法:call :JinDuTiao 命令 "路径"
  45. ::调用举例:call :JinDuTiao echo f:\mp3
  46. ::路径包含空格需双引号。缺省时,命令=echo,路径=当前路径。
  47. ::默认使用set计算,但精确度不高。使用conset.exe可以更精确,但速度较慢。
  48. ::缺点:进度条没有显示一条,而是显示多条。使用进度条会增加原命令的操作时间。
  49. ::文件数超过万时,计算有误,出现负数。
复制代码

作者: CUer    时间: 2011-8-4 20:59

复制文件时/z选择不是可以直接显示百分比吗




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