Board logo

标题: 高难度的显示进度的批处理代码有待高人分析 [打印本页]

作者: jellord     时间: 2007-3-18 12:21    标题: 高难度的显示进度的批处理代码有待高人分析

@echo off
:: 模拟进度,有剩余时间、已完成进度、进度条的显示
:: code by bg 2006-10-8 CMD@XP
color 1f
title.
mode con lines=10
rem   进度条 ▉▉▉▉▉
set work=0
set n=0
set mo=0
set number=0
rem  all是总数
set all=60
set time=%all%
:show

:check
if %number% GTR %mo% set num=%num%▉&set /a mo=%mo%+1&goto check

:2

cls
echo  进度: %n% / %all%                                          剩余时间:%time%秒
echo.
echo.
echo                                  完成 %work% %%%
echo.
if not "%num%"=="" echo       %num%
if not "%num%"=="" echo       %num%

if %work%==100 goto end

ping 127.1 -n 1 >nul
set /a n=%n%+1
set /a time=%all%-%n%
set /a work=(%n%)*100/(%all%)
set /a number=%work%/3
set /a number=%number%+1
goto show
endlocal

:end
endlocal
pause>nul

请大家帮我分析一下该批处理的思路,实在看不懂,上面的show标签和2标签都没内容啊,为什么呢?check标签在后面的代码中也没看到被引用,那它怎么会被执行呢?请大家帮我分析一下,多谢多谢了!!!
作者: zh159     时间: 2007-3-18 12:34
:check
if %number% GTR %mo% set num=%num%▉&set /a mo=%mo%+1&goto check

%number%大于%mo%就会执行set num=%num%▉&set /a mo=%mo%+1&goto check并返回:check,小于则直接到下一步

[ Last edited by zh159 on 2007-3-18 at 12:04 AM ]
作者: zhoushijay     时间: 2007-3-18 13:02
@echo off

color 1f   \\设置背景颜色
title.         \\标题:
mode con lines=10   \\窗口大小
rem   进度条 ▉▉▉▉▉ \\注释,多命令无作用
set work=0                    
set n=0
set mo=0
set number=0                  \\此处为设置一系列变量
rem  all是总数
set all=60
set time=%all%
:show

:check
if %number% GTR %mo% set num=%num%▉&set /a mo=%mo%+1&goto check   \\如果%number% 大于 %mo%  则设置变量num=%num%▉(注意这里,因为变量num的值为=%num%▉ 所以到第二次循环到这里是后num的值就会变成=%num%▉▉  第3次为=%num%▉▉▉ )
:2

cls
echo  进度: %n% / %all%                                          剩余时间:%time%秒  \\显示的进度,由于下面有set /a n=%n%+1 所以第2次循环到这里n的值为 2,第3次为3  因此就会有  1/60   2/60  3/60 的效果
echo.
echo.
echo                                  完成 %work% %%% \\与 进度: %n%/%all% 原理相同
echo.
if not "%num%"=="" echo       %num%   \\上面的 num=%num%▉▉▉ 效果将在这里显示
if not "%num%"=="" echo       %num% \\上同

if %work%==100 goto end 在%work%值没到100之前将不断回到上面重新执行

ping 127.1 -n 1 >nu  停顿1秒l
set /a n=%n%+1       \\进度: %n% / %all%   %n%的值就是每次在这里+1
set /a time=%all%-%n%  \\%time%的值将每次在这里改变
set /a work=(%n%)*100/(%all%)   将%work%的值换算成%形式
set /a number=%work%/3   
set /a number=%number%+1  \\此命令配合上一行命令将使%number%值 大于%mo%值
从而满足条件执行:check下的语句
goto show   \\返回:show处,上面条件不满足时将会到达此处,
endlocal    \\此命令将是以上环境本地化,原来系统的环境将无法还原,估计是作者想搞恶作剧,建议测试的时候删除

