2016-06-28 5 views
1

Ich habe eine JAR-Datei, die ich mit dieser Batch-Datei trigge und alles, was im Befehlszeilenfenster angezeigt wird, zusammen mit dem Zeitstempel protokolliert. Ich muss den Zeitstempel in jeder Zeile schreiben, die in den Protokollen geschrieben wird. Wie folgt aus:Zeitstempel in Protokollen schreiben (jede Zeile) und einen Jar mit einer Batch-Datei auslösen

Tue 06/28/2016,15:42:22.24 - logssssss 
Tue 06/28/2016,15:42:22.24 - logssssss 
Tue 06/28/2016,15:42:22.24 - logssssss 
... 

Ich habe den folgenden Code:

@echo off 
echo %date%,%time% - %~1 >>output.log 
call :sub >>output.txt 
echo %date%,%time% - %~1 >>output.log 
exit /b 

:sub 
command1 
command2 
... 
commandN 

diese Verwendung bin ich nur in der Lage, die Start- und Endzeit des Skripts aufzeichnen.

Edit 1: Ich möchte das Skript die Ausführung auf dem Bildschirm zusammen mit dem Schreiben in einer Datei anzeigen.

Edit 2: Jetzt habe ich den folgenden Code, aber es schreibt nicht die Protokolle zusammen mit der Ausführung. Bitte sagen Sie mir, wo ich mich verbessern kann.

@echo off 
setlocal enabledelayedexpansion 

SET LogFile=D:\Logs\logfile.out 
SET Logg=^> tmp.out^&^& type tmp.out^&^&type tmp.out^>^>%LogFile% 

if /I "%~1"=="Recursive" java Test 
prompt $D,$T$S-$S 
>> %Logg% echo !date!,!time! - %~1 
>> %Logg% (for /F delims^=^ eol^= %%$ in ('^(for /F delims^^^=^^^ eol^^^= %%# in ^('"%~f0" Recursive'^) do rem/ %%#^)') do echo %%$) 

>> %Logg% echo !date!,!time! - %~1 
prompt 
exit /b 
+0

Vielleicht ist dies eine Option: Verwenden Sie '@echo off' nicht, sondern schreiben Sie stattdessen' @prompt $ D, $ T- ', so dass Sie Befehlsechos mit vorangestellten Datum/Uhrzeit-Zeichenfolgenaufforderungen ... – aschipfl

+0

erhalten Ich nehme an, du meinst "call: sub >> output.log" (du hast 'output.txt' geschrieben), nicht wahr? – aschipfl

Antwort

1

Die eaiest Art und Weise ist ein Logging-Framework wie logback zu verwenden, log4j usw. Aber Sie werden Ihren Code benötigen Refactoring.

+0

Vielen Dank @ Marco-a-Hernandez für Ihre Antwort. Ich habe versucht, log4j, aber es ** verlangsamt ** die ** Ausführung **. –

+0

Schreiben Sie das Protokoll in eine Datei oder schreiben Sie massiven Text? Wenn Sie den ConsoleAppender verwenden, sollte die Leistung der Verwendung von System.output ähnlich sein. –

+0

Ich führe tatsächlich mehrere Automatisierungsskripts aus, die in einem ausführbaren Jar komprimiert sind, die für einen längeren Zeitraum ausgeführt werden. Daher brauche ich einen effizienten Weg, um alle Protokolle zu schreiben. Deshalb habe ich entschieden, eine Batch-Datei zu verwenden. –

1

Bevor ich einige Vorschläge mache, möchte ich erwähnen, dass Sie die Umleitung vor den Befehl statt hinter setzen sollten, um nachgestellte Leerzeichen oder andere Probleme zu vermeiden, und Anführungszeichen um irgendwelche Pfade setzen, um zu vermeiden Probleme mit weiß-Leerzeichen oder Sonderzeichen, wie folgt aus:

>>"output.log" echo %date%,%time% - %~1 

Aber jetzt für die Lösungen ...

Sie könnten die Verwendung von Befehls echos und eine benutzerdefinierte Prompt Halte Datum/Uhrzeit machen:

So erhalten Sie die folgende Protokolleintrag erhalten:

