Saludos,
- Le he estado dando vueltas a este tema y me he topado con tres alternativas que básicamente derivan del modo en que se muestra la barra, pero la base viene a ser el iniciar una aplicación en segundo plano e ir comprobando si ya terminó su trabajo, y si no, ir haciendo otra cosa mientras tanto, como lo es el mostrar/actualizar una barra de progreso.
- Lo más sencillo me parece que es usar SET /P "=." <nul para mostrar puntos mientras que espera, otro detalle está en el tiempo de espera para mostrar los puntos, lo que recomiendo por experiencia es usar PING -n 2 para esperar un segundo solo si se espera que la aplicación va a demorar más de 30 segundos. Quitar el PING si se espera que la aplicación va a demorar 30 segundos o menos, ya que al no esperar un tiempo prudente se consumen más recursos en CPU del PC.
- El siguiente batch abre el block de notas (notepad.exe) y comprueba que el proceso notepad.exe siga en ejecución, si es así, escribe un punto cada segundo, si notepad.exe se cierra el batch termina:
@ECHO OFF
ECHO Iniciando notepad.exe
START /MIN notepad
SET "proceso=notepad.exe"
SET /p "=Esperando a que notepad.exe se cierre " <nul
:inicio
REM Cada 1 segundo comprueba si el proceso aún está trabajando
PING /n 2 127.0.0.1 >nul
TASKLIST /FI "IMAGENAME eq %proceso%" | FIND "%proceso%" >nul
IF %ERRORLEVEL% EQU 0 (
REM Barra de progreso ...
SET /p "=." <nul
GOTO inicio
)
:fin
ECHO:
ECHO Ud. ha cerrado notepad.exe
PAUSE
- Otro método que he estado viendo permite una mejor apariencia ya que es más HardCode, pero tiene la desventaja de que tiene que usar CLS para limpiar la pantalla, por lo que se perdería salida por pantalla anterior:
-- Este lo he adaptado justamente para hacer un BackUp de una base de datos MySQL que uso para hacer pruebas, en mi caso funciona así:
@ECHO OFF
SET "mysqldump=mysqldump.exe"
SET "database=dbcontrolasistenciav6"
SET "user=root"
SET "pass=123"
SET "backup=%database%_%date:~-4%%date:~-7,2%%date:~-10,2%.sql"
START /MIN CMD /C "%mysqldump% %database% --user=%user% --password=%pass% > %backup%"
SET "load="
SET "loadnum=0"
SET "myapp=mysqldump.exe"
:cargando
SET "load=%load%┃"
CLS
ECHO:
ECHO Realizando BackUp
ECHO ┏━━━━━━━━━━━━━━━━━━━━━━━━┓
ECHO %load%
ECHO ┗━━━━━━━━━━━━━━━━━━━━━━━━┛
SET /A "loadnum+=1"
IF %loadnum% EQU 24 SET /A "loadnum=0" & SET "load="
TASKLIST /FI "IMAGENAME eq %myapp%" | FIND "%myapp%" > NUL
rem TASKLIST | FIND "%myapp%" > NUL
IF ERRORLEVEL 1 GOTO completado
GOTO cargando
:completado
CLS
ECHO:
ECHO BACKUP COMPLETADO
ECHO ┏━━━━━━━━━━━━━━━━━━━━━━━━┓
ECHO ┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃
ECHO ┗━━━━━━━━━━━━━━━━━━━━━━━━┛
ECHO:
DIR | FIND "%database%"
PAUSE
- Por último he visto que se puede utilizar la técnica del BackSpace para borrar caracteres y no tener que estar usando CLS, pero eso ya es otra historia.
- Fuentes:
https://stackoverflow.com/questions/21108380/coding-a-real-time-progress-bar-in-batchhttps://ss64.org/viewtopic.php?id=1499https://superuser.com/questions/82929/how-to-overwrite-the-same-line-in-command-output-from-batch-file----------
Edito, GeSHi no interpreta bien los caracteres que uso para mostrar la pretty progress bar