it-swarm.com.de

Leiten Sie Windows cmd stdout und stderr in eine einzelne Datei um

Ich versuche, alle Ausgaben (stdout + stderr) eines DOS -Befehls in eine einzelne Datei umzuleiten:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

Ist es möglich, oder soll ich nur auf zwei separate Dateien umleiten?

647
ripper234

Sie wollen:

dir > a.txt 2>&1

Die Syntax 2>&1 leitet 2 (stderr) zu 1 (stdout) um. Sie können Nachrichten auch ausblenden, indem Sie zu NUL umleiten, weitere Erläuterungen und Beispiele zu MSDN .

1008
Anders Lindahl

Anders Lindahls Antwort ist richtig, aber es ist zu beachten, dass wenn Sie stdout in eine Datei umleiten und stderr ebenfalls umleiten möchten, Sie sicherstellen MÜSSEN, dass 2>&1 angegeben ist NACH the 1> umleiten, sonst funktioniert es nicht.

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

Hintergrundinformationen von MSKB

Die akzeptierte Antwort auf diese Frage ist zwar richtig, aber sie erklärt nicht viel , warum sie funktioniert, und da die Syntax nicht sofort klar ist googelte schnell, um herauszufinden, was tatsächlich los war. In der Hoffnung, dass diese Informationen für andere hilfreich sind, veröffentliche ich sie hier.

Entnommen aus MS Support KB 1109 .


Aus MSKB110930

Umleiten von Fehlermeldungen von der Eingabeaufforderung: STDERR/STDOUT

Zusammenfassung

Wenn Sie die Ausgabe einer Anwendung mit dem Symbol '>' umleiten, werden weiterhin Fehlermeldungen auf dem Bildschirm angezeigt. Dies liegt daran, dass Fehlermeldungen häufig an den Standardfehlerstrom anstatt an den Standardausgangsstrom gesendet werden.

Die Ausgabe einer Konsolenanwendung (Eingabeaufforderung) oder eines Befehls wird häufig an zwei separate Streams gesendet. Die reguläre Ausgabe wird an Standard Out (STDOUT) und die Fehlermeldungen an Standard Error (STDERR) gesendet. Wenn Sie die Konsolenausgabe mit dem Symbol ">" umleiten, leiten Sie nur STDOUT um. Um STDERR umzuleiten, müssen Sie '2>' für das Umleitungssymbol angeben. Dies wählt den zweiten Ausgangsstrom aus, der STDERR ist.

Beispiel

Der Befehl dir file.xxx (wobei file.xxx nicht vorhanden ist) zeigt die folgende Ausgabe an:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

Wenn Sie die Ausgabe mit dir file.xxx > nul auf das Gerät NUL umleiten, wird der Teil der Fehlermeldung weiterhin wie folgt angezeigt:

File Not Found

Verwenden Sie den folgenden Befehl, um (nur) die Fehlermeldung an NUL umzuleiten:

dir file.xxx 2> nul

Sie können die Ausgabe auch an eine andere Stelle und die Fehler an eine andere umleiten.

dir file.xxx > output.msg 2> output.err

Sie können die Fehler und die Standardausgabe in einer einzelnen Datei drucken, indem Sie den Befehl "& 1" verwenden, um die Ausgabe für STDERR an STDOUT umzuleiten, und die Ausgabe von STDOUT anschließend an eine Datei senden:

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

So fügen Sie stdout und stderr zur allgemeinen Protokolldatei eines Skripts hinzu:

dir >> a.txt 2>&1
28
Henk Wiersema

Richtig, Datei-Handle 1 für den Prozess ist STDOUT, umgeleitet von 1> oder > (1 kann weggelassen werden, wie es der Befehlsinterpreter [cmd.exe] weiß). Dateihandle 2 ist STDERR, umgeleitet von 2>.

Beachten Sie, dass, wenn Sie diese zum Erstellen von Protokolldateien verwenden, die umgeleitete Datei überschreibt, wenn Sie die Ausgabe nicht an _uniquely_named_-Protokolldateien senden (z. B. mit Datums- und Zeitstempel). Wenn Sie denselben Prozess zweimal ausführen ( Ersetzen Sie die vorherige Protokolldatei.

Der >> (für STDOUT oder STDERR) APPEND ersetzt die Datei nicht. So erhalten Sie eine kumulative Protokolldatei, in der die Ergebnisse aller Durchläufe des Prozesses angezeigt werden - in der Regel nützlicher.

Fröhliche Trails ...

12
Max Vitesse

Ich habe die Antwort gerade herausgeschnitten, da @Anders sie gerade gepostet hat, aber ...

In meiner Windows-Hilfe habe ich nach Umleitungen gesucht (URL ms-its: C:\WINDOWS\Help\ntcmds.chm ::/redirection.htm ).

Vielleicht möchten Sie etwas über >> und | lesen (Rohr) auch.

5
ericp

Es kann jedoch nicht garantiert werden, dass die Ausgabe von SDTOUT und STDERR unter Verwendung der POSIX -Redirect-Merge-Syntax zeilenweise in zeitlicher Reihenfolge verwoben wird.

Wenn eine Anwendung eine gepufferte Ausgabe verwendet, kann es vorkommen, dass der Text eines Streams an einer Puffergrenze in den anderen eingefügt wird, die möglicherweise in der Mitte einer Textzeile angezeigt wird.

Ein dedizierter Konsolenausgabe-Logger (d. H. Der "StdOut/StdErr Logger" von 'LoRd MuldeR') kann für eine solche Aufgabe zuverlässiger sein.

Siehe: MuldeRs OpenSource-Projekte

2
LigH