733 votes

Rediriger le stdout et le stderr de Windows cmd vers un seul fichier

J'essaie de rediriger toutes les sorties (stdout + stderr) d'un fichier DOS à 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 dois-je simplement rediriger vers deux fichiers distincts ?

18 votes

TechNet : Utilisation des opérateurs de redirection des commandes (répond à cette question mieux que toutes les réponses données ici).

1 votes

2>&1 car il ne peut pas rouvrir le même fichier.

1157voto

Anders Lindahl Points 17380

Vous voulez :

dir > a.txt 2>&1

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

36 votes

Merci pour cela, je ne savais pas que cette syntaxe shell unix fonctionnait aussi pour DOS !

22 votes

C'est génial pour cacher toutes les sorties.. net stop w3svc >NUL 2>&1 merci !

4 votes

@wasatchwizard Je crois que j'ai eu des problèmes avec ça, mais >NUL 2>NUL a bien fonctionné.

210voto

DelboyJay Points 348

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

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

12 votes

L'APRÈS est ce qui m'a coûté des heures pour comprendre ce qui ne va pas DelboyJay ! Merci !

4 votes

Est-il expliqué quelque part pourquoi mettre 2>&1 avant 1> n'aura pas l'effet escompté ? Je soupçonne fortement que cela a à voir avec la façon dont "cmd" analyse les commandes qui donne deux significations différentes selon l'ordre dans lequel vous spécifiez la redirection. Mais les règles sémantiques sont-elles documentées quelque part, car je pense que c'est quelque chose qui vaut la peine d'être appris, car cela pourrait faire perdre des heures.

12 votes

@igbgotiz 2>&1 signifie 'rediriger le flux 2 vers le flux 1'. Vous devez donc d'abord configurer le flux 1

85voto

StormeHawke Points 1979

Informations générales de MSKB

Bien que la réponse acceptée à cette question soit correcte, elle n'explique pas grand chose. pourquoi cela fonctionne, et comme la syntaxe n'est pas immédiatement claire, j'ai fait une rapide recherche sur Google pour savoir ce qui se passait réellement. Dans l'espoir que cette information soit utile à d'autres, je la publie ici.

Tiré 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'affichent toujours à l'écran. Cela s'explique par le fait que les messages d'erreur sont souvent envoyés dans le flux Standard Error au lieu du flux Standard Out.

La sortie d'une application ou d'une commande de console (Invite de commande) est souvent envoyée vers 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 ne redirigez que STDOUT. Afin de rediriger STDERR, vous devez spécifier '2>' pour le symbole de redirection. Ceci sélectionne le deuxième flux de sortie, à savoir 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 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 bien, 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 et ensuite envoyer la sortie de STDOUT vers un fichier :

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

33voto

user2614144 Points 31

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

dir >> a.txt 2>&1

13 votes

Le site >> s'ajoute au fichier où le > écrase le fichier.

13voto

Max Vitesse Points 21

Correct, l'identifiant de fichier 1 du processus est STDOUT, redirigé par la fonction 1> ou par > (1 peut être omis, par convention, l'interpréteur de commande [cmd.exe] sait gérer cela). L'identifiant 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 les sorties vers des fichiers journaux portant un nom unique (par exemple horodatés), si vous exécutez le même processus deux fois, le fichier redirigé écrasera (remplacera) le fichier journal précédent.

Le site >> (pour STDOUT ou STDERR) APPEND et non REPLACE le fichier. Ainsi, vous obtenez un fichier journal cumulatif, montrant les résultats de toutes les exécutions du processus - typiquement plus utile.

Bonne route...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X