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-il possible, ou devrais-je simplement rediriger vers deux fichiers distincts?
windows
command-line
cmd
pipe
ripper234
la source
la source
Réponses:
Tu veux:
La syntaxe
2>&1
redirigera2
(stderr) vers1
(stdout). Vous pouvez également masquer les messages en les redirigeant versNUL
, plus d'explications et d'exemples sur MSDN .la source
net stop w3svc >NUL 2>&1
.. merci!2> 2.txt
fonctionne (ou2> &1
)2 > 2.txt
ne fonctionne pas;2 > &1
ne fait pas.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 également rediriger stderr, vous DEVEZ vous assurer que cela
2>&1
est spécifié APRÈS la1>
redirection, sinon cela ne fonctionnera pas.la source
dir 2>&1 > a.txt
, vous redirigez d'abord (>
) le flux 2 (stderr) vers le flux 1 (stdout). Ensuite, une fois les deux déjà réunis, vous redirigez stdout (>
sans spécificateur) vers le fichier. Si vous voulez que stderr aille ailleurs, vous ne pouvez pas le rejoindre d'abord avec stdout.Informations générales de MSKB
Bien que la réponse acceptée à cette question soit correcte, cela ne fait vraiment 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 ces informations soient utiles aux autres, je les publie ici.
Tiré de MS Support KB 110930 .
À partir de MSKB110930
la source
Pour ajouter stdout et stderr au fichier journal général d'un script:
la source
>>
ajoute au fichier où le>
remplace le fichier.Correct, le descripteur 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 descripteur de fichier 2 est STDERR, redirigé par2>
.Notez que si vous les utilisez pour créer des fichiers journaux, à moins que vous n'envoyiez la sortie vers des fichiers journaux _uniquely_named_ (par exemple, horodatés), alors 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) APPENDRA PAS REMPLACER le fichier. Ainsi, vous obtenez un fichier journal cumulatif, montrant les résultats de toutes les exécutions du processus - généralement plus utiles.Bonne route...
la source
Il n'y a cependant aucune garantie que la sortie de
SDTOUT
etSTDERR
sont entrelacées ligne par ligne en temps opportun, en utilisant laPOSIX
syntaxe de fusion de redirection.Si une application utilise une sortie mise 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 enregistreur de sortie de console dédié (c'est-à-dire
"StdOut/StdErr Logger"
par'LoRd MuldeR'
) peut être plus fiable pour une telle tâche.Voir: Projets OpenSource de MuldeR
la source
Dans un fichier batch (Windows 7 et supérieur), j'ai trouvé cette méthode la plus fiable
De toute évidence, utilisez les commandes que vous voulez et la sortie sera dirigée vers le fichier texte. L'utilisation de cette méthode est fiable TOUTEFOIS, il n'y a AUCUNE sortie à l'écran.
la source
>con echo This goes to screen
également utile pour la saisie de l' utilisateur>con set /p "var="Input: "
Remarque: ces lignes seront uniquement apparaître à l' écran et ne pas être redirigé vers le fichier.