教你写真正的进度条
来源:非常批处理论坛(http://bbs.verybat.org/thread-14058-1-1.html)
作者:清风09
如果你还不懂进度条,可以先看看这个,有详细注解
极度简单的进度条
在批处理中加入一个进度条。单纯的让它从1%显示到100%
我想这个很多人都会,也许你也会。
外行的看了,也许会很惊奇。或者感觉很高深
但是写代码的你。应该是知道的,它仅仅只具有视觉上的效果而已
说白了,其实他妈的就是骗人的
那么,进度条是不是可以真正的反应出批处理的执行进度呢?
可以。现在,我就教你写,其他的不多说
我举两个简单的例子并给出相应的代码,你一看就会了。
例一:
批处理wind.bat内容为
<br />@echo off<br />mkdir e:\wind<br />bread>e:\wind\hello.txt<br />rmdir e:\wind\hello.txt /s /q
非常简单的批处理,它的处理过程为
创建文件夹 新建文本 删除文件夹
那么,如果我要显示进度的话,其实很简单,
这个批处理共有三个过程。我们只要把我的进度条也分为三个过程,一一对应,就可以了
当批处理执行第一步,进度显示到30%
第二步, 显示到60%
第三步 则显示到100%
代码为:
@echo off&setlocal enabledelayedexpansion<br /> mkdir e:\wind<br />for /l %%1 in (1 1 15)do (set /a j1=%%1*2-1,j2=%%1*2<br />set a=!a!^><br />cls&echo.&echo.&echo.&echo 正在处理...!j1!%%<br />cls&echo.&echo.&echo.&echo 正在处理...!j2!%%<br />echo !a!<br />for /l %%1 in (1 1 99)do echo.>nul)<br />pause<br /><br /> bread>e:\wind\hello.txt<br />for /l %%1 in (16 1 30)do (set /a j1=%%1*2-1,j2=%%1*2<br />set a=!a!^><br />cls&echo.&echo.&echo.&echo 正在处理...!j1!%%<br />cls&echo.&echo.&echo.&echo 正在处理...!j2!%%<br />echo !a!<br />for /l %%1 in (1 1 99)do echo.>nul)<br />pause<br /><br /> rmdir e:\wind\ /s /q<br />for /l %%1 in (31 1 50)do (set /a j1=%%1*2-1,j2=%%1*2<br />set a=!a!^><br />cls&echo.&echo.&echo.&echo 正在处理...!j1!%%<br />cls&echo.&echo.&echo.&echo 正在处理...!j2!%%<br />echo !a!<br />for /l %%1 in (1 1 99)do echo.>nul)<br />pause<br />
因这这个例子很简单,处理非常快,为了显示效果,每个过程下,
都加了一个暂停
这样能看明白吧?好下面再举个难一点的例子
例二:
假设有一个文本,内容有数万行,
我要做的事,很简单,只是在每行后面加上字符串”wind”
因为数行比较多,所以会有一个等待的时间
为了我能知道目前处理到什么程度,所以要加一个进度条
那么这样的进度又怎么写呢?
也不难,同样还是把批处理分为若干个部分
现在先用以下命令事先生成一个临时文本
内容为10909行,以便一会测试
for /l %%1 in (1 1 10909)do echo %%1>>wind.txt
假设批处理为
<br />@echo off<br />for /f %%1 in (wind.txt)do echo wind%%1>>wind09.txt
这个批处理很简单
作用是在每行后面加上字符串”wind”并输出
如果要加上进度条的话
可以把文本大致分为5份
执行到总行数的5分之1时,显示到20%
执行到总行数的5分之2时,显示到40%
执行到总行数的5分之3时,显示到60%
执行到总行数的5分之4时,显示到80%
执行到总行数的5分之5时,显示到100%
[当然也可以是10份,3份
关键要从实际情况和个人爱好考虑合适的行数
分的越多,进度条的实时性越高,同步性也就越高]
思路是
先计算文本的总行数
然后再算出 5分之1 5分之2 5分之3……..分别是第几行
当批处理执行到相应的行数时,就显示相应的进度
代码:
<br />@echo off&setlocal enabledelayedexpansion<br />for /f %%1 in (wind.txt)do set /a TL+=1<br />set /a p1=%TL%/5<br />set /a p2=%TL%/5*2<br />set /a p3=%TL%/5*3<br />set /a p4=%TL%/5*4<br />set /a p5=%TL%<br />for /f %%1 in (wind.txt)do (set /a line+=1<br />echo %%1wind>>wind09.txt<br />if !line!==!p1! set step=1 1 10<br />if !line!==!p2! set step=11 1 20<br />if !line!==!p3! set step=21 1 30<br />if !line!==!p4! set step=31 1 40<br />if !line!==!p5! set step=41 1 50<br />for %%3 in (%p1% %p2% %p3% %p4% %p5%)do if !line!==%%3 for /l %%2 in (!step!)do (set /a j1=%%2*2-1,j2=%%2*2<br />set a=!a!^><br />cls&echo.&echo.&echo.&echo 正在处理...!j1!%%<br />cls&echo.&echo.&echo.&echo 正在处理...!j2!%%<br />echo !a!<br />for /l %%t in (1 1 99)do echo.>nul))<br />pause<br />
以上两个代码仅仅是例子,代码比较粗糙,不要介意。
实时进度条,关键就是把批处理的执行过程适当的拆分为若干部分
好了,就这样了。有不明白的,或者有更好的方法的,可以讨论下
转载请注明:woyigui's blog [http://www.woyigui.cn/]
本文标题:教你写真正的进度条
本文地址:http://www.woyigui.cn/2008/11/15/bat-Progress-bar/
我素VeryBat的Defanive
就例子来说,应该还有更好的方法
首先,生成被处理文本a.txt,10000行
@echo off
setlocal enabledelayedexpansion
type nul>a.txt
for /l %%a in (1,1,10000) do echo !random!>>a.txt
然后,处理文本的批处理
@echo off
setlocal enabledelayedexpansion
set totalline=0
set nowline=0
set percent=0
for /f %%a in (a.txt) do set /a totalline+=1
for /f %%a in (a.txt) do (
echo random=%%a>>b.txt
set /a nowline+=1
set /a percent=!nowline!*100/%totalline%
set /p =!percent!%%<nul
set /p =<nul
)
大概思路就是首先计算出总行数,然后每处理一行就计算一次百分比,然后实时显示出来
cls闪得太厉害,用set/p,就是删除符^H
不过这个的最大缺点就是耗时增长了一半,计算花了不少时间
[回复]