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?
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 .
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 >>
.
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 .
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
(dovefile.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
utilizzandodir 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
Per aggiungere lo stdout e lo stderr al file di registro generale di uno script:
dir >> a.txt 2>&1
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 ...
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.
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