2010-03-02 9 views
8

Heredé algunos archivos por lotes grandes y me gustaría volver a escribirlos en un lenguaje más "amigable para el desarrollador".¿Hay alguna forma de rastrear a través de la ejecución de un archivo por lotes?

Me gustaría saber las siguientes cosas:

  • qué otras secuencias de comandos que llama
  • qué otros procesos que se inicia
  • qué archivos qué escribe a
  • las variables de entorno que lo usos, cuál establece

Para el último punto, soy consciente de que puedo hacer esto antes de comenzar:

set > original_environment.txt 

Y después de lo corro, puedo hacer esto:

set > new_environment.txt 

y sólo hacer una diferenciación entre ellos ... pero probablemente voy a perder algunas variables que pueden ser desactivada cuando el guión termina (o incluso todos si el script se ejecutó bajo setlocal).

¿Hay alguna manera de encontrar todo eso sin que yo agregue toneladas de declaraciones de eco a lo largo del código del script? ¿Existe alguna herramienta que pueda monitorear el proceso iniciado por el archivo por lotes y decirme todo lo que hizo?

+1

Vuelva a escribirlos en PowerShell. Tiene capacidad de depuración. También puede usar el excelente producto "PowerShell Plus" de Idera y obtener una experiencia de depuración interactiva. –

+2

@John: Creo que el problema del OP era más de entender qué era lo que el archivo por lotes podía reescribir en otro idioma. Así que de alguna manera vuelves a plantear el mismo punto :) – Joey

+0

Puedes obtener parte de esta información de Process Monitor http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx, pero en cuanto al resto. Espero que encuentres algo, pero no soy optimista. –

Respuesta

2

Puedes mirar dentro de ellos y descubrir qué hacen.

También puede eliminar cualquier instrucción echo off y @ comandos anteriores; de esta forma, cada comando se emite antes de su ejecución y puede redirigir el resultado a un archivo para estudiarlo más tarde.

No tengo ninguna herramienta de depuración para archivos por lotes, pero consideré escribir una vez.

+0

Sí, pero me tengo que asegurar de que todas las demás secuencias de comandos que se llamen tampoco tengan el 'echo off'. Estoy pensando en lo mismo acerca de la herramienta :) – Geo

+0

@Geo: El problema con una herramienta de este tipo sería que tienes que modelar con precisión el comportamiento de cmd. Y no puede simplemente ejecutar las líneas una por una en cmd ya que a menudo tiene resultados diferentes a los que se obtienen cuando se ejecuta desde un archivo por lotes; un enfoque ingenuo probablemente fallaría. Aunque creo que tengo una idea que * podría * funcionar, simplemente escriba otro archivo de proceso por lotes, que contenga una instrucción 'pause' después de cada línea, y escriba el entorno completo en un archivo para que el depurador lo tome. Puede que no sea demasiado bonito y hacer un seguimiento de los archivos abiertos es otro problema por completo. Process Monitor fue una buena sugerencia, aunque – Joey

1

No, no hay forma de depurar archivos por lotes antiguos. Sin embargo, puede deshacerse de todas las declaraciones ECHO OFF y, a continuación, todos los comandos y resultados se reproducirán en la consola cuando los ejecute.

+0

Cualquier línea que comience con @ tampoco se repetirá –

1

Si está dispuesto a gastar algo de dinero, debería echar un vistazo al archivo por lotes IDE Running Steps y sus capacidades de depuración.

yo no probarlo, pero tiene algunas características que pueden ayudarle en su tarea:

...

  • entorno de depuración de Visual Studio similar.
  • Conjunto completo de comandos de depuración (paso a paso, paso a paso, paso a paso y más)
  • Analizador de proyectos rico para encontrar sus errores y advertencias en un instante.
  • Compatibilidad integrada para variables de medio ambiente demorado expandido .
  • Definiciones de punto de interrupción de tipo múltiple para adaptarse a sus múltiples necesidades de depuración.
  • Complejo de tubería y soporte de redirección con resaltado multicolor.
  • Soporte de visualización y modificación de variable de entorno.
  • Ventana de información ampliada para una verdadera definición de definición de variable.
  • Impresionante función para desenrollar 'Por comando'.
  • Ventana interactiva de parámetros de llamada y Parámetros.

...

También ofrecen una versión de prueba.

+0

El enlace de Pasos pendientes ya no está activo: apunta a un sitio del portal. – rossmcm

2

No hay una manera directa de hacerlo. Pero no es imposible crear uno.

Puesto que Windows XP/Vista/7 salió el conjunto good'ole de comandos por lotes de DOS ha sido mejorado en gran medida, aunque no muchos de ellos utiliza o incluso RTFM (FOR /??)

Así que aquí os doy, un simple TRACER pura-lotes que utiliza el interruptor FOR /F línea de análisis:

@ECHO OFF 

FOR /F "delims=" %%L IN (%1) DO (

    CLS 

    ECHO __________________________________________________ 
    ECHO       ENV. VARIABLES *BEFORE* 
    SET 

    ECHO __________________________________________________ 
    ECHO            LINE 
    ECHO %%L 

    ECHO __________________________________________________ 
    ECHO Hit any key to execute the line ... 
    PAUSE > NUL 

    ECHO __________________________________________________ 
    ECHO           EXECUTE 
    %%L 

    ECHO __________________________________________________ 
    ECHO Hit any key to fetch the next line... 
    PAUSE > NUL 

) 

ECHO END OF FILE 

se puede tomar como punto de partida y modificarlo a medida que avanza.

Así es como debería usar este recurso:

DEBUG.BAT TEST.BAT 

y también te daré un archivo de prueba para probarlo:

@ECHO OFF 

ECHO Hello World! 
SET aaa=1 
SET bbb=2 

ECHO Doing step 2 
SET aaa= 
SET ccc=3 

ECHO Doing step 3 
SET bbb= 
SET ccc= 

ECHO Finished! 

Este DEBUG.BAT cosa, sin embargo, debido a su simplicidad, tiene algunas limitaciones PERO que pueden solucionarse si le das suficiente BATCH-fu allí.

  • No puede procesar bloques multilínea :: Esto se puede evitar haciendo que los comandos FOR analizar tokens en y construir las líneas a medida que llegan, y IF se encontró con un paréntesis abierto, simplemente volcar el paréntesis bloquear contenido en un archivo temporal y luego llamarse a sí mismo en el archivo temporal, por ejemplo DEBUG tempfile.bat
  • Se no puede procesar saltos :: Puede, por supuesto, hacer una comprobación IF para un GOTO label luego hacer un FOR /F a analizar fuera de etiqueta en sí, entonces tal vez utilizar el segundo argumento %2 de DEBUG.BAT para especificar la etiqueta para saltar a , en cuyo caso, si se especifica este mismo argumento, simplemente gire el FOR /F hasta que aparezca la etiqueta deseada y luego proceda con la depuración normal en la siguiente línea.
  • Hay demasiada información de una sola SET :: Haz lo que hizo con el SET > before.txt y después de la cosa, pero lo hace en cada línea y luego ejecutar una herramienta de línea de cmd-DIFF en los archivos (un montón están disponibles en la red). Luego obtendrá un DIFF de cada variable que ha cambiado desde el último paso. Incluso podrías evitar el env.las variables se desordenan por completo abofeteando en SETLOCAL y ENDLOCAL allí y luego obtendrían solo los SET locales ... pero YMMV.

Esos son algunos. Si has encontrado alguna limitación que lo detenga o cualquier mejora que te ayude a solucionar ese último error, no dudes en comunicármelo (a través de los comentarios) y trataré de ayudarte si puedo.

Espero que esto ayude.

Cuestiones relacionadas