Question

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 dois-je simplement rediriger vers deux fichiers distincts?

Était-ce utile?

La solution

Vous voulez:

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 .

Autres conseils

La réponse de Anders Lindahl est correcte, mais il convient de noter que si vous redirigez stdout vers un fichier et souhaitez également rediriger stderr, vous DEVEZ alors vous assurer que 2 > & amp; 1 est spécifié < strong> 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 > & amp; 1 . Pour ajouter, utilisez > > .

Informations d'arrière-plan provenant de MSKB

Bien que la réponse acceptée à cette question soit correcte, le résultat est vraiment insuffisant pour expliquer pourquoi , et comme la syntaxe n'est pas claire, j'ai rapidement fait une recherche sur Google pour savoir ce qui se passait. se passait réellement. Dans l'espoir que cette information soit utile aux autres, je la poste ici.

Tiré de Support technique KB 110930 .

À partir de MSKB110930

  

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

     

Résumé

     

Lors de la redirection de la sortie d'une application à l'aide de l'option '>' symbole, les messages d'erreur sont toujours affichés à 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 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 avec les options " > " symbole, vous ne faites que rediriger 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 fichier.xxx (où fichier.xxx n'existe pas) affichera le résultat suivant:

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 fichier.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
     

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 les options " & amp; 1 " commande 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 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_ (par exemple, date et heure marquées), puis, si vous exécutez le même processus deux fois, le processus redirigé écrasera (remplacera) le fichier journal précédent.

Le > > (que ce soit pour STDOUT ou STDERR) APPENDRE ne REMPLACERA PAS le fichier. Vous obtenez ainsi un fichier de log cumulatif, affichant les résultats de toutes les exécutions du processus - généralement plus utile.

Bonne piste ...

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

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

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

Cependant, rien ne garantit que les résultats de SDTOUT et de STDERR sont entrelacés ligne par ligne, dans l'ordre voulu, à 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 à la limite d'une mémoire tampon, ce qui peut apparaître au milieu d'une ligne de texte.

Un consignateur de sortie de console dédié (comme le "consignateur StdOut / StdErr" de 'LoRd MuldeR') peut être plus fiable pour une telle tâche. Voir: Projets Open Source de MuldeR

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top