:end
作者: jellord     时间: 2007-3-19 02:52
太感谢楼上了,不过还有一点小问题:
在代码中的第一个标签后面的代码是直接执行的吗?没有跳过第一个标签吧,否则后面所有的代码都会被跳过的,不知道是不是这样的?
作者: xycoordinate     时间: 2007-3-19 03:24
如何将它与"需要显示进度"的程序结合呢???
作者: axi     时间: 2007-3-20 01:30


  Quote:
Originally posted by xycoordinate at 2007-3-18 02:24 PM:
如何将它与"需要显示进度"的程序结合呢???

对了,能与正在安装的程序结合才有用呀。
作者: zhoushijay     时间: 2007-3-22 00:17
第一个标签第一次是不会运行的,因为 if 条件在第一次的时候不满足

关于如何嵌入操作中,本人看到这个帖子的时候有了点灵感,应该不难实现,等有空的时候发个上来,先在这里说下思路,大家也可以一起来研究研究。

比如copy的时候,不断 dir 那个文件,把文件大小的数字提取出来放入 进度: %n% / %all%,以次来控制他的条件是否满足
作者: zh159     时间: 2007-3-22 00:44
想想都知道:
比如你如何确定文件复制了1/10?!
如何复制了1/10暂停复制跳回显示进度条?!
进度条部分显示后如何跳回复制点?!

PS:别说你用rar分10卷压缩,然后一卷卷复制,再解压缩

copy倒是有个/z参数来显示复制进步百分比
作者: zhoushijay     时间: 2007-3-22 02:57
可以用shart命令重新跳出一个窗口来显示进程 将文件总大小传给%all%,将已复制的数字传给%n%,
现在主要的问题是不知道dir命令能否检测出一个未复制完的文件的实际大小
作者: zh159     时间: 2007-3-22 04:09
试过了,复制过程中显示文件的大小和原来的一样
作者: axi     时间: 2007-3-22 05:03


  Quote:
Originally posted by zh159 at 2007-3-21 11:44:
想想都知道:
比如你如何确定文件复制了1/10?!
如何复制了1/10暂停复制跳回显示进度条?!
进度条部分显示后如何跳回复制点?!

PS:别说你用rar分10卷压缩,然后一卷卷复制,再解压缩

copy倒是有个/z参数来显示复制进步百分比

原来 copy 有这个好用参数!请问如何提取这个由 copy /z 所得的进度百分比,并转到进度条中呢?

[ Last edited by axi on 2007-3-21 at 04:09 PM ]
作者: zh159     时间: 2007-3-22 05:48
这个参数的显示是copy自带的,如果你真想提取这个进度百分比,建议:
1、找软件高手
2、找微软

PS:批处理是单线程执行方式,每个批处理每次只能执行一个命令
作者: jackyggt     时间: 2007-3-30 13:27

作者: flyinspace     时间: 2007-3-30 13:38
哦?
我倒有一个想法。
不写剩余时间就可以了。
作者: bg     时间: 2007-4-5 18:51
这个批处理是我写的,我没有发出去,楼主怎么有??????!!!!!!
作者: jellord     时间: 2007-4-11 05:43
我就是从dos联盟上下载的啊,一个好多批处理的打包文件,真的是楼上写的,那真是不好意思了。喧宾夺主了。。。
作者: htysm     时间: 2007-4-11 11:02
是吗,那就真的有点搞笑了。
作者: studythedos     时间: 2007-7-29 21:12


  Quote:
ping 127.1 -n 1 >nu  停顿1秒

zhoushijay大侠好,
你的这里是笔误吧?指向空设备应该是 >nul 吧?
楼主的也是 nul 额..

当然要谢谢你的解释,对进度条的显示有所理解了,嘿嘿.
作者: livesweet     时间: 2007-7-30 08:56
这个我觉得是适用范围很小,顶多能与COPY结合,而且也很难完美结合,其他的程序也很难与他结合的!!
作者: zhhuang     时间: 2008-3-28 09:34
有用嘛