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
.
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
erhalten Ich nehme an, du meinst "call: sub >> output.log" (du hast 'output.txt' geschrieben), nicht wahr? – aschipfl