Wie kann ich eine Befehlszeilenanwendung an der Windows-Eingabeaufforderung ausführen und die Ausgabe gleichzeitig anzeigen und in eine Datei umleiten lassen?
Wenn ich zum Beispiel den Befehl ausführen dir > test.txt
würde, würde dies die Ausgabe in eine aufgerufene Datei umleitentest.txt
ohne die Ergebnisse anzuzeigen.
Wie kann ich einen Befehl schreiben, um die Ausgabe anzuzeigen und die Ausgabe in eine Datei an der Windows-Eingabeaufforderung umzuleiten, ähnlich dem tee
Befehl unter Unix?
batch-file
cmd
stdout
tee
Edward Thomson
quelle
quelle
Antworten:
Um die Antwort von davor zu erweitern , können Sie PowerShell folgendermaßen verwenden:
Wenn Sie versuchen, die Ausgabe einer Exe im aktuellen Verzeichnis umzuleiten, müssen Sie
.\
den Dateinamen verwenden, z.quelle
dir
in Powershell ein Alias ist,Get-ChildItem
der nicht dem internendir
Befehl von cmd entspricht . Sie benötigen,powershell "cmd /c dir | tee test.txt"
wenn Sie die interne Version von2>&1
, zum Beispiel mitnode 2>&1 | tee debug_log.txt
Ich konnte eine Lösung / Problemumgehung für die Umleitung der Ausgabe in eine Datei und dann in die Konsole finden:
Dabei ist dir der Befehl, dessen Ausgabe umgeleitet werden muss, a.txt eine Datei, in der die Ausgabe gespeichert werden soll.
quelle
&
anstelle von a|
für die Ausgabe einiger Befehle benötigt wird, wieping
oder7z.exe
dir
. Beispiel :chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. Die Systemberichtsdatei wird von einem anderen Prozess gesperrt.handle output to stderr
- Fügen Sie die2>&1
Umleitung so hinzu:dir 2>&1 > a.txt & type a.txt
und Sie sollten stderr mit stdout gemischt haben.Es gibt einen Win32-Port des Unix-
tee
Befehls, der genau das tut. Siehe http://unxutils.sourceforge.net/ oder http://getgnuwin32.sourceforge.net/quelle
tee
Paket von GnuWin32 zu finden , finden Sie es in gnuwin32.sourceforge.net/packages/coreutils.htm .Schauen Sie sich das an: wintee
Keine Notwendigkeit für Cygwin.
Ich bin jedoch auf einige Probleme gestoßen und habe sie gemeldet.
Sie können auch Unxutils überprüfen, da es Tee enthält (und kein Cygwin erforderlich ist). Beachten Sie jedoch, dass die Ausgabe-EOLs hier UNIX-ähnlich sind.
Zu guter Letzt können Sie Tee-Object ausprobieren, wenn Sie über PowerShell verfügen. Geben Sie die
get-help tee-object
PowerShell-Konsole ein, um weitere Informationen zu erhalten.quelle
tee
gibt in Echtzeit aus.wtee
hat die gleiche Funktionalität. Wenn Sie die Fehler nicht stören, wird es gut tun.@ tori3852
ich habe das gefunden
hat nicht funktioniert (nur die ersten paar Zeilen der Verzeichnisliste - Verdacht auf eine Art Prozessgabelung und der zweite Teil, der Befehl 'type' wurde beendet, bevor die Verzeichnisliste abgeschlossen wurde?), also habe ich stattdessen Folgendes verwendet:
was tat - sequentielle Befehle, die man abschließt, bevor der zweite startet.
quelle
&
anstelle von verwenden,&&
wenn Sie sicherstellen möchten, dass dertype
Befehl auch dann ausgeführt wird, wenn derdir
Befehl fehlgeschlagen ist. Dies ist nützlich, wenn in Ihrem Befehl ein Fehler aufgetreten ist und Sie die Protokolldatei weiterhin auf der Konsole anzeigen möchten. Siehe dazu den Artikel von Microsoft . Dies hat jedoch das Problem%errorlevel%
, auf die Fehlerstufe vontype
(die 0 wäre) gesetzt zu werden.Leider gibt es so etwas nicht.
Windows-Konsolenanwendungen haben nur ein einziges Ausgabehandle. (Nun, es gibt zwei
STDOUT
,STDERR
aber das spielt hier keine Rolle.) Der>
leitet die normalerweise in das Konsolenhandle geschriebene Ausgabe in ein Dateihandle um.Wenn Sie eine Art Multiplexing wünschen, müssen Sie eine externe Anwendung verwenden, zu der Sie die Ausgabe umleiten können. Diese Anwendung kann dann erneut in eine Datei und in die Konsole schreiben.
quelle
tee
on * nix ist auch eine separate Anwendung, keine Umleitung auf der ShellEine einfache C # -Konsolenanwendung würde den Trick machen:
Um dies zu verwenden, leiten Sie einfach den Quellbefehl in das Programm ein und geben den Pfad aller Dateien an, in die Sie die Ausgabe duplizieren möchten. Zum Beispiel:
Zeigt die Ergebnisse von dir an und speichert die Ergebnisse sowohl in files1.txt als auch in files2.txt.
Beachten Sie, dass die oben beschriebene Fehlerbehandlung nicht viel (irgendetwas!) Hält und die Unterstützung mehrerer Dateien möglicherweise nicht erforderlich ist.
quelle
Das funktioniert, obwohl es ein bisschen hässlich ist:
Es ist etwas flexibler als einige der anderen Lösungen, da es Anweisung für Anweisung funktioniert, sodass Sie es auch zum Anhängen verwenden können. Ich verwende dies ziemlich oft in Batch-Dateien, um Nachrichten zu protokollieren und anzuzeigen:
Ja, Sie können die ECHO-Anweisung einfach wiederholen (einmal für den Bildschirm und zum zweiten Mal zur Umleitung in die Protokolldatei), aber das sieht genauso schlecht aus und ist ein kleines Wartungsproblem. Zumindest auf diese Weise müssen Sie an zwei Stellen keine Änderungen an Nachrichten vornehmen.
Beachten Sie, dass _ nur ein kurzer Dateiname ist. Sie müssen ihn daher am Ende Ihrer Batchdatei löschen (wenn Sie eine Batchdatei verwenden).
quelle
type
Befehle in separate Zeilen (in einem Unterprogramm) hat dies jedoch behoben.mtee ist ein kleines Dienstprogramm, das für diesen Zweck sehr gut funktioniert. Es ist kostenlos, die Quelle ist offen und es funktioniert einfach.
Sie finden es unter http://www.commandline.co.uk .
Wird in einer Batchdatei verwendet, um die Ausgabe anzuzeigen UND gleichzeitig eine Protokolldatei zu erstellen. Die Syntax sieht folgendermaßen aus:
Wobei / + bedeutet, die Ausgabe anzuhängen.
Dies setzt voraus, dass Sie mtee in einen Ordner kopiert haben, der sich natürlich im PATH befindet.
quelle
Ich möchte die ausgezeichnete Antwort von Saxon Druce etwas näher erläutern .
Wie bereits erwähnt, können Sie die Ausgabe einer ausführbaren Datei im aktuellen Verzeichnis wie folgt umleiten:
Dies protokolliert jedoch nur
stdout
beitest.txt
. Es wird auch nicht protokolliertstderr
.Die naheliegende Lösung wäre, so etwas zu verwenden:
Dies funktioniert jedoch nicht für alle
something.exe
s. Einigesomething.exe
s werden das2>&1
als Argument interpretieren und scheitern. Die richtige Lösung besteht darin, stattdessen nur Apostrophe um dassomething.exe
und seine Schalter und Argumente zu haben, wie folgt :quelle
'tee' is not recognized as an internal or external command
aus offensichtlichen Gründen. Mit der2>&1
inneren cmd-Zeile verursacht jede Ausgabe an stderr Fehler von Powershell.Ich stimme Brian Rasmussen zu, der Unxutils-Port ist der einfachste Weg, dies zu tun. Im Batch - Dateien Abschnitt seines Scripting Pages Rob van der Woude bietet eine Fülle von Informationen über die Verwendung von MS-DOS und CMD - Befehlen. Ich dachte, er könnte eine native Lösung für Ihr Problem haben, und nachdem ich mich dort umgesehen hatte , fand ich TEE.BAT , was genau das zu sein scheint, eine MS-DOS-Batch- Sprachimplementierung von tee. Es ist eine ziemlich komplex aussehende Batch-Datei und meine Neigung wäre immer noch, den unxutils-Port zu verwenden.
quelle
Wenn Sie Cygwin in Ihrem Windows-Umgebungspfad haben, können Sie Folgendes verwenden:
quelle
dir 1>a.txt 2>&1 | type a.txt
Dies hilft, sowohl STDOUT als auch STDERR umzuleiten
quelle
Ich weiß, dass dies ein sehr altes Thema ist, aber in früheren Antworten gibt es keine vollständige Implementierung eines in Batch geschriebenen Echtzeit-T-Stücks. Meine Lösung unten ist ein Batch-JScript-Hybridskript, das den JScript-Abschnitt verwendet, um nur die Ausgabe des Piped-Befehls abzurufen. Die Verarbeitung der Daten erfolgt jedoch im Batch-Abschnitt. Dieser Ansatz hat den Vorteil, dass jeder Batch-Programmierer dieses Programm an bestimmte Anforderungen anpassen kann. Dieses Programm verarbeitet auch die Ausgabe des CLS-Befehls, der von anderen Batch-Dateien erzeugt wird, korrekt, dh es löscht den Bildschirm, wenn die Ausgabe des CLS-Befehls erkannt wird.
quelle
file.exe 2>output.txt
file.exe 2>&1|tee.bat
wie folgtIch suchte auch nach der gleichen Lösung. Nach einem kleinen Versuch konnte ich dies in der Eingabeaufforderung erfolgreich erreichen. Hier ist meine Lösung:
Es erfasst sogar jeden PAUSE-Befehl.
quelle
Hier ist ein Beispiel von dem, was ich basierend auf einer der anderen Antworten verwendet habe
quelle
So etwas sollte tun, was Sie brauchen?
quelle
Ausgabe an Konsole senden, an Konsolenprotokoll anhängen, Ausgabe aus aktuellem Befehl löschen
quelle
Dies ist eine Variation einer früheren Antwort von MTS, fügt jedoch einige Funktionen hinzu, die für andere nützlich sein könnten. Hier ist die Methode, die ich verwendet habe:
set _Temp_Msg_Cmd=
^
sodass die Befehle zunächst nicht ausgewertet werden%~n0_temp.txt
verwendet , um den Namen der Batchdatei abzurufen.%~n0
%~n0_log.txt
Hier ist die Reihenfolge der Befehle:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Hier ist das Beispiel:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
Auf diese Weise kann der Befehl einfach nach späteren Befehlen in einer Batch-Datei angehängt werden, die viel sauberer aussieht:
echo test message %_Temp_Msg_Cmd%
Dies kann auch am Ende anderer Befehle hinzugefügt werden. Soweit ich das beurteilen kann, funktioniert es, wenn Nachrichten mehrere Zeilen haben. Der folgende Befehl gibt beispielsweise zwei Zeilen aus, wenn eine Fehlermeldung angezeigt wird:
net use M: /D /Y %_Temp_Msg_Cmd%
quelle
Dadurch wird eine Protokolldatei mit der aktuellen Datums- und Uhrzeitangabe erstellt, und Sie können die Konsolenzeilen während des Vorgangs erstellen
quelle
Ich verwende eine Batch-Subroutine mit einer "for" -Anweisung, um den Befehl zeilenweise auszugeben, und beide schreiben diese Zeile in eine Datei und geben sie an die Konsole aus.
quelle
Wenn Sie sich in der CLI befinden, können Sie mit einer FOR-Schleife tun, was Sie wollen:
Ressource unter Windows CMD für Schleifen: https://ss64.com/nt/for_cmd.html Der Schlüssel hier ist, die Begrenzer (Begrenzungen), die jede Ausgabezeile aufteilen würden, auf nichts zu setzen. Auf diese Weise wird die Standardeinstellung für Leerzeichen nicht unterbrochen. % A ist ein beliebiger Buchstabe, wird jedoch im Abschnitt "do" verwendet, um ... etwas mit den Zeichen zu tun, die in jeder Zeile analysiert wurden. In diesem Fall können wir das kaufmännische Und (&&) verwenden, um den 2. Echo-Befehl auszuführen, um eine Datei unserer Wahl zu erstellen oder an diese anzuhängen (>>). Es ist sicherer, diese Reihenfolge der DO-Befehle beizubehalten, falls beim Schreiben der Datei ein Problem auftritt. Zumindest wird das Echo zuerst an die Konsole gesendet. Das at-Zeichen (@) vor dem ersten Echo verhindert, dass die Konsole den Echo-Befehl selbst anzeigt, und zeigt stattdessen nur das Ergebnis des Befehls an, der die Zeichen in% a anzeigt. Sonst würden Sie sehen:
UPDATE: / F überspringt leere Zeilen und behebt nur die Vorfilterung der Ausgabe, indem jeder Zeile ein Zeichen hinzugefügt wird (möglicherweise mit Zeilennummern über den Befehl find). Das Lösen in CLI ist nicht schnell oder hübsch. Außerdem habe ich STDERR nicht eingeschlossen, daher werden hier auch Fehler erfasst:
Fehlermeldungen umleiten
Die Carets (^) dienen dazu, den Symbolen nach ihnen zu entkommen, da der Befehl eine Zeichenfolge ist, die interpretiert wird, anstatt sie direkt in die Befehlszeile einzugeben.
quelle
Genau wie Unix.
dir | tee a.txt
Funktioniert Unter Windows XP muss es
mksnt
installiert sein.Es wird an der Eingabeaufforderung angezeigt und an die Datei angehängt.
quelle
Das Folgende hilft, wenn Sie möchten, dass etwas wirklich auf dem Bildschirm angezeigt wird - auch wenn die Batchdatei in eine Datei umgeleitet wurde. Das Gerät CON kann auch verwendet werden, wenn es in eine Datei umgeleitet wird
Beispiel:
Siehe auch eine gute Umleitungsbeschreibung: http://www.p-dd.com/chapter7-page14.html
quelle
Sie können diese Befehle in biterscripting ( http://www.biterscripting.com ) nützlich finden.
quelle
Dies funktioniert in Echtzeit, ist aber auch ziemlich hässlich und die Leistung ist langsam. Auch nicht gut getestet:
quelle
%MYCOMMAND%
es fertig ist und es schlägt in vielen Fällen fehl. Es überspringt leere Zeilen, beginnend Zeilen mit;
mit Inhalt nicht wie<space>/<TAB>
,ON
,OFF
oder/?
. Aber der Rest könnte manchmal funktionieren :-)Eine Alternative besteht darin, stdout zu stderr innerhalb Ihres Programms zu tippen:
in Java:
Dann in Ihrer Dos-Batchdatei:
java program > log.txt
Das stdout wird in die Protokolldatei verschoben und das stderr (dieselben Daten) wird auf der Konsole angezeigt.
quelle
Ich installiere Perl auf den meisten meiner Computer, daher eine Antwort mit Perl: tee.pl.
dir | perl tee.pl oder dir | perl tee.pl dir.bat
roh und ungetestet.
quelle
Eine andere Variante besteht darin, die Pipe zu teilen und die Ausgabe dann nach Belieben umzuleiten.
Speichern Sie das oben genannte in einer .bat-Datei. Es teilt die Textausgabe von Filestream 1 auch in Filestream 3 auf, die Sie nach Bedarf umleiten können. In meinen Beispielen unten habe ich das obige Skript splitPipe.bat aufgerufen ...
quelle
c:\cygwin64\bin\script.exe
und geben Sie eincmd
und geben Sie einexit
und geben Sie ein (beendet Cygwins cmd.exe)exit
und geben Sie (Ausfahrten Cygwin script.exe)quelle