Question Rediriger Windows cmd stdout et stderr vers un seul fichier


J'essaie de rediriger toutes les sorties (stdout + stderr) d'un DOS commande à 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?


538
2017-09-14 11:20


origine


Réponses:


Tu veux:

dir > a.txt 2>&1

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


855
2017-09-14 11:23



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

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

Façon correcte: dir > a.txt 2>&1. Pour ajouter, utilisez >>.


166
2018-05-23 11:59



Informations de base de MSKB

Bien que la réponse acceptée à cette question soit correcte, elle ne fait pas grand-chose pour expliquer Pourquoi cela fonctionne, et puisque 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 est utile aux autres, je l'affiche ici.

Pris à partir de MS Support 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. Cela est dû au fait que les messages d'erreur sont souvent envoyés au flux d'erreur standard au lieu du flux Standard Out.

La sortie d'une application ou d'une commande de console (Command Prompt) est souvent envoyée à deux flux distincts. La sortie normale est envoyée à Standard Out (STDOUT) et les messages d'erreur sont envoyés à 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 NUL dispositif utilisant 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

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

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

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

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

69
2017-10-18 18:57



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

dir >> a.txt 2>&1

18
2017-07-24 10:16



Correct, le gestionnaire de fichiers 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 utilisez ces fichiers pour créer des fichiers journaux, à moins que vous n'envoyiez les fichiers journaux _uniquely_named_ (par exemple, date et heure), les fichiers journaux sont tronqués, et si vous exécutez deux fois le même processus, remplacer) le fichier journal précédent.

le >> (pour STDOUT ou STDERR) APPENDER NE PAS 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 utiles.

Bonne route...


12
2018-02-06 04:28



Je viens de couper la réponse que @Anders vient de poster, mais ...

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

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


4
2017-09-14 11:27



Cependant, il n'y a aucune garantie que la sortie de SDTOUT et de STDERR sont entrelacées ligne par ligne dans un ordre rapide, en utilisant la syntaxe de fusion POSIX redirect.

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 la mémoire 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: Les projets OpenSource de MuldeR


0
2018-02-27 13:30