Mostrar Resultado de BAT en Pantalla

Amigo necesito de su valiosa ayuda tengo un archivo bat el cual llama a otro y el resultado lo envió a un archivo txt, pero necesito también que al mismo tiempo que se está llenando el archivo txt me muestre el resultado en pantalla, me han dicho que es con el comando MORE pero no se como se utiliza.

Este el código del archivo bat

@ECHO OFF

CALL "D:\Corrige_Errores.bat" > "D:\Resultado_Ejecucion\Errores_%date:~-4%%date:~3,2%%date:~0,2%_%time:~3,2%%time:~0,2%.txt"

1 Respuesta

Respuesta
1

Imagino que la solución sencilla de duplicar la ejecución del BAT, una vez con redirección de la salida y otra sin ella, no te vale por alguna razón, y que, además, la salida es voluminosa. Y no acabo de ver como podría hacerse con el comando MORE. Supongo que lo suyo sería lanzar otro proceso que vaya sacando por pantalla lo que se va metiendo en el archivo de Errores_AAAAMMDD_HHMM.txt. Voy a intentar investigar esta posibilidad.

¡Gracias! , estaré pendiente cualquier cosa.

Me gustaría saber si la duplicación de la que hablaba no te sirve y la razón de que no te sirva. Por si tienes alguna duda lo que te proponía era:

@ECHO OFF
D:\Corrige_Errores
CALL "D:\Corrige_Errores.bat" > "D:\Resultado_Ejecucion\Errores_%date:~-4%%date:~3,2%%date:~0,2%_%time:~3,2%%time:~0,2%.txt"

Tampoco me has aclarado si la salida del CORRIGE_ERRORES.BAT es voluminosa o no. Y para plantear la posibilidad de otro proceso paralelo que vaya sacando por pantalla lo que se va metiendo en el archivo Errores_AAAAMMDD_HHMM.txt necesito saber si este archivo puede tener líneas de más de 4096 bytes (es un límite para muchos de los comandos de MSDOS y si las tuviera habría que pensar en usar PowerShell)

Si muchas gracias, fíjate el archivo CORRIGE_ERRORES.BAT lo que hace es ejecutar 60 paquetes dtsx lo cual me generan 706 líneas por eso decidí mejor generar un archivo de texto Errores_AAAAMMDD_HHMM.txt, pero también necesito saber cuando haya terminado la ejecución, por eso es que necesito que se muestre en pantalla. Aquí te adjunto 2 imágenes la del inicio del proceso y el final.

¿Bastaría qué el otro proceso en paralelo detectara que en el archivo CORRIGE_ERRORES... ya figurara la frase "Presione Enter para salir"? ¿O quieres que, a pesar de todo, vaya saliendo la misma información por pantalla?

En el primer caso te propongo que pruebes lo siguiente:

@ECHO OFF
START /B "D:\Corrige_Errores.bat" > "D:\Resultado_Ejecucion\Errores_%date:~-4%%date:~3,2%%date:~0,2%_%time:~3,2%%time:~0,2%.txt"
:bucle
find "Presione Enter para salir" "D:\Resultado_Ejecucion\Errores_%date:~-4%%date:~3,2%%date:~0,2%_%time:~3,2%%time:~0,2%.txt">nul
if not errorlevel 1 goto :fin
ping -n 5 localhost>nul
goto :bucle
:Fin
Echo Proceso finalizado

Si fíjate que quisiera que al mismo tiempo fuera saliendo en pantalla, ya que así puedo ver el avance que lleva la ejecución, porque de lo contrario solo veo una ventana negra.

Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
set nomarch=D:\Resultado_Ejecucion\Errores_%date:~-4%%date:~3,2%%date:~0,2%_%time:~3,2%%time:~0,2%.txt
start /B "D:\Corrige_Errores" > %nomarch%
set /a lint=0
:bucle
set /a linl=0
for /f "tokens=*" %%a in ('type %nomarch%') do (
set /a linl+=1
if !linl! gtr !lint! echo %%a&set /a lint+=1
if #%%a#==#Presione Enter para salir# goto :eof
)
goto :bucle

En mis pruebas va un poco a tirones, no sé si tendrá que ver con compartir la ventana MSDOS con el Corrige_Errores. Si acaso se podría probar a quitar el "/B" del START.

Fijate que no veo la linea: CALL "D:\Corrige_Errores.bat" > "D:\Resultado_Ejecucion\Errores_%date:~-4%%date:~3,2%%date:~0,2%_%time:~3,2%%time:~0,2%.txt"

A donde iría, porque lo probé y no me muestra nada la ventana de MSDOS.

He cambiado la ejecución mediante CALL por una ejecución mediante START porque no he conseguido que la CALL permita ejecutar lo que viene después. En principio no tiene porque afectar a lo otro. Si lanzas el BAT con START /B no abre una nueva ventana pero provoca la ejecución de lo que se arranca con START. Si lo haces sin "/B" abre una nueva ventana, pero por lo demás es igual. Por tanto es normal que no veas la línea con CALL porque la he sustituido por otra con START.

