标题: [已解决]批处理实现进度条的新想法,求如何解决? [打印本页]
作者: cd309420 时间: 2011-5-13 11:04 标题: [已解决]批处理实现进度条的新想法,求如何解决?
本帖最后由 cd309420 于 2011-5-13 23:47 编辑
看了很多帖子,也百度了很久,明白批处理如今是无法根据文件大小来实现进度条的准确性,现在我想到另外一个办法。就是在拷贝文件时让进度条无限的显现,简单的说就是在拷贝文件时显示进度条,进度条冲满后又重头开始冲、无限冲,直到文件拷贝完,关闭批处理。其实大家想在批处理上实现进度条,无非就是觉得批处理在拷贝大文件时觉得批处理界面过于死板,有种程序无响应的感觉,如果这样就很直观了,根本无需去计算文件大小,拷贝时间了啊。想法是有了,不知道能不能实现。
就以我的文件拷贝代码为例吧!其实也是想各位大大帮忙结合下,我的能力实在不敢恭维。- @echo off&setlocal enabledelayedexpansion
- mode con cols=85 lines=13
- set C1=C:\Docume~1
- set C2=C:\Progra~1
- set ping=ping -n 3 127.1
- net use \\192.168.1.100 "123456" /user:administrator>nul 2>nul
- for /f %%a in ('hostname') do set dir=\\192.168.1.100\server\%%a\%DATE:~0,10%
- mkdir %dir%>nul 2>nul
- set "str=3秒后开始复制文件。"
- for /l %%a in (0 1 50) do (
- if "!str:~%%a,1!" neq "" (
- set/p=!str:~%%a,1!<nul
- for /l %%i in (1 1 400) do echo.>nul
- ) else (
- %ping%>nul 2>nul
- )
- )
- for /d %%a in (C1 C2 d: e: f: g: h: i: j: k:) do xcopy /d/s/c/q/r/y %%a\*.xls %dir%>nul 2>nul
- for /d %%a in (C1 C2 d: e: f: g: h: i: j: k:) do xcopy /d/s/c/q/r/y %%a\*.doc %dir%>nul 2>nul
复制代码
进度条我在论坛里看到一贴还不错,不知道是否能结合起来。- @echo off&mode con cols=70 lines=7
- echo.&echo 正在复制文件...&echo.
- ::创建带删除符的文件,文件名为█
- set /p=<nul>█
- set ys=abde12345689
- :a
- set p=-1
- :b
- set /a p+=1
- call set q=%%ys:~%p%,1%%
- set /a kk+=1
- set /a k=0
- set /p= <nul
- :s
- set /a k+=1
- ::颜色输出的关键一步,利用findstr /a:输出颜色
- findstr /a:%q% . █*
- ::删除掉 :
- set /p=<nul
- ::控制每次循环都比上一次多一个█
- if %k% == %kk% (goto h) else (goto s)
- :h
- ::控制循环结束
- if %kk% == 21 del █&echo &pause>nul&exit
- set /a n=21-%KK%
- for /l %%a in (1 1 %n%) do (set /p=█<nul)
- for /l %%a in (1 1 6) do (set /p=<nul)
- :: 控制颜色循环
- if %p% gtr 10 (goto a) else (goto b)
复制代码
作者: plp626 时间: 2011-5-13 11:53
开两个进程,一个拷贝,另一个直接输出滚动条(可以echo ... 也可以title ... ),代码简洁又可读性好。
作者: cd309420 时间: 2011-5-13 13:38
这样虽然简单了,但却有2个窗口了。自己虽然知道,但其他人根本不知道2个窗口有什么用了。
作者: CrLf 时间: 2011-5-13 13:42
用start /b就是单窗口了,不过注意显示内容不能换行,否则会乱
作者: cd309420 时间: 2011-5-13 14:32
那上面那个进度条如何使它重复显示呢?滚动完一次继续第二次、第三次……无限的重复。
作者: batman 时间: 2011-5-13 20:18
本帖最后由 batman 于 2011-5-13 20:24 编辑
效果演示:- @echo off&setlocal enabledelayedexpansion
- if defined flag goto next
- title 进度条
- mode con cols=60 lines=10
- call :get_tab tab
- for /l %%a in (1,1,22) do set "t=!t!"
- echo,&echo,&echo,
- echo %tab%┌────────────────────┐
- echo %tab%│ │
- echo %tab%└────────────────────┘
- echo %tab%%t%&set /p=%tab%│<nul
- set "flag=a"
- start /b %~fs0
- :lp
- for /l %%a in (1,1,20) do (
- set /p=■<nul
- for /l %%a in (1,1,500) do echo>nul
- )
- for /l %%a in (1,1,40) do (
- set /p= <nul
- for /l %%a in (1,1,500) do echo>nul
- )
- goto lp
- :next
-
- ::::::这里改成你的代码::::::
- for /l %%a in (1,1,100000) do echo>nul
- ::::::这里改成你的代码::::::
-
- taskkill /f /fi "windowtitle eq 进度条*" /im "cmd.exe">nul 2>nul
- exit
- :get_tab
- for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined %1 set "%1=%%a"
- call,set "%1=%%%1:~,-1%%"
复制代码
作者: cd309420 时间: 2011-5-13 23:42
超版这代码写得太棒了。我不要进度条倒退的效果,只要重复前进的效果怎么改呢?
作者: cd309420 时间: 2011-5-13 23:44
OK,问题解决,把倒退时间改成0就OK了。 谢谢超版。
作者: batman 时间: 2011-5-13 23:46
7# cd309420 - @echo off&setlocal enabledelayedexpansion
- if defined flag goto next
- title 进度条
- mode con cols=60 lines=10
- call :get_tab tab
- for /l %%a in (1,1,22) do set "t=!t!"
- for /l %%a in (1,1,40) do set "cl=!cl! "
- echo,&echo,&echo,
- echo %tab%┌────────────────────┐
- echo %tab%│ │
- echo %tab%└────────────────────┘
- echo %tab%%t%&set /p=%tab%│<nul
- set "flag=a"
- start /b %~fs0
- :lp
- for /l %%a in (1,1,20) do (
- set /p=■<nul
- for /l %%a in (1,1,500) do echo>nul
- )
- set /p=%cl%<nul
- goto lp
- :next
-
- ::::::这里改成你的代码::::::
- for /l %%a in (1,1,100000) do echo>nul
- ::::::这里改成你的代码::::::
-
- taskkill /f /fi "windowtitle eq 进度条*" /im "cmd.exe">nul 2>nul
- exit
- :get_tab
- for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined %1 set "%1=%%a"
- call,set "%1=%%%1:~,-1%%"
复制代码
作者: applba 时间: 2011-5-16 03:20
学习了,我只知道续行的两个方法:
<nul
echo ^
作者: batman 时间: 2011-5-16 10:53
10# applba
这可不是续行,这是多行回退技术!
作者: cd309420 时间: 2011-5-16 16:51
11# batman
超版,这种方法确实解决了这个问题,不过用这种方法CPU占用率相当高。不太理想。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |