Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch - mit und ohne tee - Konsoleausgaben zugleich in eine Datei leiten und auf dem Bildschirm ausgeben

Anleitung Entwicklung Batch & Shell

Mitglied: NeonZero

NeonZero (Level 1) - Jetzt verbinden

15.09.2008, aktualisiert 16:01 Uhr, 29465 Aufrufe, 4 Kommentare

01.
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.
Der Beitrag, inkl. Quelltext, ist Gemeinfrei (er darf ohne jegliche Einschränkung genutzt werden).

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:
01.
@echo off 
02.
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1 
03.
  for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y) >>%1 & echo.%%y 
04.
  rem "findstr /n $" verhindert, dass hierbei Leerzeilen verloren gehen 
05.
)
Aufruf:
01.
TeeMyBatch.cmd .\MyLogfile.txt  MyBatch.cmd <Parameter1> <Parameter2> ...
Die Ausgabe von MyBatch.cmd erfolgt nun auf dem Monitor und wird zeitgleich ins Logfile geschrieben. Das funktioniert aber nur mit Batches bzw. Konsoleprogramme zusammen, die keine Eingaben erwarten. Zudem erfolgt die Ausgabe erst nachdem MyBatch.cmd fertig ist.

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:
01.
@echo off & setlocal 
02.
call :FncTeeOut .\MyLogfile.txt  echo Test 1 
03.
call :FncTeeOut .\MyLogfile.txt  net use x: \\server\freigabe /User:x abc 
04.
call :FncTeeOut .\MyLogfile.txt  echo Test 2 
05.
 
06.
goto :EOF 
07.
 
08.
:FncTeeOut      ::Version 1.0.1 
09.
::Parameters:   <LogFileName> <Command with parameters ...> 
10.
::Example:      call :FncTeeOut .\MyLogFile.txt echo It is a test.   (print on screen and to logfile) 
11.
  for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1 
12.
    for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y) >>%1 & echo.%%y 
13.
14.
 exit /b 0
Dieser Ansatz hat den Vorteil, dass er ohne eine zweite Batch auskommt und auch dann noch funktioniert, wenn die Batch eine Eingabe erwartet.

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.
01.
@echo off & setlocal 
02.
call :FncTeeOut2 .\MyLogfile.txt  echo Test 1 
03.
call :FncTeeOut2 .\MyLogfile.txt  net use x: \\server\freigabe /User:x abc 
04.
call :FncTeeOut2 .\MyLogfile.txt  echo Test 2 
05.
 
06.
goto :EOF 
07.
 
08.
:FncTeeOut2     ::Version 1.0.0 
09.
::Parameters:   <LogFileName> <Command with parameters ...> 
10.
::Example:      call :FncTeeOut .\MyLogFile.txt echo It is a test. 
11.
  setlocal & set _FncTeeOut_TMP=%TMP%\%~n0_tee%RANDOM%.tmp 
12.
  for /F "tokens=1*" %%a in ("%*") do (%%b) > %_FncTeeOut_TMP%  2>&1 &::ParZeile ohne %1 ausführen 
13.
  type %_FncTeeOut_TMP% &::Ausgabe der vorherigen Befehlszeile auf dem Bildschirm anzeigen... 
14.
  type %_FncTeeOut_TMP% >> %1 &::... und ins Logfile schreiben 
15.
  del %_FncTeeOut_TMP% & endlocal 
16.
 exit /b 0
Lösung 4: Im Folgenden werden weitere Lösungsansätze von Benutzer Biber aus diesem Thread zusammengetragen:
01.
rem Ausgaben innerhalb der Batch zweimal erzeugen und die zweite Ausgabe ins Log schreiben: 
02.
echo xyz 
03.
echo xyz >>.\MyLogfile.txt 
04.
 
05.
rem Oder nur im Fehlerfall den Befehl nochmals ausführen und Ausgabe ins Log schreiben: 
06.
net use x: \\server\freigabe  
07.
if Errorlevel 1 net use x: \\server\freigabe >>.\MyLogfile.txt 
08.
 