¿Dices qué ejecutándolo tal como digo no sale nada? Prueba a abrir otra ventana CMD a ver si se ha generado el archivo Errores_...

Yo he hecho las pruebas en entorno XP. Mañana probaré con Windows 10 por si hubiera alguna diferencia.

Fíjate que lo probé y solo esto aparece y no pasa de ahí, no ejecuta el bat de los 60 paquetes dtxs.

Ya he probado en Windows 10 y no me da ningún problema. Pero claro, yo pruebo con una especie de emulador de tu bat de tratamiento de errores.

Te sugiero algunas cosas:

1. Prueba a lanzar tu bat original, el que figura en la consulta, sustituyendo el CALL por un START (con /B y sin ella) a ver si el resultado es similar o pasa algo distinto.

2. Cuando te salga la ventana que has puesto abre otra ventana CMD, sitúate en la carpeta donde se guarda el archivo de tratamiento (Errores_...) y revisa si se ha creado uno nuevo coincidente con la hora y si va creciendo de tamaño. Si es así significa que, aunque no lo parezca, el bat de corrección de errores se está ejecutando y tal vez solo haga falta paciencia (cuando deje de crecer significaría que ya ha terminado y habría que ver que ha pasado con esa ventana "colgada")

3. Si quieres ver lo que yo he probado, para hacerte una idea, puedes usar estos dos bat:

@echo off
Set /a lin=1
:Bucle
Echo Se esta escribiendo la linea %lin%
Echo Y esperando 1 seg despues
Ping -n 1 localhost>nul
set /a lin+=1
if %lin% lss 1000 goto :bucle
echo Presione Enter para salir
exit
@echo off
Setlocal EnableDelayedExpansion
set aaaa=%date:~-4%
set mm=%date:~3,2%
set /a dd=%date:~0,2%
set mi=%time:~3,2%
set /a hh=%time:~0,2%
(if %dd% LSS 10 set dd=0%dd%)&(if %hh% LSS 10 set hh=0%hh%)
set nomarch=Errores_%aaaa%%mm%%dd%_%mi%%hh%.txt
start /B auxiliar > %nomarch%
set /a lint=0
:bucle
set /a linl=0
for /f "tokens=*" %%a in ('type %nomarch%') do (
set /a linl+=1
if !linl! gtr !lint! echo %%a&set /a lint+=1
if #%%a#==#Presione Enter para salir# goto :fin
)
goto :bucle
:fin
exit

El primero pretende hacer el papel del BAT de corrección de errores. Va escribiendo dos líneas, más o menos cada segundo, hasta llegar a las 1000 líneas, por pantalla, a no ser que se redirija a un archivo. Se le lanza desde el segundo  suponiendo que se le ha llamado AUXILIAR.BAT mediante START /B. He corregido algunos defectos del segundo (que viene a ser el que te pasé ayer) porque me encontré esta mañana que si la hora era inferior a  las 10 se incluía un espacio en el nombre, lo cual me creaba problemas.

Gracias por tu ayuda gggirald:

1. Probé cambiando call por start y no me funciona con start porque no ejecuta el archivo "Corrige_Errores.bat" el cual es la ejecución de 60 paquetes .dtsx, lo único que hace es mostrarme la pantalla de MSDOS que te envíe ayer y eso mismo me escribe en el archivo "Errores_%date:~-4%%date:~3, 2%%date:~0, 2%_%time:~3, 2%%time:~0, 2%.txt" .

2. Espere y revise el archivo "Errores_%date:~-4%%date:~3, 2%%date:~0, 2%_%time:~3, 2%%time:~0, 2%.txt" y este no crece lo que significa que no ejecuta el bat "Corrige_Errores.bat".

3. Fíjate que al final lo he dejado así, le he quitado la fecha y hora al archivo txt y lo he dejado solo como Errores.txt. Al final no es como yo lo quería porque más bien lo que necesito es que me muestre el avance del procesamiento del archivo "Corrige_Errores.bat" y así con este solo veo una pantalla negra de MSDOS y hasta que ha terminado de procesar me muestra en pantalla el archivo "Errores.txt"

@echo off
set nomarch1=D:\Resultado_Ejecucion\Errores.txt
set nomarch2="D:\Corrige_Errores.bat"
CALL %nomarch2% > %nomarch1%
TYPE %nomarch1%
@echo Presione Enter para salir.
Pause>nul
exit

Creo que habría que intentar aclarar por qué no funciona START con tu bat. No encuentro una razón válida. ¿Puedo ver el BAT Corrige_Errores.bat (si no utiliza algo que no pueda publicarse, claro)? Dices que es la ejecución de 60 paquetes .dtsx. No sé que son esos paquetes pero puedes probar a ejecutar uno solo a ver que pasa. Incluso lanzar uno de esos paquetes directamente con START.

Y en ningún caso el problema puede estar relacionado con el nombre del archivo. Otra cosa es que mientras estés probando utilices uno más sencillo.

Si claro aquí te mando una porción del contenido del BAT.

Prueba a crear una versión superreducida del BAT solo con:

