¿Cómo puedo depurar un script .BAT?

96

¿Hay alguna forma de recorrer un script .bat? La cuestión es que tengo un script de compilación, que llama a muchos otros scripts, y me gustaría ver cuál es el orden en el que se llaman, para saber exactamente dónde tengo que ir y agregar mis modificaciones. .

Vhaerun
fuente
4dos tiene un depurador integrado.

Respuestas:

69

No conozco ninguna forma de recorrer la ejecución de un archivo .bat, pero puede usar echoy pausepara ayudar con la depuración.

ECHO
Hará eco de un mensaje en el archivo por lotes. Por ejemplo, ECHO Hello World imprimirá Hello World en la pantalla cuando se ejecute. Sin embargo, sin @ECHO OFF al principio del archivo por lotes, también obtendrá "ECHO Hello World" y "Hello World". Finalmente, si solo desea crear una línea en blanco, escriba ECHO. agregar el punto al final crea una línea vacía.

PAUSA
Solicitar al usuario que presione cualquier tecla para continuar.

Fuente: Ayuda de archivo por lotes

@ workmad3: answer tiene más buenos consejos para trabajar con el echocomando.

Otro recurso útil ... DDB: DOS Batch File Tips

Eric Schoonover
fuente
1
Supongo que esas son mis únicas opciones.
Vhaerun
18

Asegúrese de que no haya declaraciones de 'echo off' en los scripts y llame a 'echo on' después de llamar a cada script para restablecer los que haya perdido.

La razón es que si se deja el eco activado, el intérprete de comandos generará cada comando (después del procesamiento de parámetros) antes de ejecutarlo. Hace que se vea muy mal para su uso en producción, pero muy útil para fines de depuración, ya que puede ver dónde ha fallado la salida.

Además, asegúrese de verificar los ErrorLevels establecidos por los programas y scripts por lotes llamados. Recuerde que hay 2 métodos diferentes usados ​​en archivos .bat para esto. Si llamó a un programa, el nivel de error está en% ERRORLEVEL%, mientras que de los archivos por lotes, el nivel de error se devuelve en la variable ErrorLevel y no necesita% alrededor.

workmad3
fuente
13

Ante una preocupación similar, encontré la siguiente herramienta con una búsqueda trivial en Google:

" Take Command " de JPSoft incluye un archivo por lotes IDE / depurador. Su breve video de presentación lo demuestra muy bien.

Estoy usando la versión de prueba desde hace unas horas. Aquí está mi primera opinión humilde:

  • Por un lado, permite depurar scripts .bat y .cmd y ahora estoy convencido de que puede ayudar en bastantes casos.
  • Por otro lado, a veces se bloquea y tuve que matarlo ... especialmente al depurar subíndices (no siempre de forma sistemática) ... no muestra una "pila de llamadas" ni un botón de "salida".

Deverves un intento.

Myobis
fuente
1
Probablemente debería ser un comentario
KyleMit
8
@KyleMit, ¿puedes explicar por qué? ya que esta es una solución independiente distinta de las demás y que responde a la pregunta original? no es porque sea lo suficientemente corto para caber en un comentario, que tiene que hacerlo ..
Myobis
1
De hecho, quise decir probablemente , en que podría ir de cualquier manera. Pero es una respuesta lmgtfy . A partir de la respuesta del Centro de asistencia sección: Always quote the most relevant part of an important link. Sin el enlace, esta respuesta se disuelve, lo que, de nuevo, probablemente esté bien, pero normalmente este tipo de sugerencia ad-hoc de un software propietario no probado generalmente encajaría mejor en un comentario. Siéntete libre de dejarlo también.
KyleMit
8

Encontré el software 'running steps' (win32) haciendo exactamente lo que estaba buscando: http://www.steppingsoftware.com/

Puede cargar un archivo bat, colocar puntos de interrupción / comenzar a recorrerlo mientras ve las variables de salida y de entorno.

La versión de evaluación solo permite recorrer 50 líneas ... ¿Alguien tiene una alternativa gratuita con una funcionalidad similar?

Jokkke99BE
fuente
7
Han perdido ese dominio y presumiblemente se han ido a la quiebra. Aún puede descargar el software de evaluación desde web.archive.org/web/20120421211043/http://… pero ya no puede comprar una licencia.
twasbrillig
6

remueva el @ECHO OFF y llame a su archivo por lotes para redireccionar TODA la salida a un archivo de registro

c:> yourbatch.bat (parámetros opcionales)> yourlogfile.txt 2> & 1

que se encuentra en http://www.robvanderwoude.com/battech_debugging.php

¡¡FUNCIONA!! no olvides el 2> & 1 ...

FENÓMENO


fuente
2

La única forma en que puedo pensar es esparcir el código con echos y pauses.

jop
fuente
2

¿Intentó redirigir el resultado a un archivo? Como lo que sea.bat> log.txt

Debe asegurarse de que, en este caso, todos los demás scripts llamados también inicien sesión en el archivo como >> log.txt

Además, si coloca una fecha / T y una hora / T al principio y al final de ese archivo por lotes, obtendrá las horas en ese momento y podrá asignar el tiempo y el orden de ejecución de su script.

Biri
fuente
Escribir el resultado en un archivo no ayuda mucho, hay muchos scripts que se llaman y, además, hay muchos ejecutables que se ejecutan.
Vhaerun
1
Si todos los demás programas y secuencias de comandos escriben en el stdin, todos sus mensajes también se registran. Si acaba de ejecutar el lote y ve muchos mensajes en ejecución, puede redirigirlos a un archivo de registro.
Biri
1

O ... Llame a su archivo .bat principal desde otro archivo .bat y envíe el resultado a un archivo de resultados, es decir

runner.bat> mainresults.txt

Donde runner.bat llama al archivo .bat principal

Debería ver todas las acciones realizadas en el archivo .bat principal ahora


fuente
0

Un problema bastante frecuente es que un script por lotes se ejecuta haciendo doble clic en su icono. Dado que la cmd.exeinstancia de host Command Prompt ( ) también termina entonces, no es posible leer mensajes de error y de salida potenciales.

Para leer dichos mensajes, es muy importante que abra explícitamente una ventana del símbolo del sistema, vaya al directorio de trabajo correspondiente y ejecute el script por lotes escribiendo su ruta / nombre.

aschipfl
fuente
0

puede utilizar cmd \kal final de su secuencia de comandos para ver el error. no cerrará su símbolo del sistema después de que se complete la ejecución

Arpan Saini
fuente
-3

o, abra una ventana de cmd, luego llame al lote desde allí, la salida estará en la pantalla.

Pwn
fuente
2
Esto hace tantas suposiciones erróneas que ni siquiera es una respuesta. probablemente los dos más importantes son que a) se supone que el archivo por lotes produce una salida de consola. No es necesario, yb) que el archivo por lotes está funcionando realmente
Leliel