中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论] CMD 下进度条实用化的问题。[求精]
作者:
标题: [讨论] CMD 下进度条实用化的问题。[求精] 上一主题 | 下一主题
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『楼 主』:  [讨论] CMD 下进度条实用化的问题。[求精]

经过目前的测试。。大家觉得好的话。请给我加分。呵呵

复制文件的进度条显示问题得到初步解决!

利用点: start /min copy 路径:\文件名 路径:\做多线程的运行。。
难点:获取硬盘拷贝文件的速率问题。
自己写了一个批处理做为测试,该值为每微妙/86000字节(值向上取整的结果)
注意,不同规格的硬盘有不同的结果。
需要大家自己测试。(自己已经解决,而且做为进度条提示就是评估复制时间)

算法思想。

1,利用 dir 指令获取 拷贝 文件的文件大小。
2,文件大小除去硬盘传输速率得到动画的延时时间
3,利用这个时间写动画。

我在下面的一楼里就直接把这个代码给出来了。
注:代码经过精简,省去了第一步。。(因为是算法嘛:)

[ Last edited by flyinspace on 2007-4-1 at 02:34 PM ]



知,不觉多。不知,乃求知
2007-4-2 03:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 2 楼』:  先用一楼。一会发代码

@echo off & SetLocal EnableDelayedExpansion
set BackSpace=
set RateBar=□
set Rate=0
set AllFile=1
set ExistFile=0
set FileName=测试.rar
set /a FileSize=42719467
set /a CopySpeed=86500
set /a UseTime=%FileSize%/%CopySpeed%
set /a ShowTime=%UseTime%/100
set Rate_Num=0
set Space_Num=11
set /p=正在拷贝文件:[%FileName%],需用时间:%UseTime%微秒<nul & echo.
echo ---------------------------------------------------
rem start /min [path]FileName [path]
set /p=目前已经完成:                      <nul
for /l %%i in (0,1,100) do (
        set /a output=%%i%%10
        if "!output!"=="0" (
                rem echo The %%i Time
                set /p=!BackSpace!<nul
                set /a Space_Num=!Space_Num!-1
                set /a Rate_Num=!Rate_Num!+1
                call :PutChar !Rate_Num! !Space_Num!
                )
        if %%i LSS 10 set /p=:  %%i%%<nul
        if %%i GEQ 10 set /p=: %%i%%<nul
        call :ProcDelay %ShowTime%
        set /p=<nul
        )
echo.
echo 拷贝已经完成!
echo.

goto EXIT
::::::::::::::输出空格:::::::::::::::::::::::
:PutChar _num_ _a_
        for /l %%i in (1,1,%1) do (
                rem echo !RateBar!
                set /p=!RateBar!<nul
                )

        for /l %%i in (1,1,%2) do (
                set /p=  <nul
                )


goto :EOF
::::::::::::::延时子程序:::::::::::::::::::::
:ProcDelay _Delay_
for /f "tokens=1-4 delims=:. " %%i in ("%time%") do set start=%%i%%j%%k%%l
:_TimeReturn_
        for /f "tokens=1-4 delims=:. " %%i in ("%time%") do set end=%%i%%j%%k%%l
        set /a s=%end%-%start%
        if %s% LSS %1 goto _TimeReturn_
        ENDLOCAL & GOTO :EOF
:EXIT
pause

[ Last edited by flyinspace on 2007-4-1 at 02:25 PM ]

   此帖被 +4 点积分        点击查看详情   
评分人:【 huzixuan 分数: +4  时间:2007-4-2 07:01




知,不觉多。不知,乃求知
2007-4-2 03:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 3 楼』:  

其实,该代码不少代码都是借鉴别人的。
例如延时子程序。(作者未知)

但其他的则是根据c++里面的算法。。
利用set /p的特性完成的。。

这个程序和网上已经有的进度条不同。。
是可以实用化的。



知,不觉多。不知,乃求知
2007-4-2 03:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 4 楼』:  

思路不错,但是硬盘传输速率随文件大小一般变化较大,而且微秒值太小,批处理基本反映不过来,毫秒也勉强

[ Last edited by zh159 on 2007-4-1 at 03:10 PM ]

2007-4-2 04:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 5 楼』:  

楼上提得不错。

因为是提出算法。

所以没有给出错误的判断。。。

在我编写的实际批处理例子中。我的方法有不同。。

如果文件的大小小于 86000 * 10 则,动画过程没有延时。。。

2,争对不同的硬盘。我获取硬盘的速率是根据拷贝一个cmd.exe 到 另一个盘的时间做为基准的。。。

3,还有判断,若是同一个盘内的拷贝,也是动画没有延时的。。

这个是实际应用的处理。。

目前还在测试中,就没有在这里献丑了。

提出上面的算法只是把个人的思路提出来和大家一起讨论。。。

实际的代码已经有 32K大小了。。

而且测试也非常成功,只是在copy文件太大的时候,会有点不准。。有1到3秒的误差。

[ Last edited by flyinspace on 2007-4-1 at 03:27 PM ]



知,不觉多。不知,乃求知
2007-4-2 04:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huzixuan
高级用户




积分 537
发帖 219
注册 2006-10-31
来自 芜湖
状态 离线
『第 6 楼』:  

饿,没看懂



江湖远
碧空长
路茫茫

    一个人漫无目的的奔跑,风,刺骨的冷....
2007-4-2 07:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 7 楼』:  

那里不懂呢??



知,不觉多。不知,乃求知
2007-4-2 09:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 8 楼』:  

运行命令行X(比如COPY 一个大文件)但它要等运行完后才能执行其他代码,有没有办法让它和进度条同时执行和显示?

2007-10-2 12:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 9 楼』:  

copy /z




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2007-10-2 12:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jaceyxp
初级用户





积分 21
发帖 10
注册 2007-3-30
状态 离线
『第 10 楼』:  

我要运行:

xcopy c:\abc\*.* /s d:\aaa /y
这个命令加在那里??

2009-1-12 15:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: