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

688

Ich versuche, die gesamte Ausgabe (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 sollte ich einfach zu zwei separaten Dateien umleiten?

ripper234
quelle
14
TechNet: Verwenden von Befehlsumleitungsoperatoren (beantwortet dies besser als alle Antworten hier).
Martin Prikryl
1
2> & 1, da es nicht die gleiche Datei wieder öffnen kann
Luke

Antworten:

1089

Sie wollen:

dir > a.txt 2>&1

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

Anders Lindahl
quelle
32
danke dafür, wusste nicht, dass diese Unix-Shell-Syntax auch für DOS funktioniert!
Chaindriver
20
Dies ist großartig, um alle Ausgaben zu verbergen net stop w3svc >NUL 2>&1. Danke!
Wasatchwizard
3
@wasatchwizard Ich dachte, ich hatte Probleme damit, aber> NUL 2> NUL hat gut funktioniert
FrinkTheBrave
13
Wenn ein Handle vorhanden ist, darf zwischen dem Handle (dh 2) und dem Umleitungsoperator (dh>) kein Leerzeichen stehen. Deshalb 2> 2.txtfunktioniert (oder 2> &1) 2 > 2.txtnicht; 2 > &1nicht.
Die rote Erbse
9
Ich liebe so sehr. "Ugh, dieses kleine einmalige Problem wird ungefähr eine Stunde dauern." Ich habe länger gebraucht, um diesen Kommentar einzugeben, als um diese Antwort zu finden.
Brandon
195

Anders Lindahl Antwort ist richtig, aber es ist zu beachten, dass , wenn Sie stdout in eine Datei umleiten und wollen stderr umleiten und dann müssen Sie sicherstellen , dass 2>&1angegeben wird NACH der 1>Umleitung, sonst wird es nicht funktionieren.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
DelboyJay
quelle
10
NACHDEM hat mich Stunden gekostet, um herauszufinden, was los ist DelboyJay! Vielen Dank!
Nam G VU
4
Wird irgendwo erklärt, warum das Setzen von 2> & 1 vor 1> nicht den beabsichtigten Effekt erzielt? Ich vermute sehr, dass dies damit zu tun hat, wie "cmd" Befehle analysiert, die je nach Reihenfolge, in der Sie die Umleitung angeben, zwei verschiedene Bedeutungen haben. Aber sind die semantischen Regeln irgendwo dokumentiert, weil ich denke, dass es sich lohnt, dies zu lernen, da es Stunden verschwenden könnte?
igbgotiz
12
@igbgotiz 2> & 1 bedeutet "Stream 2 zu Stream 1 umleiten". Sie müssen also zuerst Stream 1
einrichten
3
@FrinkTheBrave, aber Stream 1 ist Standardausgabe (z. B. Konsole), wenn nicht explizit angegeben. Das erklärt es immer noch nicht imho.
MarioDS
1
@MDeSchaepmeester, wenn Sie dies tun dir 2>&1 > a.txt, leiten Sie zuerst ( >) Stream 2 (stderr) zu Stream 1 (stdout) um. Nachdem beide bereits zusammengefügt wurden, leiten Sie stdout ( >ohne Spezifizierer) in die Datei um. Wenn Sie möchten, dass stderr woanders hingeht, können Sie stdout nicht zuerst beitreten.
cp.engr
80

Hintergrundinformationen von MSKB

Obwohl die akzeptierte Antwort auf diese Frage richtig ist, erklärt sie nicht viel, warum sie funktioniert, und da die Syntax nicht sofort klar ist, habe ich schnell googelt, um herauszufinden, was tatsächlich vor sich geht. In der Hoffnung, dass diese Informationen für andere hilfreich sind, veröffentliche ich sie hier.

Entnommen aus dem MS Support KB 110930 .


Von 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 anstelle des Standardausgangs gesendet werden.

Die Ausgabe einer Konsolenanwendung 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 für das Umleitungssymbol '2>' angeben. Dies wählt den zweiten Ausgabestream aus, der STDERR ist.

Beispiel

Der Befehl dir file.xxx(wo file.xxxnicht vorhanden) 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 auf das NULGerät umleiten dir file.xxx > nul, wird weiterhin der Teil der Fehlermeldung der Ausgabe angezeigt :

File Not Found

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

dir file.xxx 2> nul

Sie können die Ausgabe auch an eine 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 eine einzelne Datei drucken, indem Sie mit dem Befehl "& 1" die Ausgabe für STDERR an STDOUT umleiten und dann die Ausgabe von STDOUT an eine Datei senden:

dir file.xxx 1> output.msg 2>&1
StormeHawke
quelle
29

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

dir >> a.txt 2>&1
Henk Wiersema
quelle
9
Das >>hängt an die Datei an, in der >die Datei überschrieben wird.
Delliottg
13

Richtig, Dateihandle 1 für den Prozess ist STDOUT, umgeleitet von 1>oder von >(1 kann weggelassen werden, gemäß Konvention weiß der Befehlsinterpreter [cmd.exe], dass er damit umgehen kann). Das Dateihandle 2 ist STDERR und wird von umgeleitet 2>.

Beachten Sie, dass, wenn Sie diese zum Erstellen von Protokolldateien verwenden, die Umleitung überschrieben wird, wenn Sie den Outut nicht an _uniquely_named_-Protokolldateien (z. B. mit Datums- und Zeitstempel) senden. ersetzen) die vorherige Protokolldatei.

Das >>(für STDOUT oder STDERR) wird die Datei anhängen und nicht ersetzen. So erhalten Sie eine kumulative Protokolldatei, in der die Ergebnisse aller Prozessläufe angezeigt werden - normalerweise nützlicher.

Fröhliche Trails ...

Max Vitesse
quelle
2

Es gibt jedoch keine Garantie dafür, dass die Ausgabe von SDTOUTund unter STDERRVerwendung der POSIXRedirect-Merge-Syntax zeilenweise in zeitlicher Reihenfolge miteinander 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 Konsolenausgabelogger (dh der "StdOut/StdErr Logger"by 'LoRd MuldeR') ist für eine solche Aufgabe möglicherweise zuverlässiger.

Siehe: OpenSource-Projekte von MuldeR

LigH
quelle
0

In einer Batch-Datei (Windows 7 und höher) fand ich diese Methode am zuverlässigsten

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Verwenden Sie natürlich die gewünschten Befehle, und die Ausgabe wird an die Textdatei weitergeleitet. Die Verwendung dieser Methode ist jedoch zuverlässig. Es wird jedoch KEINE Ausgabe auf dem Bildschirm angezeigt.

PanamaPHat
quelle
(Im Grunde die gleiche Antwort, die vor einigen Jahren gegeben wurde.) Sie können die Ausgabe auf den Bildschirm mit zwingen >con echo This goes to screen Auch nützlich für Benutzereingaben. >con set /p "var="Input: "Hinweis: Diese Zeilen werden nur auf dem Bildschirm angezeigt und nicht in die Datei umgeleitet.
Stephan