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?
windows
command-line
cmd
pipe
ripper234
quelle
quelle
Antworten:
Sie wollen:
Die Syntax
2>&1
leitet2
(stderr) zu1
(stdout) um. Sie können Nachrichten auch ausblenden, indem Sie aufNUL
, weitere Erläuterungen und Beispiele zu MSDN umleiten .quelle
net stop w3svc >NUL 2>&1
. Danke!2> 2.txt
funktioniert (oder2> &1
)2 > 2.txt
nicht;2 > &1
nicht.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>&1
angegeben wird NACH der1>
Umleitung, sonst wird es nicht funktionieren.quelle
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.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
quelle
So fügen Sie stdout und stderr zur allgemeinen Protokolldatei eines Skripts hinzu:
quelle
>>
hängt an die Datei an, in der>
die Datei überschrieben wird.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 umgeleitet2>
.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 ...
quelle
Es gibt jedoch keine Garantie dafür, dass die Ausgabe von
SDTOUT
und unterSTDERR
Verwendung derPOSIX
Redirect-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
quelle
In einer Batch-Datei (Windows 7 und höher) fand ich diese Methode am zuverlässigsten
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.
quelle
>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.