Rediriger Windows cmd stdout et stderr vers un seul fichier

J'essaie de rediriger toutes les sorties (stdout + stderr ) d'une commande DOS vers un seul fichier:

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

Est-ce possible, ou devrais-je simplement rediriger vers deux fichiers distincts?

569
demandé sur davidism 2009-09-14 15:20:41

7 réponses

Vous voulez:

dir > a.txt 2>&1

La syntaxe 2>&1 redirige 2 (stderr) de 1 (stdout). Vous pouvez également masquer les messages en redirigeant vers NUL, Plus d'explications et d'exemples sur MSDN .

893
répondu Anders Lindahl 2017-01-19 10:26:36

La réponse D'Anders Lindahl est correcte, mais il convient de noter que si vous redirigez stdout vers un fichier et que vous voulez également rediriger stderr, vous devez vous assurer que {[1] } est spécifié après la redirection 1>, sinon cela ne fonctionnera pas.

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

Manière correcte: dir > a.txt 2>&1. Pour ajouter, utilisez >>.

171
répondu DelboyJay 2017-01-19 09:53:23

Informations générales de MSKB

Bien que la réponse acceptée à cette question soit correcte, elle ne fait vraiment pas grand-chose pour expliquer pourquoi {[14] } cela fonctionne, et comme la syntaxe n'est pas immédiatement claire, j'ai fait un rapide google pour savoir ce qui se passait réellement. Dans l'espoir que cette information soit utile aux autres, je la poste ici.

Extrait de Support MS KB 110930 .


De MSKB110930

Redirection Des Messages D'Erreur à partir de L'invite de commande: STDERR / STDOUT

Résumé

Lorsque vous redirigez la sortie d'une application à l'aide du symbole'>', les messages d'erreur s'impriment toujours à l'écran. En effet, les messages d'erreur sont souvent envoyés au flux D'erreur Standard au lieu du flux de sortie Standard.

La sortie d'une application ou d'une commande de console (invite de commande) est souvent envoyée à deux flux distincts. La sortie régulière est envoyée à la sortie Standard (STDOUT) et les messages d'erreur sont envoyés d'Erreur Standard (STDERR). Lorsque vous redirigez la sortie de la console en utilisant le symbole">", vous redirigez uniquement STDOUT. Pour rediriger STDERR, vous devez spécifier '2>' pour le symbole de redirection. Cela sélectionne le deuxième flux de sortie qui est STDERR.

Exemple

La commande dir file.xxx (où file.xxx n'existe pas) affiche la sortie suivante:

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

File Not Found

Si vous redirigez la sortie vers le périphérique NUL à l'aide de dir file.xxx > nul, le message d'erreur s'affiche toujours partie de la sortie, comme ceci:

File Not Found

Pour rediriger (uniquement) le message d'erreur vers NUL, utilisez la commande suivante:

dir file.xxx 2> nul

Ou, vous pouvez rediriger la sortie vers un endroit, et les erreurs vers un autre.

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

Vous pouvez imprimer les erreurs et la sortie standard dans un seul fichier en utilisant la commande "&1" pour rediriger la sortie de STDERR vers STDOUT, puis envoyer la sortie de STDOUT vers un fichier:

dir file.xxx 1> output.msg 2>&1
72
répondu StormeHawke 2017-12-21 13:08:11

Pour ajouter stdout et stderr au fichier journal général d'un script:

dir >> a.txt 2>&1
22
répondu Henk Wiersema 2018-07-22 14:24:05

Correct, le handle de fichier 1 pour le processus est STDOUT, redirigé par le 1> ou par > (1 peut être omis, par convention, l'interpréteur de commandes [cmd.exe] sait gérer cela). Le handle de fichier 2 est STDERR, redirigé par 2>.

Notez que si vous les utilisez pour créer des fichiers journaux, à moins que vous n'envoyiez l'outut à _uniquely_named_ (par exemple, les fichiers journaux horodatés), alors si vous exécutez le même processus deux fois, le redirigé écrasera (remplacera) le journal précédent fichier.

Le >> (pour STDOUT ou STDERR) ajoutera pas remplacer le fichier. Vous obtenez donc un fichier journal cumulatif, montrant les résultats de toutes les exécutions du processus-généralement plus utiles.

Happy trails...

12
répondu Max Vitesse 2014-02-06 04:48:24

Je viens de couper la réponse comme @Anders vient de l'afficher, mais...

À partir de mon aide Windows, j'ai cherché sur la redirection (URL ms-its: C: \ WINDOWS \ Help \ ntcmds.chm:: / redirection.htm ).

Vous pouvez également lire > > et / (pipe).

4
répondu ericp 2015-10-09 19:40:20

Il n'y a cependant aucune garantie que la sortie de SDTOUT et STDERR soit entrelacée ligne par ligne dans l'ordre opportun, en utilisant la syntaxe de fusion de redirection POSIX.

Si une application utilise une sortie tamponnée, il peut arriver que le texte d'un flux soit inséré dans l'autre à une limite de tampon, qui peut apparaître au milieu d'une ligne de texte.

Un enregistreur de sortie de console dédié (comme le "stdout / stderr Logger "de' LoRd MuldeR') peut être plus fiable pour une telle tâche. Voir: projets opensource De MuldeR

0
répondu LigH 2018-02-27 13:30:10