¿Como "leer" ventana de errores en Archivos Batch?

Quisiera saber si existe alguna forma que un archivo de procesos por lotes (BATCH) pueda interpretar un error lanzado en una ventana por un programa en Windows.

Me explico mejor...

Tengo un archivo *.bat que ejecuta un programa en windows.

Ese programa que se ejecuta a través del .BAT puede lanzarse bien o tener una pantalla de error.

Si al ejecutarse el programa y conectarse a internet el archivo patch.xml se verifica como correcto el programa se ejecutará normalmente.

Pero, si al conectarse a internet se verifica que el archivo patch.xml es incorrecto, el programa muestra la siguiente ventana de error: "ERROR XML FAILED. NO SE ENCUENTRA EL SOFTWARE DE REVISIÓN." y al aceptar o cerrarla, se termina la ejecución del programa.

¿QUÉ DESEO?

Que si en la ejecución del programa sale esa ventana, el BAT realice una copia del archivo patch.xml que tengo previamente guardada en una ruta de respaldo de mi PC y la sustituya por la incorrecta y vuelva a iniciar la ejecución del programa.

Set "Respaldo_Patch=F:\RESPALDO_PATCH\patch.xml"
Set "Original_Patch=C:\Program Files (x86)\VWW Client\"
:ejecuta
start program
If sale la ventanita de error "ERROR XML FAILED...." (
copy /y "%Respaldo_Patch%" "%Original_Patch%"
echo Archivo de Respaldo patch.xml copiado y actualizado...
Goto :ejecuta
) ELSE (
Echo Todo OK el programa se iniciará normalmente...
)

Lo que no se como programar es la parte del IF para que "leea" la ventanita de error: If sale la ventanita de error "ERROR XML FAILED..." (

O alguna forma alternativa que puedan ver Uds, para cuando aparezca esa ventana de error se sustituya el archivo que lo causa y continúe la ejecución normal del programa.

Respuesta
1

Al contestar (más o menos) a tu otra consulta he visto esta que tampoco me ha entrado pese a que se supone que me entra todo lo de MS-DOS. Se me ocurre que habría dos formas de abordar tu caso según el comportamiento del ejecutable PROGRAM:

1. Que actualice la variable interna ERRORLEVEL, con lo que se podrían usar los diferentes valores de esa variable (puedes ver como se hace tecleando IF /? en una ventana CMD)

2. Que no la actualice con lo que habría que intentar capturar los mensajes en un archivo de texto y luego analizarlo para ver si aparece ese texto

En todo caso no acabo de ver la necesidad de lanzar el PROGRAM con START. En principio bastaría con escribir su nombre (precedido del path si no está en la misma carpeta que el BAT).

Si quieres (y no es demasiado tarde) podemos intentarlo.

Hola gggirald, gracias por tu respuesta.

Si puedes compartirme el código de esos 2 métodos, con gusto lo intento y te comento como me fue.

Saludos

Para el primer caso sería algo como:

set "Respaldo_Patch=F:\RESPALDO_PATCH\patch.xml"
set "Original_Patch=C:\Program Files (x86)\VWW Client\"
:ejecuta
program
if errorlevel 5 echo.&echo Error 5&goto :error
if errorlevel 4 echo.&echo Error 4&goto :error
if errorlevel 3 echo.&echo Error 3&goto :error
if errorlevel 2 echo.&echo Error 2&goto :error
if errorlevel 1 echo.&echo Error 1&goto :error
goto :fin
:error
copy /y "%Respaldo_Patch%" "%Original_Patch%"
echo Archivo de Respaldo patch.xml copiado y actualizado...
goto :ejecuta
:Fin
Echo Todo OK el programa se iniciará normalmente...

He desglosado unos los posibles valores del ERRORLEVEL. Lo normal es que no haya tantos y si los hay que no interesen todos, pero es para que quede claro que ese es el esquema de tratamiento porque el IF ERRORLEVEL tiene peculiaridades que obligan a tratar los valores en orden decreciente. El valor cero de ERRORLEVEL corresponde a "programa terminado sin error" y no se contempla explícitamente. Para ver que valores de ERRORLEVEL da ese programa (el supuesto PROGRAM) puedes crearte un BAT similar al anterior y anotar que valor da cuando se produce algún error. Si siempre sale cero, aún en los casos en que ha habido error habría que usar el segundo método. Pero esperaré a que pruebes este antes de meternos en el otro.

Bien!

Este código va atado al código del otro post, y también depende de que el archivo patch.xml se corrompa como expliqué en el otro hilo.

De todos modos, estuve investigando mas y hay un archivo patch.log (txt) donde se reflejan los errores, creo que sería más fácil leer el archivo de log y si se encuentra esa línea con el mensaje "ERROR XML FAILED..." que se realice la copia.

Creo que este archivo de log facilitará las cosas, de todos modos tengo que esperar a que un día suceda el error.

Un abrazo

Habría que ver si el patch.log del que hablas es acumulativo (es decir que tiene todos los mensajes de todas las ejecuciones del programa correspondiente, que supongo que se llamará PATCH.EXE o algo así) o se genera cada vez que se ejecuta el programa. En el primer caso su utilidad directa es menor porque los mensajes tendrán una fecha/hora además del texto y no basta con detectar la presencia del mensaje "ERROR XML FAILED..." para adoptar una decisión. En el segundo caso este bat podría servir:

@echo off
set "Respaldo_Patch=F:\RESPALDO_PATCH\patch.xml"
set "Original_Patch=C:\Program Files (x86)\VWW Client\"
:ejecuta
program
for /f "tokens=* delims=" %%a in ('findstr /C:"ERROR XML FAILED" patch.log') do if not #%%a#==## goto :error
goto :fin
:error
copy /y "%Respaldo_Patch%" "%Original_Patch%"
Echo Archivo de Respaldo patch.xml copiado y actualizado...
Pause
goto :ejecuta
:Fin
Echo Todo OK el programa se iniciará normalmente...

Obviamente si patch.log no se reescribe cada vez que se ejecuta PROGRAM si encuentra la cadena "ERROR XML FAILED" entrará en un bucle. Por eso he puesto una PAUSE antes de la vuelta al bucle.

Particularmente sería más partidario de la opción de los ERRORLEVEL si es que PROGRAM actualiza esa variable de entorno

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas