848 Stimmen

Windows cmd stdout und stderr in eine einzige Datei umleiten

Ich versuche, die gesamte Ausgabe (stdout + stderr) eines DOS Befehl in eine einzelne Datei:

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

Ist das möglich, oder sollte ich einfach auf zwei separate Dateien umleiten?

25 Stimmen

TechNet: Verwendung von Operatoren zur Befehlsumleitung (beantwortet diese Frage besser als alle anderen Antworten hier).

2 Stimmen

2>&1, da dieselbe Datei nicht erneut geöffnet werden kann

1343voto

Anders Lindahl Punkte 39752

Sie wollen:

dir > a.txt 2>&1

Die Syntax 2>&1 wird umgeleitet 2 (stderr) an 1 (stdout). Sie können Nachrichten auch verstecken, indem Sie sie an NUL , weitere Erläuterungen und Beispiele auf MSDN .

41 Stimmen

Danke dafür, ich wusste nicht, dass diese Unix-Shell-Syntax auch für DOS funktioniert!

25 Stimmen

Dies ist großartig, um alle Ausgaben zu verstecken. net stop w3svc >NUL 2>&1 danke!

4 Stimmen

@wasatchwizard Ich glaube, ich hatte Probleme damit, aber >NUL 2>NUL hat gut funktioniert

241voto

DelboyJay Punkte 2629

Die Antwort von Anders Lindahl ist richtig, aber es sollte beachtet werden, dass, wenn Sie stdout in eine Datei umleiten und auch stderr umleiten wollen, Sie sicherstellen MÜSSEN, dass 2>&1 angegeben ist NACH die 1> umzuleiten, sonst funktioniert es nicht.

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

16 Stimmen

NACHHER hat es mich Stunden gekostet, herauszufinden, was los ist, DelboyJay! Ich danke dir!

5 Stimmen

Wird irgendwo erklärt, warum das Setzen von 2>&1 vor 1> nicht die beabsichtigte Wirkung erzielt? Ich vermute stark, dass dies mit der Art und Weise zu tun hat, wie "cmd" Befehle parst, die je nach der Reihenfolge, in der Sie die Umleitung angeben, zwei verschiedene Bedeutungen haben. Aber sind die semantischen Regeln irgendwo dokumentiert, denn ich denke, dass es sich lohnt, dies zu lernen, da man damit Stunden verschwenden kann.

15 Stimmen

@igbgotiz 2>&1 bedeutet 'Umleitung von Stream 2 auf Stream 1'. Sie müssen also zuerst Stream 1 einrichten

100voto

StormeHawke Punkte 5714

Hintergrundinformationen von MSKB

Die akzeptierte Antwort auf diese Frage ist zwar richtig, aber sie trägt nicht viel zur Erklärung bei warum es funktioniert, und da die Syntax nicht sofort klar ist, habe ich schnell gegoogelt, um herauszufinden, was da eigentlich los ist. In der Hoffnung, dass diese Informationen für andere hilfreich sind, poste ich sie hier.

Entnommen aus MS-Support KB 110930 .


Von MSKB110930

Fehlermeldungen von der Eingabeaufforderung umleiten: STDERR/STDOUT

Zusammenfassung

Wenn die Ausgabe einer Anwendung mit dem Symbol '>' umgeleitet wird, werden Fehlermeldungen weiterhin auf dem Bildschirm ausgegeben. Dies liegt daran, dass Fehlermeldungen oft an den Standard Error Stream statt an den Standard Out Stream gesendet werden.

Die Ausgaben einer Konsolenanwendung (Eingabeaufforderung) oder eines Befehls werden häufig an zwei getrennte Ströme gesendet. Die reguläre Ausgabe wird an den Standardausgang (STDOUT) und die Fehlermeldungen werden an den Standardfehler (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. Dadurch wird der zweite Ausgabestrom ausgewählt, nämlich STDERR.

Beispiel

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

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

File Not Found

Wenn Sie die Ausgabe in die Datei NUL Gerät mit dir file.xxx > nul sehen Sie immer noch die Fehlermeldung in der Ausgabe, etwa so:

File Not Found

So leiten Sie (nur) die Fehlermeldung an NUL verwenden Sie den folgenden Befehl:

dir file.xxx 2> nul

Oder Sie können die Ausgabe an einen Ort und die Fehler an einen anderen umleiten.

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

Sie können die Fehler und die Standardausgabe in eine einzige Datei drucken, indem Sie den Befehl "&1" verwenden, um die Ausgabe von STDERR nach STDOUT umzuleiten und dann die Ausgabe von STDOUT in eine Datei zu senden:

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

45voto

Henk Wiersema Punkte 489

So fügen Sie stdout und stderr in die allgemeine Protokolldatei eines Skripts ein:

dir >> a.txt 2>&1

21 Stimmen

Les >> an die Datei angehängt, in der die > überschreibt die Datei.

15voto

Max Vitesse Punkte 131

Richtig, Dateihandle 1 für den Prozess ist STDOUT, umgeleitet durch die 1> oder durch > (1 kann weggelassen werden, der Befehlsinterpreter [cmd.exe] weiß damit umzugehen). Dateihandle 2 ist STDERR, umgeleitet von 2> .

Beachten Sie, dass, wenn Sie diese zum Erstellen von Protokolldateien verwenden, die umgeleitete Datei die vorherige überschreibt (ersetzt), es sei denn, Sie senden die Ausgabe in eindeutig benannte Protokolldateien (z. B. mit Datums- und Zeitstempel), wenn Sie denselben Prozess zweimal ausführen.

El >> (entweder für STDOUT oder STDERR) wird die Datei APPEND und nicht REPLACE. Auf diese Weise erhalten Sie eine kumulative Protokolldatei, die die Ergebnisse aller Durchläufe des Prozesses enthält - was in der Regel nützlicher ist.

Frohes Schaffen...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X