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