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?
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 .
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 >>
.
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 dedir 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
Pour ajouter stdout et stderr au fichier journal général d'un script:
dir >> a.txt 2>&1
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...
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).
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