Ich habe ein Batch-Skript, das eine Aufgabe ausführt und die Ausgabe an eine Textdatei sendet. Gibt es eine Möglichkeit, die Ausgabe auch im Konsolenfenster anzuzeigen?
Beispielsweise:
c:\Windows>dir > windows-dir.txt
Gibt es eine Möglichkeit, die Ausgabe der dir
Anzeige im Konsolenfenster anzuzeigen und in die Textdatei einzufügen?
windows
batch-file
cmd
JamesEggers
quelle
quelle
Antworten:
Nein, Sie können nicht mit reiner Umleitung.
Aber mit ein paar Tricks (wie tee.bat ) kannst du.
Ich versuche die Umleitung ein wenig zu erklären.
Sie leiten einen der zehn Streams mit > Datei oder <Datei um.
Es ist unwichtig, ob die Umleitung vor oder nach dem Befehl erfolgt, sodass diese beiden Zeilen nahezu identisch sind.
Die Umleitung in diesem Beispiel ist nur eine Verknüpfung für 1> . Dies bedeutet, dass der Stream 1 (STDOUT) umgeleitet wird.
Sie können also jeden Stream umleiten, indem Sie die Nummer 2> err.txt voranstellen. Außerdem können Sie mehrere Streams in einer Zeile umleiten.
In diesem Beispiel wird die "Standardausgabe" in files.txt gespeichert, alle Fehler werden in err.txt gespeichert und stream3 wird in nothing.txt gespeichert (DIR verwendet den Stream 3 nicht).
Stream0 ist STDIN
Stream1 ist STDOUT
Stream2 ist STDERR
Stream3-9 werden nicht verwendet
Aber was passiert, wenn Sie versuchen, denselben Stream mehrmals umzuleiten?
"Es kann nur einen geben", und es ist immer der letzte!
Es ist also gleich dir> two.txt
Ok, es gibt eine zusätzliche Möglichkeit, einen Stream zu einem anderen Stream umzuleiten.
2> & 1 leitet stream2 zu stream1 um und 1> files.txt leitet alle zu files.txt um .
Die Reihenfolge ist hier wichtig!
sind anders. Die erste Zeile leitet alle (STDOUT und STDERR) an NUL weiter,
die zweite Zeile leitet die STDOUT an NUL und STDERR an die "leere" STDOUT weiter.
Als eine Schlussfolgerung ist es offensichtlich, warum die Beispiele von Otávio Décio und andynormancx nicht funktionieren können.
Beide versuchen zweimal, stream1 umzuleiten, aber "Es kann nur einen geben", und es ist immer der letzte.
Also verstehst du
Und im ersten Beispiel ist die Umleitung von Stream1 zu Stream1 nicht zulässig (und nicht sehr nützlich).
Ich hoffe es hilft.
quelle
3<&2
(beachte den LT anstelle des GT) und dann3>errors.txt
. Dies endete jedoch schlecht - alle nachfolgenden stderr-Ausgaben wurden erfassterrors.txt
( dh auch von anderen Befehlen!).for /f "delims=" %%v in ('dir') do echo %%v>>file.txt
.Verwenden Sie einfach die Windows-Version des UNIX-Befehls tee (zu finden unter http://unxutils.sourceforge.net ) auf folgende Weise:
Wenn Sie auch den STDERR-Ausgang benötigen, verwenden Sie Folgendes.
Das
2>&1
kombiniert die STDERR-Ausgabe in STDOUT (dem primären Stream).quelle
1>tee a.txt
leitet stdout in eine Datei mit dem Namen um,tee
anstatt dentee
Befehl aufzurufen . Kann jemand bestätigen, dass diese Antwort für sie funktioniert?Wenn Sie die Ausgabe nicht in Echtzeit benötigen (dh während das Programm sie schreibt), können Sie sie hinzufügen
nach dieser Zeile.
quelle
dir > windows-dir.txt & type windows-dir.txt
. Dies gilt auch für Bausteine :( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt
. Wenn die Ausgabe jedoch in Echtzeit benötigt wird, können Sie zB einen Windows-Port des Tee- Tools dafür verwenden ...Die Lösung, die für mich funktioniert hat, war: dir> a.txt | Geben Sie a.txt ein .
quelle
Ja, es gibt eine Möglichkeit, eine einzelne Befehlsausgabe auf der Konsole (Bildschirm) und in einer Datei anzuzeigen. Verwenden Sie anhand Ihres Beispiels ...
Ausführliche Erklärung:
Der
FOR
Befehl analysiert die Ausgabe eines Befehls oder Textes in eine Variable, auf die mehrfach verwiesen werden kann.Schließen Sie für einen Befehl, wie z. B.
DIR /B
in einfache Anführungszeichen ein, wie im folgenden Beispiel gezeigt. Ersetzen Sie denDIR /B
Text durch den gewünschten Befehl.Schließen Sie zum Anzeigen von Text Text in doppelte Anführungszeichen ein, wie im folgenden Beispiel gezeigt.
... und mit Zeilenumbruch ...
Wenn Sie Zeiten haben, in denen die Ausgabe nur auf der Konsole (Bildschirm) und zu anderen Zeiten nur an eine Datei und zu anderen Zeiten an beide gesendet werden soll, geben Sie die "DO" -Klausel der FOR-Schleife mithilfe einer Variablen an, wie unten mit gezeigt
%TOECHOWHERE%
.quelle
delims=
stattdessen verwenden.quelle
Wenn Sie die Ausgabedatei anhängen möchten, anstatt sie zu ersetzen, möchten Sie sie möglicherweise verwenden
oder
quelle
Meine Option war folgende:
Erstellen Sie eine Unterroutine, die die Nachricht aufnimmt und den Prozess des Sendens an die Konsole und die Protokolldatei automatisiert.
Wenn Sie der Nachricht eine Variable hinzufügen, müssen Sie die darin enthaltenen Anführungszeichen entfernen, bevor Sie sie an das Unterprogramm senden. Andernfalls kann Ihr Stapel beschädigt werden. Dies funktioniert natürlich nur zum Echo.
quelle
setlocal enabledelayedexpansion
statt nursetlocal
2) Ich verwende die verzögerte Erweiterung für die Variable logfile, also>> !logfile!
nicht>> %logfile%
innerhalb der Unterroutine. Auf diese Weise funktioniert es, wenn es aus einem Codeblock heraus aufgerufen wird (wie in einer if-Anweisung). 3) Ich habe die Zeile "Nachricht setzen" entfernt, da die zusätzliche Variable nicht benötigt wird. Wir haben es bereits in,$~1
also habe ichecho $~1
für beide Echo-Befehle.Ich habe eine einfache C # -Konsole erstellt, die die Echtzeitausgabe sowohl auf dem cmd-Bildschirm als auch im Protokoll verarbeiten kann
Die Verwendung von Batchdateien entspricht der Verwendung von Unix
tee
Und hier ist das Repository, das die Tee.exe enthält, falls Sie kein Tool zum Kompilieren von https://github.com/iamshiao/Tee haben
quelle
Ich mag die Antwort von atn, aber es war für mich nicht so trivial, sie herunterzuladen wie wintee , das ebenfalls Open Source ist und nur die Tee-Funktionalität bietet (nützlich, wenn Sie nur Tee und nicht den gesamten Satz von Unix-Dienstprogrammen wollen). Dies erfuhr ich aus der Antwort von davor auf die Ausgabe der Windows-Eingabeaufforderung anzeigen und in eine Datei umleiten , in der Sie auch Verweise auf die Unix-Dienstprogramme finden.
quelle
Die von "Tomas R" bereitgestellte Lösung funktioniert perfekt für die Frage des OP und ist nativ verfügbar.
Versuchen Sie: chkdsk c:> output.txt | Geben Sie output.txt ein
Die Ausgabe dieses Befehls beinhaltet einen Fertigstellungsprozentsatz, der seriell in die Datei ausgegeben wird, daher sieht sie etwas chaotisch aus (dh der Text wird im Verlauf angehängt). Dies passiert nicht mit den Bits, die an STDOUT (den Bildschirm) ausgegeben werden. So wäre es, wenn Sie denselben Befehl ohne Umleitung ausführen würden.
quelle
Ich denke, Sie wollen etwas in dieser Richtung:
Oder wenn Sie eine neue Zeile möchten:
Diese Befehle eignen sich hervorragend für Protokolle.
Hinweis: Dies führt manchmal zu Störungen und ersetzt die gesamte Textdatei auf meinem Computer.
Ein weiterer Hinweis: Wenn die Datei nicht vorhanden ist, wird die Datei erstellt.
quelle
>
ist entworfen , um die Datei zu überschreiben Verwendung. Anhängen )>>