28-Jun-2016,16:33:31.16 - 

28-Jun-2016,16:33:31.16 - command1 
logssssss <output of command1> 

28-Jun-2016,16:33:31.82 - command2 
logssssss <output of command2> 

28-Jun-2016,16:33:32.28 - ... 
logssssss <output of ...> 

28-Jun-2016,16:33:36.07 - commandN 
logssssss <output of commandN> 
28-Jun-2016,16:33:36.07 - 

Alle leeren Zeilen werden durch den Befehl verursacht Echo.
Beachten Sie, dass die Datums-/Uhrzeitinformationen von den aktuellen Gebietsschemaeinstellungen abhängen.

Um die Beseitigung der Befehl Echos zu erhalten und nur die Befehlsausgänge mit Datum/Zeit voraus erhalten Sie eine for /F Schleife verwenden, könnten die Befehlsausgänge und Kraft, um das Datum/Uhrzeit prompt Präfix mit dem rem Befehl zu erfassen. Aber können Sie eine Unterroutine wie call :sub dann nicht aufrufen, weil Befehle innerhalb for /F in einer anderen cmd Instanz ausgeführt werden, die nicht in einem Stapeldateikontext ausgeführt wird; Änderungen in der Umgebung innerhalb dieser cmd Instanz werden nicht in der Instanz angezeigt, in der diese Batchdatei ausgeführt wird. Darüber hinaus erhalten Sie die Protokollzeichenfolge des gesamten Abschnitts :sub einmal nach dem Beenden, anstatt sie nach jedem Befehl zu empfangen.
Wenn all dies kein Problem für Sie ist, könnten Sie den folgenden Code verwenden möchten:

@echo off 
if /I "%~1"=="Recursive" goto :sub 
prompt $D,$T$S-$S 
>> "output.log" echo %date%,%time% - %~1 
>> "output.log" (echo on & for /F delims^=^ eol^= %%# in ('"%~f0" Recursive') do rem/ %%#) 
@echo off 
>> "output.log" echo %date%,%time% - %~1 
prompt 
exit /b 

:sub 
command1 
command2 
... 
commandN 

Der call :sub Befehl durch einen bedingten goto :sub Befehl ersetzt wird.Wenn die Stapeldatei von for /F aufgerufen wird, wird ein Argument Recursive geliefert; Wenn diese Zeichenfolge erkannt wird, wird die Ausführung im Bereich :sub fortgesetzt.

Der Protokolleintrag wird wie folgt aussehen:

28-Jun-2016,16:33:31.16 - 

28-Jun-2016,16:33:31.16 - rem/ logssssss <output of command1> 

28-Jun-2016,16:33:31.82 - rem/ logssssss <output of command2> 

28-Jun-2016,16:33:32.28 - rem/ logssssss <output of ...> 

28-Jun-2016,16:33:36.07 - rem/ logssssss <output of commandN> 
28-Jun-2016,16:33:36.07 - 

Um die leeren Zeilen loszuwerden, die Befehlszeile ersetzen ...:

>> "output.log" (echo on & for /F delims^=^ eol^= %%# in ('"%~f0" Recursive') do rem/ %%#) 

... von diesem einen ...:

>> "output.log" (for /F delims^=^ eol^= %%$ in ('^(for /F delims^^^=^^^ eol^^^= %%# in ^('"%~f0" Recursive'^) do rem/ %%#^)') do echo %%$) 

... und entfernen Sie unmittelbar danach die zweite Zeile @echo off.

+0

wenn Sie dazu synchron sein müssen, benötigen Sie ein spezielles Programm. Suche nach 'tee' oder' tee for windows'. Wenn asynchron ist ok, schreiben in Datei, gefolgt von 'type file' [hier] (http://StackOverflow.com/a/15553922/2152082) ist eine mögliche Implementierung. – Stephan

+0

Hey @aschipfl danke dir für deine Antwort aber ich muss die Logs zusammen mit der Ausführung schreiben. Wie das Glas ausgelöst wird, läuft für Stunden. Kannst du mir helfen mit einer Arbeit um –

+0

Der erste Ansatz (ohne 'für') sollte es tun ... – aschipfl