2010-03-02 17 views
8

Ho ereditato alcuni file batch di grandi dimensioni e vorrei riscriverli su un linguaggio più "sviluppatore".Esiste un modo per tracciare l'esecuzione di un file batch?

mi piacerebbe scoprire le seguenti cose:

  • quali altri script che chiama
  • quali altri processi si inizia
  • quali file lo fa scrivere a
  • variabili d'ambiente è quello utilizza, quali imposta

Per l'ultimo punto, sono a conoscenza che posso farlo prima di iniziare:

set > original_environment.txt 

E dopo l'eseguo, posso fare questo:

set > new_environment.txt 

e basta fare un diff tra loro ... ma io probabilmente perdere alcune variabili che possono essere disinserite quando lo script finiture (o anche tutte loro se lo script ha funzionato sotto setlocal).

C'è un modo per trovare tutte quelle cose senza che io aggiunga tonnellate di istruzioni echo in tutto il codice dello script? Esiste un tale strumento in grado di monitorare il processo avviato dal file batch e dirmi tutto ciò che ha fatto?

+1

Riscrivili in PowerShell. Ha capacità di debug. Puoi inoltre utilizzare l'eccellente prodotto "PowerShell Plus" di Idera e ottenere un'esperienza di debug interattiva. –

+2

@John: Penso che il problema dell'OP comprendesse di più quello che il file batch ha potuto riscrivere in un'altra lingua. Quindi stai di nuovo facendo lo stesso punto :) – Joey

+0

Puoi ottenere alcune di queste informazioni da Process Monitor http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx, ma per il resto. Spero che tu trovi qualcosa, ma non sono ottimista. –

risposta

2

Si può solo guardare dentro di loro e capire quello che fanno.

È anche possibile rimuovere qualsiasi istruzione echo off e @ precedenti; in questo modo ogni comando viene emesso prima dell'esecuzione e puoi reindirizzare l'output su un file per studiarlo in un secondo momento.

Non esiste uno strumento di debug per i file batch di cui sono a conoscenza, ma ho pensato di scriverne uno una sola volta.

+0

Sì, ma dovrei assicurarmi che anche tutti gli altri script chiamati non abbiano "echo off". Sto pensando alla stessa cosa sullo strumento :) – Geo

+0

@Geo: Il problema con uno strumento del genere sarebbe che devi modellare accuratamente il comportamento di cmd. E non è possibile eseguire le righe una per una in cmd dato che ha risultati spesso diversi rispetto a quando si esegue da un file batch: un approccio ingenuo probabilmente fallirebbe. Anche se penso di avere un'idea che * potrebbe * funzionare: basta scrivere un altro file batch, contenente un'istruzione 'pause' dopo ogni riga e scrivere l'intero ambiente in un file per il debugger da afferrare. Potrebbe non essere troppo carino e tenere traccia dei file aperti è un altro problema. Process Monitor era un suggerimento, anche se – Joey

1

No, non è possibile eseguire il debug dei file batch di vecchio stile. Tuttavia, è possibile liberarsi di tutte le istruzioni ECHO OFF, quindi tutti i comandi e l'output saranno echo alla console quando vengono eseguiti.

+0

Qualsiasi riga che inizia con @ non verrà riprodotta anche –

1

Se si è disposti a spendere un po 'di denaro si dovrebbe dare un'occhiata al file IDE Running Steps e alle sue funzionalità di debug.

non ho provarlo, ma ha alcune caratteristiche che potrebbero aiutarvi nel vostro compito:

...

  • visivo ambiente di debug Studio-like.
  • Ricco set di comandi di debug (step in, step over, step out e altro)
  • Analizzatore di progetti ricchi per trovare i vostri errori e avvertimenti in poco tempo.
  • Supporto integrato per variabili di ambiente con estensione ritardata.
  • Definizioni di punti di interruzione multi-tipo per soddisfare le vostre esigenze di debug multiple.
  • Supporto complesso di pipeline e reindirizzamento con evidenziazione multicolore.
  • Visualizzazione delle variabili di ambiente e supporto di modifica.
  • Finestra di informazioni estesa per la visualizzazione a definizione di variabile vera.
  • Impressionante funzione di srotolamento "Per comando".
  • Finestra interattiva di callstack e parametri.

...

Essi offrono anche una versione di prova.

+0

Il collegamento Passaggi in esecuzione è ora defunto - indica un sito portale. – rossmcm

2

Non esiste un modo diretto per farlo. Ma non è impossibile crearne uno.

Poiché Windows XP/Vista/7 è uscito il set good'ole di comandi batch DOS è stato notevolmente migliorato, anche se non molti li utilizza o anche RTFM (FOR /??)

Così qui vi do, un semplice TRACER puro-batch che utilizza l'interruttore FOR /F line-analisi:

@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 

si può prendere come un inizio e modificarlo come si va.

Ecco come ci si utilizza:

DEBUG.BAT TEST.BAT 

E sarò anche dare un file di prova per provarlo:

@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! 

Questo DEBUG.BAT cosa, comunque, a causa della sua semplicità, ha alcune limitazioni MA che possono essere aggirate se schiaffi abbastanza BATCH-fu in là.

  • Esso non può elaborare blocchi multilinea :: Questo può essere lavorato in giro per avere i comandi FOR analizzare gettoni e costruire le linee così come arrivano, e IF ha incontrato una parentesi aperta, basta scaricare la parentesi blocca il contenuto in un file temporaneo e poi chiama se stesso nel file temp DEBUG tempfile.bat
  • Non può processo salti :: È possibile, naturalmente, fare un controllo IF per un GOTO label poi fare un FOR /F per analizzare fuori etichetta se stesso, allora forse utilizzare il secondo argomento %2 di DEBUG.BAT per specificare l'etichetta per saltare , nel qual caso se questo argomento è specificato, devi solo ruotare lo FOR /F fino a quando non viene visualizzata l'etichetta desiderata e quindi procede con il debugging normale sulla riga successiva.
  • C'è troppe informazioni da un unico SET :: Basta fare quello che hai fatto con il SET > before.txt e dopo cosa, ma farlo su ogni riga e quindi eseguire un tool cmd-line DIFF sui file (un sacco sono disponibili su la rete). Quindi otterrai un DIFF di ogni variabile che è stata modificata dall'ultimo passaggio. Potresti anche essere in grado di evitare l'env.le variabili si confondono completamente con lo slapping in SETLOCAL e ENDLOCAL e quindi si otterranno solo i SET locali ... ma YMMV.

Questi sono alcuni. Se hai trovato qualche limitazione per l'esibizione o qualsiasi miglioramento ti aiuterebbe a inchiodare l'ultimo bug, sentiti libero di farmelo sapere (tramite i commenti) e cercherò di aiutarti se posso.

Spero che questo aiuti.

Problemi correlati