[英]Write timestamp in logs (every line) and trigger a jar using a batch file
我有一個jar文件,可以使用該批處理文件觸發該文件,並希望將命令行窗口中顯示的所有內容與時間戳一起記錄下來。 我需要在日志中寫入的每一行中寫入時間戳。 像這樣:
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 ...
我有以下代碼:
@echo off
echo %date%,%time% - %~1 >>output.log
call :sub >>output.txt
echo %date%,%time% - %~1 >>output.log
exit /b
:sub
command1
command2
...
commandN
使用此功能,我只能記錄腳本的開始和結束時間。
編輯1:我希望腳本在屏幕上顯示執行以及寫入文件。
編輯2:現在,我有以下代碼,但它不隨執行一起寫入日志。 請告訴我要改進的地方。
@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
最簡便的方法是使用日志框架,例如logback,log4j等。但是您需要重構代碼。
在我提供一些建議之前,我想提一下,您應該將重定向放在命令的前面而不是后面,以避免出現空格或其他麻煩,並在所有路徑周圍加上引號,以避免出現白色麻煩。空格或特殊字符,例如:
>>"output.log" echo %date%,%time% - %~1
但是現在解決方案...
您可以利用命令回顯和保存日期/時間信息的自定義提示:
@echo off
>> "output.log" echo %date%,%time% - %~1
>> "output.log" call :sub
>> "output.log" echo %date%,%time% - %~1
exit /b
:sub
prompt $D,$T$S-$S
echo on
command1
command2
...
commandN
@echo off
prompt
這樣您將獲得以下日志條目:
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 -
所有空行都是由命令回顯引起的。
請注意,日期/時間信息取決於當前的語言環境設置。
要擺脫命令回顯並僅接收帶有日期/時間前面的命令輸出,可以使用for /F
循環捕獲命令輸出,並在rem
命令中強制使用日期/時間提示前綴。 但是您不能像call :sub
then那樣call :sub
子例程,因為for /F
中的命令是在另一個不在批處理文件上下文中運行的cmd
實例中執行的。 同樣,該cmd
實例中的任何環境更改都不會反映在運行該批處理文件的實例中。此外,完成后,您將收到整個:sub
節的日志字符串一次,而不是在每個命令之后均收到該字符串。
如果這對您來說都沒有問題,則可能需要使用以下代碼:
@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
call :sub
命令將替換為有條件的goto :sub
命令。 當for /F
調用批處理文件時,將傳遞Recursive
參數; 如果識別出此字符串,則在:sub
部分繼續執行。
日志條目將如下所示:
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 -
要擺脫空行,請替換命令行...:
>> "output.log" (echo on & for /F delims^=^ eol^= %%# in ('"%~f0" Recursive') do rem/ %%#)
...由這個...
>> "output.log" (for /F delims^=^ eol^= %%$ in ('^(for /F delims^^^=^^^ eol^^^= %%# in ^('"%~f0" Recursive'^) do rem/ %%#^)') do echo %%$)
...然后在此之后立即刪除第二行@echo off
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.