09.
rem Alternativ dazu 
10.
net use x: \\server\freigabe 2>NUL 
11.
if Errorlevel 1 ( 
12.
  echo Laufwerk X: konnte nicht verbunden werden! 
13.
  echo Laufwerk X: konnte nicht verbunden werden! >>.\MyLogfile.txt 
14.
)
Lösung 5: Unter UNIX gibt es einen Filter namens tee, der von einigen Open-Source-Projekten auch nach Windows portiert wurde (tee.exe, mTee.exe, wTee.exe; findet man beim googeln). Der Filter lässt sich wie folgt verwenden:
01.
MyBatch.cmd | tee.exe .\MyLogfile.txt
Das ist die technisch ausgereifte und optisch eleganteste Lösung, läuft aber nur dort, wo tee.exe gefunden wird. Auf Deinem Rechner sicherlich (dort wurde tee.exe ja von Dir eingespielt), aber eben nicht mehr auf jedem beliebigen Computer.
Mitglied: miniversum
15.09.2008 um 12:33 Uhr
Es gäbe noch diese Alternative:
01.
Befehl>"%temp%"\tmp.txt 2>&1 
02.
type "%temp%"\tmp.txt 
03.
type "%temp%"\tmp.txt>logfile.txt
z.B.
01.
dir:>"%temp%"\tmp.txt 2>&1 
02.
type "%temp%"\tmp.txt 
03.
type "%temp%"\tmp.txt>logfile.txt
Bitte warten ..
Mitglied: NeonZero
15.09.2008 um 16:01 Uhr
Hallo miniversum. Deine Idee gefällt mir. Soeben wurde sie oben für eine entsprechende Funktion adoptiert (und natürlich mit einem Hinweis auf Deinen Beitrag versehen).

Bye, nz
Bitte warten ..
Mitglied: Progfreund
31.05.2011 um 19:22 Uhr
Hallo, NeonZero.

Ich danke dir für deine Mühe, diesen Beitrag zusammenzustellen.

Würdest du meine Fragen ausführlicher beantworten?


Lösung 1:
01.
@echo off 
02.
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1 
03.
  for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y) >>%1 & echo.%%y 
04.
  rem "findstr /n $" verhindert, dass hierbei Leerzeilen verloren gehen 
05.
)
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:
01.
for /F "tokens=1*" %%a in ("%*") do ( ::%%b=Parameterzeile abzüglich %1
Was bedeutet in ("%*"), sind das die Umgebungsvariablen, z.B. %0=Laufwerk\Pfad\Name.Erweiterung?
Wie wird die Parameterzeile %%b definiert?

Lösung 3:
01.
for /F "tokens=1*" %%a in ("%*") do (%%b) > %_FncTeeOut_TMP%  2>&1 &::ParZeile ohne %1 ausführen
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:
01.
MyBatch.cmd | tee.exe .\MyLogfile.txt
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?
Bitte warten ..
Mitglied: Friemler
31.05.2011 um 20:35 Uhr
Hallo Progfreund,

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]
Bitte warten ..
Ähnliche Inhalte
Webbrowser
Amazon Prime und zwei Bildschirme
Erfahrungsbericht von agowa338Webbrowser8 Kommentare

Hallo, Ich währe gerade fast vom Stuhl gefallen, ich wollte eigentlich nur einen Film von Amazon Prime ansehen. Dann ...

Windows 10
Windows 10 - Mit Batch Datei Privacy Settings anpassen
Tipp von MarcoG88Windows 104 Kommentare

Hallo, ich habe eine Batch veröffentlicht mit der die WIndows 10 Enterprise Datenschutzeinstellungen einfach deaktiviert werden können. Die batch ...

Windows XP
Bildschirm Display Ausgabe in Graustufen (schwarz-weiß)
Tipp von TrecasimWindows XP7 Kommentare

Da ich heute selbst auf der Suche nach einer Lösung war, die Bildschirmausgabe auf Graustufen umzustellen und mich dabei ...

Windows 7
Zeit beim starten des PCs abgleichen, synchronisieren ohne Script bzw Batch Datei
Anleitung von maddocWindows 710 Kommentare

Hi Leute. Ist zwar nur ein kleineres Übel aber die Lösung hat Zeit und nerven gekostet was ich euch ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 6 StundenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 11 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 11 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 23 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...

Windows Server
Remotesteuerung der Sitzung (Kennung XX) fehlgeschlagen
gelöst Frage von Stefan91Windows Server14 Kommentare

Hallo Zusammen, seit kurzem bekomme ich oben genannte Fehlermeldung, wenn ich versuche eine Remotesitzung über den Taskmanager fernzusteuern (Rechtsklick ...