2012-11-15 15 views
14

C'è un modo per reindirizzare stdout e stderr per un file batch dall'interno.Reindirizza stdout e stderr dall'interno di un file batch

sto immaginando qualcosa di simile

set STDOUT=stdout.log 
echo Some text 
a.exe 
b.exe 
c.exe 

Dove sia Some text, e l'uscita del a.exe, b.exe e c.exe sarebbe andato a stdout.log

è possibile?

risposta

25

E 'più efficace per reindirizzare una volta per l'intera collezione di comandi che è di reindirizzare (con accodamento) ogni singolo comando. Ci vuole tempo per inizializzare il reindirizzamento. Potrebbe non essere evidente per alcuni comandi reindirizzati, ma se fatto in un ciclo con molte iterazioni, può diventare piuttosto significativo.

Un metodo consiste nel racchiudere l'intero blocco di comandi reindirizzati tra parentesi e reindirizzare fuori delle parentesi

>stdout.log 2>&1 (
    echo Some text 
    a.exe 
    b.exe 
    c.exe 
) 

Un'altra opzione è quella di inserire i comandi in un sottoprogramma e reindirizzare la chiamata

call :redirect >stdout.log 2>&1 
exit /b 

:redirect 
echo Some text 
a.exe 
b.exe 
c.exe 
exit /b 
+0

Qual è il modo di mettere il nome del file di log in una variabile? – domih

6

Sì, è necessario reindirizzare stdout e aggiungere al proprio file (1>> %STDOUT%) e collegare stderr allo stdout (2>&1):

set STDOUT=stdout.log 
echo Some text 1>> %STDOUT% 2>&1 
a.exe 1>> %STDOUT% 2>&1 
b.exe 1>> %STDOUT% 2>&1 
c.exe 1>> %STDOUT% 2>&1 

@EitanT correttamente osservato che la tua domanda non implica necessariamente la scrittura sia stderr e stdout nello stesso file. Così, per completezza, ecco una versione di scrittura in file separati:

set STDOUT=stdout.log 
set STDERR=stderr.log 
echo Some text 1>> %STDOUT% 2>> %STDERR% 
a.exe 1>> %STDOUT% 2>> %STDERR% 
b.exe 1>> %STDOUT% 2>> %STDERR% 
c.exe 1>> %STDOUT% 2>> %STDERR% 
+1

+ 1: Non devi reindirizzare 'stderr' a' stdout' ... se vuoi puoi reindirli a registri separati. –

+1

Ovviamente non è necessario, ma ho pensato che voleva fare esattamente questo: _... per reindirizzare lo stdout ** e ** stderr ..._ – zb226

+0

Sì, reindirizzare entrambi, ma non necessariamente allo stesso Posizione. Non importa, sto solo facendo il pelo ... –

Problemi correlati