首页 > V.B.T > 教你写真正的进度条

教你写真正的进度条

2008年11月15日 发表评论 阅读评论

来源:非常批处理论坛(http://bbs.verybat.org/thread-14058-1-1.html)
作者:清风09

如果你还不懂进度条,可以先看看这个,有详细注解
极度简单的进度条

在批处理中加入一个进度条。单纯的让它从1%显示到100%
我想这个很多人都会,也许你也会。

外行的看了,也许会很惊奇。或者感觉很高深
但是写代码的你。应该是知道的,它仅仅只具有视觉上的效果而已
说白了,其实他妈的就是骗人的

那么,进度条是不是可以真正的反应出批处理的执行进度呢?    
可以。现在,我就教你写,其他的不多说
我举两个简单的例子并给出相应的代码,你一看就会了。

例一:
  批处理wind.bat内容为

<br />@echo off<br />mkdir e:&#92;wind<br />bread>e:&#92;wind&#92;hello.txt<br />rmdir e:&#92;wind&#92;hello.txt /s /q

非常简单的批处理,它的处理过程为
 创建文件夹  新建文本   删除文件夹

那么,如果我要显示进度的话,其实很简单,
这个批处理共有三个过程。我们只要把我的进度条也分为三个过程,一一对应,就可以了
当批处理执行第一步,进度显示到30%
      第二步,  显示到60%
      第三步  则显示到100%

代码为:

@echo off&setlocal enabledelayedexpansion<br />       mkdir e:&#92;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:&#92;wind&#92;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:&#92;wind&#92; /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/

分类: V.B.T 标签: ,
  1. defanive
    2009年1月10日13:04 | #1

    我素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
    不过这个的最大缺点就是耗时增长了一半,计算花了不少时间

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
*