用搜索文件的方式做了尝试,没有做成其它通用版。
计算过程中仍然有些小问题,使得文件数目较大时出现错误。
其它问题有待改善。
计算方法介绍:
假设拷贝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更多了点乐趣。不足之处请指正。
- @echo off
- title 进度条中的百分比计算V1.0
- call :JinDuTiao
- pause
- exit
- :JinDuTiao
- set tm=%time%
- if "%1"=="" call :JinDuTiao0 echo&echo 结束时间:%time%&goto :eof
- :JinDuTiao0
- setlocal enabledelayedexpansion
- echo;正在统计文件总数……
- set /a JDT=J_ZS=J_QJ=J_JS=0
- for /f "tokens=1,2" %%a in ('dir /s %2') do if 个文件==%%b set J_ZS=%%a
- echo 共 !J_ZS! 个文件
- echo 开始查找文件……
- ::判断文件个数区间段。0-100,100-1000,……
- for %%a in (0,100,1000,10000,100000,1000000) do (
- if !J_ZS! leq %%a if !J_ZS! gtr !J_QJ! (
- set J_QJ0=%%a
- set /a J_QJ1=!J_QJ!/100
- )
- set J_QJ=%%a
- )
- ::将数据与100进行等比,比例计算基础:x\zs=y\100(x,单个文件进度;zs,文件总数;y,单个百分数;100,百分百区间段)
- for /f "tokens=*" %%a in ('dir /s /b %2') do (
- set /a J_JS+=1
- set /a J_JS1=!J_JS!*!J_QJ0!/!J_ZS!
- if !J_ZS! leq 100 (set /a JDT=!J_JS1!/1) else (set /a JDT=!J_JS1!/!J_QJ1!/10)
- set /a J_JS2=!JDT!/2
- )>nul 2>nul&(
- %1 %%a
- for /l %%i in (1,1,!J_JS2!) do set /p=^><nul
- if !J! lss 101 (set /p= 进度: !JDT!%%<nul) else (set /p= 进度: 100%%<nul)
- echo,
- )
- echo,
- echo —————————————————
- echo 处理文件:!J_ZS! 个;
- echo 开始时间:%tm:~0,2% 时 %tm:~3,2% 分 %tm:~6,2% 秒;
- echo 结束时间:%time:~0,2% 时 %time:~3,2% 分 %time:~6,2% 秒。
- echo —————————————————
- echo,
- goto :eof
- ::调用方法:call :JinDuTiao 命令 "路径"
- ::调用举例:call :JinDuTiao echo f:\mp3
- ::路径包含空格需双引号。缺省时,命令=echo,路径=当前路径。
- ::默认使用set计算,但精确度不高。使用conset.exe可以更精确,但速度较慢。
- ::缺点:进度条没有显示一条,而是显示多条。使用进度条会增加原命令的操作时间。
- ::文件数超过万时,计算有误,出现负数。
复制代码
|