Como implementar barra de progreso en batch

Iniciado por Baphomet2204, 26 Julio 2019, 21:41 PM

0 Miembros y 2 Visitantes están viendo este tema.

Baphomet2204

Buenas a todos miembros del foro, tengo un batch que funciona pero que me gustaria poner una barra de progreso, esta es la linea donde me gustaría que se mostrara la barra


Código (javascript) [Seleccionar]
set /p= " Respaldando base de datos, por favor espere...  " <nul 
timeout /t 5 /nobreak > NUL
"C:/Archivos de programa/MySQL/MySQL Server 5.6/bin/mysqldump.exe" --user=root --password=codesecret  precios > .\Backups\precios_backup_%ano%%mes%%dia%.sql

         

al estarse ejecutando esa sentencia estuviera una barra que muestre el avance ya puede llegar a tardar algo en realizarse el respaldo de mysql. Gracias de antemano.
$Diseñando_vida

while(vivas)
{
       Come();
       //Duerme();
       Programa();
       Repite();
}

Serapis

Busca en el foro... hace no muchos meses, salió el tema...

Sin ir más lejos, lo he encontrado rápido:
https://foro.elhacker.net/net/simulando_barra_de_progreso-t493070.0.html

EdePC

#2
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:

Citar@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í:

Citar@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-batch
https://ss64.org/viewtopic.php?id=1499
https://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

Baphomet2204

Cita de: EdePC en 29 Julio 2019, 02:05 AM
@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

He de intentarlo con este a ver como va, gracias amigo
$Diseñando_vida

while(vivas)
{
       Come();
       //Duerme();
       Programa();
       Repite();
}