Domanda

Sto cercando di reindirizzare tutto l'output (stdout + stderr) di un comando DOS su 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?

È stato utile?

Soluzione

Desideri:

dir > a.txt 2>&1

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

Altri suggerimenti

La risposta di Anders Lindahl è corretta, ma va notato che se stai reindirizzando stdout su un file e vuoi reindirizzare anche stderr, DEVI assicurarti che 2 > & amp; 1 sia specificato < strong> AFTER il 1 > reindirizzamento, altrimenti non funzionerà.

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

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

Informazioni sullo sfondo da MSKB

Sebbene la risposta accettata a questa domanda sia corretta, in realtà non fa molto per spiegare perché funziona, e poiché la sintassi non è immediatamente chiara ho fatto un google veloce per scoprire cosa stava davvero succedendo. Nella speranza che queste informazioni siano utili agli altri, le sto pubblicando qui.

Tratto da Supporto MS KB 110930 .


Da MSKB110930

  

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

     

Sommario

     

Quando reindirizza l'output da un'applicazione usando '>' simbolo, i messaggi di errore continuano a essere stampati sullo schermo. Questo perché i messaggi di errore vengono spesso inviati al flusso di errore standard anziché al flusso di uscita standard.

     

L'output da un'applicazione o un comando della console (prompt dei comandi) viene spesso inviato a due flussi separati. L'uscita normale viene inviata a Uscita standard (STDOUT) e i messaggi di errore vengono inviati a Errore standard (STDERR). Quando reindirizzi l'output della console utilizzando " > " simbolo, stai 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 reindirizzi l'output sul dispositivo NUL usando dir file.xxx > nul , vedrai comunque il messaggio di errore parte dell'output, in questo modo:

File Not Found
     

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

dir file.xxx 2> nul
     

In alternativa, puoi reindirizzare l'output in una posizione e gli errori in un'altra.

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

Puoi stampare gli errori e l'output standard su un singolo file usando " & amp; 1 " comando per reindirizzare l'output di 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 log generale di uno script:

dir >> a.txt 2>&1

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

Si noti che se si utilizzano questi per creare file di registro, a meno che non si invii l'uscita a file di registro _uniquely_named_ (ad es. data e ora), quindi se si esegue lo stesso processo due volte, il reindirizzato sovrascriverà (sostituirà) il file di registro precedente.

Il > > (per STDOUT o STDERR) APPENDERÀ non sostituirà il file. In questo modo ottieni un file di registro cumulativo, che mostra i risultati di tutte le esecuzioni del processo, in genere più utile.

Sentieri felici ...

Ho appena eliminato la risposta quando @Anders l'ha appena pubblicata, ma ...

Dal mio aiuto di Windows, ho cercato il reindirizzamento (URL ms-its: C: \ Windows. \ Help \ ntcmds.chm :: / redirection.htm )

Potresti voler leggere su > > e | (pipe), anche.

Tuttavia, non esiste alcuna garanzia che l'output di SDTOUT e STDERR si intrecciano riga per riga in ordine tempestivo, utilizzando la sintassi di unione di reindirizzamento POSIX.

Se un'applicazione utilizza un output bufferizzato, può accadere che il testo di uno stream sia inserito nell'altro in corrispondenza di un limite del buffer, che può apparire nel mezzo di una riga di testo.

Un logger di output della console dedicato (come il "StdOut / StdErr Logger" di "LoRd MuldeR") può essere più affidabile per tale compito. Vedi: Progetti OpenSource di MuldeR

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top