@echo off
cd c:\Programa Files\Microsoft SQL Server\110\DTS\Binn
@echo Correccion de Error 2
DTExec.exe/FILE "D:\ETL_Central\Correccion_Errores\Error2.dtsx" /CHECKPOINTING OFF /REPORTING E /De "Central"
@echo Finaliza Correccion de Error 2

A continuación intenta lanzarla con START /B sin redirigir la salida. Si no hace nada ponme un pantallazo de lo que sale. Si sale algo repite la prueba redirigiendo la salida a un archivo.

Aquí te envió la pantalla ya reducí como tu me indicaste el BAT y con el comando START /B no me deja ejecutar el bat, solo se queda en la siguiente pantalla.

Pero aquí no veo el comando START /B PRUEBA.BAT (por ejemplo). ¿Cómo lo has lanzado?

Por más vueltas que le doy al asunto no consigo comprender que no funcione correctamente el START. Échale un vistazo, si quieres, a https://ss64.com/nt/start.html.

Intuyo que trabajas con alguna versión de Windows Server, pero no he visto en ningún lado que el comando START tenga peculiaridaes con esas versiones de Windows.

Supongo que no has probado los BAT del punto 3 de mis sugerencias de ayer. Lo digo porque ahí ya se podría ver si el problema es del comando START o si depende de lo que haga el BAT arrancado. En todo caso sería bueno que probaras a lanzar con START cualquier bat sencillo, que no lance ningún ejecutable, por ejemplo solo un ECHO HOLA MUNDO o algo así. Y también que pruebes en una ventana CMD a pedir la ayuda del START con START /? a ver que te dice.

Hola gggirald, Fíjate que yo igual no comprendo porque no funciona, el Windows que estoy utilizando es Windows 7, aquí te mando la forma como hice el bat sin enviar a archivo la salida y también lo ejecute desde la ventana de MSDOS e igual no ejecuta nada.

Prueba a quitarle las comillas porque si tecleas START /? verás que lo primero que se pone entre comillas es el título de la ventana. O repite dos veces lo que pones entre comillas o, mejor, usa este comando:

START /B "" "D:\Corrige_Errores.bat"

He probado en mi entorno y, efectivamente, si pongo solo una cosa entre comillas, con "/B", se limita a sacarme la versión de Windows, lo mismo que en tu caso. Estoy seguro de que ahora va a ir bien.

¡Gracias!  Buenísimo te agradezco mucho hoy si me funciono.

Y el bat que te proponía el día 29, ¿lo has probado?

Me tranquiliza haber averiguado la razón de algo tan "misterioso". Como suele ocurrir al final resultó ser una tontería pero a veces es difícil "acorralarla".

Si es cierto aveces una cosa tan sencilla se vuelve complicada.

Fíjate que este fue el que probé:

@echo off
Setlocal EnableDelayedExpansion
set aaaa=%date:~-4%
set mm=%date:~3,2%
set /a dd=%date:~0,2%
set mi=%time:~3,2%
set /a hh=%time:~0,2%
(if %dd% LSS 10 set dd=0%dd%)&(if %hh% LSS 10 set hh=0%hh%)
set nomarch=Errores_%aaaa%%mm%%dd%_%mi%%hh%.txt
start /B auxiliar > %nomarch%
set /a lint=0
:bucle
set /a linl=0
for /f "tokens=*" %%a in ('type %nomarch%') do (
set /a linl+=1
if !linl! gtr !lint! echo %%a&set /a lint+=1
if #%%a#==#Presione Enter para salir# goto :fin
)
goto :bucle
:fin
exit

Si a veces algo tan sencillo se vuelve bien complicado.

Fíjate que este fue el que probé:

@echo off
Setlocal EnableDelayedExpansion
set aaaa=%date:~-4%
set mm=%date:~3,2%
set /a dd=%date:~0,2%
set mi=%time:~3,2%
set /a hh=%time:~0,2%
(if %dd% LSS 10 set dd=0%dd%)&(if %hh% LSS 10 set hh=0%hh%)
set nomarch=Errores_%aaaa%%mm%%dd%_%mi%%hh%.txt
start /B auxiliar > %nomarch%
set /a lint=0
:bucle
set /a linl=0
for /f "tokens=*" %%a in ('type %nomarch%') do (
set /a linl+=1
if !linl! gtr !lint! echo %%a&set /a lint+=1
if #%%a#==#Presione Enter para salir# goto :fin
)
goto :bucle
:fin
exit

No era ese bat el que quería que probaras pero ahora que lo veo es más completo pero cambiando

Start /B auxiliar > %nomarch%

Por

start /B "" "D:\Corrige_Errores.bat" > %nomarch%

Esto ya pretende ser la solución a tu problema original. Así que me gustaría que la probaras. Y que te funcionara, claro.

Si claro así lo hice sustituí la palabra auxiliar por  "D:\Corrige_Errores.bat" y así me funciono

Perfecto. Pues entonces podemos dar por cerrado el asunto. Ha sido un placer.

La pregunta no admite más respuestas

Más respuestas relacionadas