web-dev-qa-db-fra.com

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 séparés?

647
ripper234

Tu veux:

dir > a.txt 2>&1

La syntaxe 2>&1 redirigera 2 (stderr) vers 1 (stdout). Vous pouvez également masquer des messages en redirigeant vers NUL, plus d’explications et d’exemples sur MSDN .

1008
Anders Lindahl

La réponse d'Anders Lindahl est correcte, mais il convient de noter que si vous redirigez stdout vers un fichier et souhaitez rediriger stderr également, vous DEVEZ vous assurer que 2>&1 est spécifié APRÈS1> redirect, sinon cela ne fonctionnera pas.

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

Informations de base de la MSKB

Bien que la réponse acceptée à cette question soit correcte, elle n’a vraiment pas beaucoup à expliquer pourquoi cela fonctionne, et comme la syntaxe n’est pas immédiatement claire I a 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 technique MS 1109 .


À partir de MSKB110930

Redirection des messages d'erreur à partir d'une invite de commande: STDERR/STDOUT

Sommaire

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

La sortie d'une application ou d'une commande de la console (invite de commande) est souvent envoyée à deux flux distincts. La sortie normale est envoyée à Standard Out (STDOUT) et les messages d'erreur à Standard Error (STDERR). Lorsque vous redirigez la sortie de la console à l'aide du symbole ">", vous redirigez uniquement STDOUT. Pour rediriger STDERR, vous devez spécifier '2>' pour le symbole de redirection. Ceci sélectionne le deuxième flux de sortie qui est STDERR.

Exemple

La commande dir file.xxx (où file.xxx n'existe pas) affichera 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, vous verrez toujours la partie du message d'erreur 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

Vous pouvez également 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 en envoyant la sortie de STDOUT vers un fichier:

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

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

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

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

Notez que si vous utilisez ceux-ci pour créer des fichiers journaux, sauf si vous envoyez la sortie à des fichiers journaux _uniquely_named_ (p. Ex. Date et heure marquées), puis si vous exécutez le même processus deux fois, la redirection sera écrasée ( remplacer) le fichier journal précédent.

Le >> (pour STDOUT ou STDERR) APPENDRE non REMPLACER le fichier. Vous obtenez ainsi un fichier journal cumulatif, affichant les résultats de toutes les exécutions du processus - généralement plus utile.

Bonne route...

12
Max Vitesse

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

Dans mon aide Windows, j'ai effectué une recherche sur la redirection (URL ms-its: C:\WINDOWS\Help\ntcmds.chm ::/redirection.htm ).

Vous voudrez peut-être lire sur >> et | (pipe), aussi.

5
ericp

Cependant, rien ne garantit que les résultats de SDTOUT et STDERR s'entrelacent ligne par ligne, dans un ordre opportun, à l'aide de la syntaxe de fusion de redirection POSIX.

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

Un consignateur de sortie de console dédié (c'est-à-dire le "StdOut/StdErr Logger" de 'LoRd MuldeR') peut être plus fiable pour une telle tâche.

Voir: Projets Open Source de MuldeR

2
LigH