![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-11 04:33 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [讨论] CMD 下进度条实用化的问题。[求精] |
| 可打印版本 1,716 / 9 |
| 第1楼 flyinspace | 发表于 2007-04-02 03:17 |
| 银牌会员 发帖 517 积分 1,206 | |
|
[讨论] CMD 下进度条实用化的问题。[求精] 经过目前的测试。。大家觉得好的话。请给我加分。呵呵
复制文件的进度条显示问题得到初步解决! 利用点: start /min copy 路径:\文件名 路径:\做多线程的运行。。 难点:获取硬盘拷贝文件的速率问题。 自己写了一个批处理做为测试,该值为每微妙/86000字节(值向上取整的结果) 注意,不同规格的硬盘有不同的结果。 需要大家自己测试。(自己已经解决,而且做为进度条提示就是评估复制时间) 算法思想。 1,利用 dir 指令获取 拷贝 文件的文件大小。 2,文件大小除去硬盘传输速率得到动画的延时时间 3,利用这个时间写动画。 我在下面的一楼里就直接把这个代码给出来了。 注:代码经过精简,省去了第一步。。(因为是算法嘛:) [ Last edited by flyinspace on 2007-4-1 at 02:34 PM ] |
|
| 第2楼 flyinspace | 发表于 2007-04-02 03:17 |
| 银牌会员 发帖 517 积分 1,206 | |
|
先用一楼。一会发代码 @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=正在拷贝文件:,需用时间:%UseTime%微秒<nul & echo. echo --------------------------------------------------- rem start /min FileName 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 ] |
|
| 第3楼 flyinspace | 发表于 2007-04-02 03:55 |
| 银牌会员 发帖 517 积分 1,206 | |
|
其实,该代码不少代码都是借鉴别人的。
例如延时子程序。(作者未知) 但其他的则是根据c++里面的算法。。 利用set /p的特性完成的。。 这个程序和网上已经有的进度条不同。。 是可以实用化的。 |
|
| 第4楼 zh159 | 发表于 2007-04-02 04:06 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
思路不错,但是硬盘传输速率随文件大小一般变化较大,而且微秒值太小,批处理基本反映不过来,毫秒也勉强
[ Last edited by zh159 on 2007-4-1 at 03:10 PM ] |
|
| 第5楼 flyinspace | 发表于 2007-04-02 04:09 |
| 银牌会员 发帖 517 积分 1,206 | |
|
楼上提得不错。
因为是提出算法。 所以没有给出错误的判断。。。 在我编写的实际批处理例子中。我的方法有不同。。 如果文件的大小小于 86000 * 10 则,动画过程没有延时。。。 2,争对不同的硬盘。我获取硬盘的速率是根据拷贝一个cmd.exe 到 另一个盘的时间做为基准的。。。 3,还有判断,若是同一个盘内的拷贝,也是动画没有延时的。。 这个是实际应用的处理。。 目前还在测试中,就没有在这里献丑了。 提出上面的算法只是把个人的思路提出来和大家一起讨论。。。 实际的代码已经有 32K大小了。。 而且测试也非常成功,只是在copy文件太大的时候,会有点不准。。有1到3秒的误差。 [ Last edited by flyinspace on 2007-4-1 at 03:27 PM ] |
|
| 第6楼 huzixuan | 发表于 2007-04-02 07:01 |
| 高级用户 发帖 219 积分 537 来自 芜湖 | |
|
饿,没看懂
|
|
| 第7楼 flyinspace | 发表于 2007-04-02 09:34 |
| 银牌会员 发帖 517 积分 1,206 | |
|
那里不懂呢??
|
|
| 第8楼 uiopuiop | 发表于 2007-10-02 12:39 |
| 中级用户 发帖 211 积分 400 | |
|
运行命令行X(比如COPY 一个大文件)但它要等运行完后才能执行其他代码,有没有办法让它和进度条同时执行和显示?
|
|
| 第9楼 electronixtar | 发表于 2007-10-02 12:48 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
copy /z
|
|
| 第10楼 jaceyxp | 发表于 2009-01-12 15:02 |
| 初级用户 发帖 10 积分 21 | |
|
我要运行:
xcopy c:\abc\*.* /s d:\aaa /y 这个命令加在那里?? |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |