it-swarm-eu.dev

Reindirizza Windows cmd stdout e stderr in un singolo file

Sto provando a reindirizzare tutto l'output (stdout + stderr) di un comando DOS in un singolo file:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

È possibile o devo semplicemente reindirizzare a due file separati?

623
ripper234

Tu vuoi:

dir > a.txt 2>&1

La sintassi 2>&1 reindirizzerà 2 (stderr) a 1 (stdout). Puoi anche nascondere i messaggi reindirizzando a NUL, ulteriori spiegazioni ed esempi su MSDN .

965
Anders Lindahl

La risposta di Anders Lindahl è corretta, ma se si sta reindirizzando lo stdout a un file e si desidera reindirizzare lo stderr, è necessario assicurarsi che 2>&1 sia specificatoDOPOil reindirizzamento 1>, altrimenti non lo sarà lavoro.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

Modo corretto: dir > a.txt 2>&1. Per aggiungere, usa >>.

180
DelboyJay

Informazioni di base da MSKB

Mentre la risposta accettata a questa domanda è corretta, in realtà non fa molto per spiegare perché funziona, e dal momento che la sintassi non è immediatamente chiara ho fatto un rapido google per scoprire cosa stava effettivamente succedendo . Nella speranza che questa informazione sia utile per gli altri, la sto postando qui.

Tratto da Supporto MS KB 110930 .


Da MSKB110930

Reindirizzamento dei messaggi di errore dal prompt dei comandi: STDERR/STDOUT

Sommario

Quando si reindirizza l'output da un'applicazione utilizzando il simbolo '>', i messaggi di errore vengono comunque stampati sullo schermo. Questo perché i messaggi di errore vengono spesso inviati al flusso di errori standard anziché al flusso di uscita standard.

L'output da una console (prompt dei comandi) applicazione o comando viene spesso inviato a due flussi separati. L'output regolare viene inviato a Standard Out (STDOUT) e i messaggi di errore vengono inviati a Errore standard (STDERR). Quando si reindirizza l'output della console utilizzando il simbolo ">", si sta solo reindirizzando STDOUT. Per reindirizzare STDERR devi specificare '2>' per il simbolo di reindirizzamento. Questo seleziona il secondo flusso di output che è STDERR.

Esempio

Il comando dir file.xxx (dove file.xxx non esiste) mostrerà il seguente output:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

Se si reindirizza l'output al dispositivo NUL utilizzando dir file.xxx > nul, verrà comunque visualizzato il messaggio di errore parte dell'output, in questo modo:

File Not Found

Per reindirizzare (solo) il messaggio di errore a NUL, utilizzare il seguente comando:

dir file.xxx 2> nul

Oppure, è possibile reindirizzare l'output in un posto e gli errori in un altro.

dir file.xxx > output.msg 2> output.err

È possibile stampare gli errori e l'output standard in un singolo file utilizzando il comando "& 1" per reindirizzare l'output per STDERR su STDOUT e quindi inviare l'output da STDOUT a un file:

dir file.xxx 1> output.msg 2>&1
74
StormeHawke

Per aggiungere lo stdout e lo stderr al file di registro generale di uno script:

dir >> a.txt 2>&1
28
Henk Wiersema

Corretto, l'handle di file 1 per il processo è STDOUT, reindirizzato dal 1> o da > (1 può essere omesso, per convenzione, l'interprete dei comandi [cmd.exe] sa come gestirlo). L'handle di file 2 è STDERR, reindirizzato da 2>.

Nota che se li stai utilizzando per creare file di log, a meno che non stia inviando l'outut ai file di log _uniquely_named_ (ad esempio, data-and-time-timbrato), se esegui lo stesso processo due volte, il reindirizzato sovrascriverà ( sostituire) il file di registro precedente.

Il >> (per STDOUT o STDERR) APPENDERÀ non REPLACE il file. Quindi ottieni un file di registro cumulativo, mostrando i risultati di tutte le esecuzioni del processo, in genere più utili.

Sentieri felici ...

12
Max Vitesse

Ho appena tagliato la risposta come @Anders ha appena postato, ma ...

Dalla mia guida di Windows, ho cercato sul reindirizzamento (URL ms-its: C:\WINDOWS\Help\ntcmds.chm ::/redirection.htm ).

Si consiglia di leggere su >> e | (tubo), anche.

5
ericp

Tuttavia, non vi è alcuna garanzia che l'output di SDTOUT e STDERR siano intrecciati linea per linea in ordine temporale, utilizzando la sintassi di unione di reindirizzamento POSIX.

Se un'applicazione utilizza l'output bufferizzato, può accadere che il testo di un flusso sia inserito nell'altro a un limite del buffer, che potrebbe apparire nel mezzo di una riga di testo.

Un logger di uscita console dedicato (come "StdOut/StdErr Logger" di "LoRd MuldeR") potrebbe essere più affidabile per tale compito. Vedi: Progetti OpenSource di MuldeR

1
LigH