Batch - mit und ohne tee - Konsoleausgaben zugleich in eine Datei leiten und auf dem Bildschirm ausgeben
Tipp: Wird der Inhalt in den Quelltextfenstern chaotisch angezeigt, kann es hilfreich sein dort auf den Link "Quelltext" (oben rechts) zu klicken. Es öffnet sich dann ein separates Fenster, welches in der maximierten Darstellung, je nach Bildschirmauflösung, den unerwünschten Zeilenumbruch unterbindet.
Die folgende Anleitung zeigt Lösungen auf, die es erlauben Batch-Ausgaben (oder die eines Konsoleprogramms) auf dem Bildschirm anzuzeigen und diese parallel dazu in eine Datei zu schreiben.
Lösung 1: Inhalt von TeeMyBatch.cmd:
@echo off
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1
for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y) >>%1 & echo.%%y
rem "findstr /n $" verhindert, dass hierbei Leerzeilen verloren gehen
)
TeeMyBatch.cmd .\MyLogfile.txt MyBatch.cmd <Parameter1> <Parameter2> ...
Lösung 2: Die Verzögerung der Ausgabe lässt sich minimieren, indem auf TeeMyBatch.cmd komplett verzichtet wird. Stattdessen übernimmt eine Funktion innerhalb der eigenen Batch diese Aufgabe für jeden Befehl einzeln:
@echo off & setlocal
call :FncTeeOut .\MyLogfile.txt echo Test 1
call :FncTeeOut .\MyLogfile.txt net use x: \\server\freigabe /User:x abc
call :FncTeeOut .\MyLogfile.txt echo Test 2
goto :EOF
:FncTeeOut ::Version 1.0.1
::Parameters: <LogFileName> <Command with parameters ...>
::Example: call :FncTeeOut .\MyLogFile.txt echo It is a test. (print on screen and to logfile)
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1
for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y) >>%1 & echo.%%y
)
exit /b 0
Bye, nz
Lösung 3: In der folgenden Funktion wird der Vorschlag von miniversum (siehe seinen Beitrag weiter unten) umgesetzt, indem die Befehlsausgabe in eine Datei geschrieben wird. Nachdem der Befehl abgearbeitet wurde, lässt sich der Dateiinhalt sowohl auf den Bildschirm, als auch in die Log-Datei schreiben.
@echo off & setlocal
call :FncTeeOut2 .\MyLogfile.txt echo Test 1
call :FncTeeOut2 .\MyLogfile.txt net use x: \\server\freigabe /User:x abc
call :FncTeeOut2 .\MyLogfile.txt echo Test 2
goto :EOF
:FncTeeOut2 {{comment_single_line_remark:0}}
::Parameters: <LogFileName> <Command with parameters ...>
::Example: call :FncTeeOut .\MyLogFile.txt echo It is a test.
setlocal & set _FncTeeOut_TMP=%TMP%\%~n0_tee%RANDOM%.tmp
for /F "tokens=1*" %%a in ("%*") do (%%b) > %_FncTeeOut_TMP% 2>&1 &::ParZeile ohne %1 ausführen
type %_FncTeeOut_TMP% &::Ausgabe der vorherigen Befehlszeile auf dem Bildschirm anzeigen...
type %_FncTeeOut_TMP% >> %1 &::... und ins Logfile schreiben
del %_FncTeeOut_TMP% & endlocal
exit /b 0
rem Ausgaben innerhalb der Batch zweimal erzeugen und die zweite Ausgabe ins Log schreiben:
echo xyz
echo xyz >>.\MyLogfile.txt
rem Oder nur im Fehlerfall den Befehl nochmals ausführen und Ausgabe ins Log schreiben:
net use x: \\server\freigabe
if Errorlevel 1 net use x: \\server\freigabe >>.\MyLogfile.txt
rem Alternativ dazu
net use x: \\server\freigabe 2>NUL
if Errorlevel 1 (
echo Laufwerk X: konnte nicht verbunden werden!
echo Laufwerk X: konnte nicht verbunden werden! >>.\MyLogfile.txt
)
MyBatch.cmd | tee.exe .\MyLogfile.txt
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 96916
Url: https://administrator.de/contentid/96916
Ausgedruckt am: 21.11.2024 um 23:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo, NeonZero.
Ich danke dir für deine Mühe, diesen Beitrag zusammenzustellen.
Würdest du meine Fragen ausführlicher beantworten?
Lösung 1:
Was ist die Parameterzeile und was meint abzüglich des Parameters 1?
Was ist ^(%%b^) 2^>^&1 bzw. (%%b) 2>&1 ? Antwort: Standardfehlerkanal (Kanal 2) dorthin umleiten, wohin auch die Standardausgabe (Kanal 1 ) umgeleitet ist.
Das $ soll auch Leerzeilen einschließen, aber wofür steht das $ Zeichen und in welchem Zusammenhang kommt es vor? Antwort: $ ist das Zeichen am Zeilenende, ^ am Zeilenanfang.
Lösung 2:
Was bedeutet in ("%*"), sind das die Umgebungsvariablen, z.B. %0=Laufwerk\Pfad\Name.Erweiterung?
Wie wird die Parameterzeile %%b definiert?
Lösung 3:
Was bedeutet dieser Ausdruck: 2>&1 ? Antwort: Das ist die Umleitung des Kanal 2 (Fehlerkanal) den Kanal 1 (Standartausgabakanal)?
Was bedeutet exit /b 0 ? Antwort: exit /b beendet einen batch im Konsolenfenster und lässt dieses offen und erlaubt Befehlseingaben. Ein batch-Datei Fenster wird geschlossen. Der Parameter 0 übergibt die Anzahl an Parametern (hier 0), die zurück an den Befehlsinterpreter cmd.exe übergeben werden.
Zu den Lösungen 1-3:
Wie und wo verwende ich die oben genannten Codes in einem Programm?
Ich habe im Thread Batch If Abfrage wird übersprungen oder gibt immer else wieder. Variable ist trotz set undefined. ein Programm zum ermitteln
des Wochentags gemaess gregorianischem Kalender geschrieben.
Wenn du magst, kannst du auch an dem Skript die Verwendung erklären.
Lösung 5:
Die tee.exe muss ich ins system32 Verzeichnis kopieren und über die Konsole das oben genannte eingeben.
Das Pipen ist doch eine Umleitung. Gibt es eine Regel oder Empfehlung, wann man am besten eine Pipe
einsetzt?
Ich danke dir für deine Mühe, diesen Beitrag zusammenzustellen.
Würdest du meine Fragen ausführlicher beantworten?
Lösung 1:
@echo off
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1
for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y) >>%1 & echo.%%y
rem "findstr /n $" verhindert, dass hierbei Leerzeilen verloren gehen
)
Was ist ^(%%b^) 2^>^&1 bzw. (%%b) 2>&1 ? Antwort: Standardfehlerkanal (Kanal 2) dorthin umleiten, wohin auch die Standardausgabe (Kanal 1 ) umgeleitet ist.
Das $ soll auch Leerzeilen einschließen, aber wofür steht das $ Zeichen und in welchem Zusammenhang kommt es vor? Antwort: $ ist das Zeichen am Zeilenende, ^ am Zeilenanfang.
Lösung 2:
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1
Wie wird die Parameterzeile %%b definiert?
Lösung 3:
for /F "tokens=1*" %%a in ("%*") do (%%b) > %_FncTeeOut_TMP% 2>&1 &::ParZeile ohne %1 ausführen
Was bedeutet exit /b 0 ? Antwort: exit /b beendet einen batch im Konsolenfenster und lässt dieses offen und erlaubt Befehlseingaben. Ein batch-Datei Fenster wird geschlossen. Der Parameter 0 übergibt die Anzahl an Parametern (hier 0), die zurück an den Befehlsinterpreter cmd.exe übergeben werden.
Zu den Lösungen 1-3:
Wie und wo verwende ich die oben genannten Codes in einem Programm?
Ich habe im Thread Batch If Abfrage wird übersprungen oder gibt immer else wieder. Variable ist trotz set undefined. ein Programm zum ermitteln
des Wochentags gemaess gregorianischem Kalender geschrieben.
Wenn du magst, kannst du auch an dem Skript die Verwendung erklären.
Lösung 5:
MyBatch.cmd | tee.exe .\MyLogfile.txt
Das Pipen ist doch eine Umleitung. Gibt es eine Regel oder Empfehlung, wann man am besten eine Pipe
einsetzt?
Hallo Progfreund,
eine Menge Fragen, von denen Du die meisten durch Lesen dieses Threads, der Hilfe zum entsprechenden Befehl (z.B.
Ein paar Tipps:
Gruß
Friemler
[EDIT]
@all: User Progfreund hatte mich per PN gebeten, in diesem Thread auf seine Fragen einzugehen und hatte sich dabei auch schon für mein
[/EDIT]
eine Menge Fragen, von denen Du die meisten durch Lesen dieses Threads, der Hilfe zum entsprechenden Befehl (z.B.
FINDSTR /?
oder EXIT /?
), meines Tutorial zur FOR-Schleife (besonders das Kapitel über FOR /F
) oder durch googeln selbst beantworten kannst. Nebenbei muss natürlich experimentiert und Testscripte geschrieben werden, in denen man das, was man verstanden zu haben glaubt, anhand von Testszenarien überprüft. FOR /F
und seine Tokens versteht man nicht nur durch Lesen meines Tutorials.Ein paar Tipps:
%*
stellt alle Parameter eines Batchfiles/Unterprogramms dar, ist also quasi eine Aneinanderreihung in der Art von%1 %2 %3 ... %9
.- Manche Zeichen in Befehlen in der Klammer der
FOR
-Schleife müssen durch^
escaped werden. In meinem Tutorial findest Du eine entsprechende Tabelle. 2>&1
leitet den Fehlerkanal (Kanal 2) dorthin um, wohin die Standardausgabe (Kanal 1) umgeleitet wurde.- Durch Pipes kann die Ausgabe eines Programms statt auf den Bildschirm in die Standardeingabe (Kanal 0) eines anderen Programms umgeleitet werden. Die Regel ist: Wenn Du das brauchst, mach' es.
Gruß
Friemler
[EDIT]
@all: User Progfreund hatte mich per PN gebeten, in diesem Thread auf seine Fragen einzugehen und hatte sich dabei auch schon für mein
FOR
-Tutorial bedankt, also bereits einen Blick (aber mehr wohl nicht) hineingeworfen.[/EDIT]