我想使用实时进度条,在编写代码或安装内容或加载文件时更新它。
示例:
@echo off
:main
echo Updating file...
[PROGRESS BAR HERE]
“PROGRESS BAR HERE”表示我想要放置实时进度条的部分。
答案 0 :(得分:3)
更简单在窗口标题中显示进度条:
@echo off
setlocal EnableDelayedExpansion
rem Count the number of files in this dir (just as an example)
set n=0
for %%f in (*.*) do set /A n+=1
rem Fill "bar" variable with 70 characters
set "bar="
for /L %%i in (1,1,70) do set "bar=!bar!X"
rem Fill "space" variable with filler spaces
set "space="
for /L %%i in (1,1,110) do set "space=!space!_"
rem "Process" the files and show the progress bar in the title
set i=0
echo Processing files:
for %%f in (*.*) do (
set /A i+=1, percent=i*100/n, barLen=70*percent/100
for %%a in (!barLen!) do title !percent!%% !bar:~0,%%a!%space%
echo !i!- %%f
ping -n 1 localhost > NUL
)
title MS-DOS
也许你必须稍微调整一下条形和空间变量的长度......
答案 1 :(得分:2)
只是一个骷髅。根据需要进行调整。
基本思路是输出带有进度条的行,并带有一个回车符返回到行的开头,并能够重新绘制前一行的下一个状态。
所有“有问题”的代码都包含在子程序中,因此您只需要call :drawProgressBar percentValue "operationText"
@echo off
setlocal enableextensions disabledelayedexpansion
for /l %%f in (0 1 100) do (
call :drawProgressBar %%f "up test with a long text that will not fit on screen unless you have a lot of space"
)
for /l %%f in (100 -1 0) do (
call :drawProgressBar %%f "going down test"
)
for /l %%f in (0 5 100) do (
call :drawProgressBar !random! "random test"
)
rem Clean all after use
call :finalizeProgressBar 1
call :initProgressBar "|" " "
call :drawProgressBar 0 "this is a custom progress bar"
for /l %%f in (0 1 100) do (
call :drawProgressBar %%f
)
endlocal
exit /b
:drawProgressBar value [text]
if "%~1"=="" goto :eof
if not defined pb.barArea call :initProgressBar
setlocal enableextensions enabledelayedexpansion
set /a "pb.value=%~1 %% 101", "pb.filled=pb.value*pb.barArea/100", "pb.dotted=pb.barArea-pb.filled", "pb.pct=1000+pb.value"
set "pb.pct=%pb.pct:~-3%"
if "%~2"=="" ( set "pb.text=" ) else (
set "pb.text=%~2%pb.back%"
set "pb.text=!pb.text:~0,%pb.textArea%!"
)
<nul set /p "pb.prompt=[!pb.fill:~0,%pb.filled%!!pb.dots:~0,%pb.dotted%!][ %pb.pct% ] %pb.text%!pb.cr!"
endlocal
goto :eof
:initProgressBar [fillChar] [dotChar]
if defined pb.cr call :finalizeProgressBar
for /f %%a in ('copy "%~f0" nul /z') do set "pb.cr=%%a"
if "%~1"=="" ( set "pb.fillChar=#" ) else ( set "pb.fillChar=%~1" )
if "%~2"=="" ( set "pb.dotChar=." ) else ( set "pb.dotChar=%~2" )
set "pb.console.columns="
for /f "tokens=2 skip=4" %%f in ('mode con') do if not defined pb.console.columns set "pb.console.columns=%%f"
set /a "pb.barArea=pb.console.columns/2-2", "pb.textArea=pb.barArea-9"
set "pb.fill="
setlocal enableextensions enabledelayedexpansion
for /l %%p in (1 1 %pb.barArea%) do set "pb.fill=!pb.fill!%pb.fillChar%"
set "pb.fill=!pb.fill:~0,%pb.barArea%!"
set "pb.dots=!pb.fill:%pb.fillChar%=%pb.dotChar%!"
set "pb.back=!pb.fill:~0,%pb.textArea%!
set "pb.back=!pb.back:%pb.fillChar%= !"
endlocal & set "pb.fill=%pb.fill%" & set "pb.dots=%pb.dots%" & set "pb.back=%pb.back%"
goto :eof
:finalizeProgressBar [erase]
if defined pb.cr (
if not "%~1"=="" (
setlocal enabledelayedexpansion
set "pb.back="
for /l %%p in (1 1 %pb.console.columns%) do set "pb.back=!pb.back! "
<nul set /p "pb.prompt=!pb.cr!!pb.back:~1!!pb.cr!"
endlocal
)
)
for /f "tokens=1 delims==" %%v in ('set pb.') do set "%%v="
goto :eof
答案 2 :(得分:2)
@echo off
::PROGRESS BAR
set /a full = 50
for /l %%a in (1,1,%full%) do (
CALL:ADDSPACE)
for /l %%b in (1,1,%full%) do (
CALL:PROGRESS %%b
)
del _temp.bat
exit/b
:ADDSPACE
set "fullBar=%fullBar%_"
set "tags=%tags%#"
exit/b
:PROGRESS
set number=%~1
set /a pct=full-number
(
echo/echo/[%%tags:~0,%~1%%%%fullBar:~0,%pct%%%]
)>_temp.bat
call _temp.bat
timeout 1 1>nul&cls
答案 3 :(得分:0)
好的,进度条的使用应与正在运行的安装一起使用。我在我的脚本中查询任务列表。所以例如我已经放了notepad.exe,因此进度条将一直运行,直到记事本关闭,替换vairable myapp = setup.exe,它将对另一个应用程序执行相同的操作。随着进度条的移动,我的脚本也会改变颜色。
@echo off
set load=
set loadnum=0
set flash=0
set installspeed=2
set myapp=notepad.exe
:progressinstall
set load=%load%Û
cls
echo.
echo.
echo.
echo INSTALLING PLEASE WAIT
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo %load%
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
ping localhost -n %installspeed% >nul
set/a loadnum=%loadnum% +1
set/a flash=%flash% +1
if %flash% == 9 set flash=0
color 0%flash%
if %loadnum% == 24 set/a loadnum=0 & set load=
tasklist | find "%myapp%" > NUL
If errorlevel 1 goto installcomplete
goto progressinstall
:installcomplete
color 07
cls
echo.
echo.
echo.
echo INSTALLATION COMPLETE
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.
pause
cls
exit