Batch file 查找在批处理文件中循环的总会话时间

Batch file 查找在批处理文件中循环的总会话时间,batch-file,command-line,command-line-interface,Batch File,Command Line,Command Line Interface,我在bat文件中使用了以下命令,它给出了系统日志文件的第一个开始时间,然后第二个命令给出了会话的结束时间 命令: @FOR /F "tokens=12" %%a in ('findstr /c:"Syslog created by " H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a @FOR /F "tokens=7" %%a in ('findstr /c:"Session closed @@@" H:\Newfolder\*test*.sys

我在bat文件中使用了以下命令,它给出了系统日志文件的第一个开始时间,然后第二个命令给出了会话的结束时间

命令:

@FOR /F "tokens=12" %%a in ('findstr /c:"Syslog created by " 
H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a
@FOR /F "tokens=7" %%a in ('findstr /c:"Session closed @@@" 
H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a
H:\Newfolder>main.bat
H:\Newfolder>SET OUTPUT=10:30:30
H:\Newfolder>SET OUTPUT=20:50:25
H:\Newfolder>SET OUTPUT=20:50:45
H:\Newfolder>SET OUTPUT=20:55:25
Syslog created by shuklak sklkkk wedwd on Thursday, 9 August 2018, 20:47:25 on India Standard Time
...Some stuff here..
Session closed @@@ 9 August 2018, 20:50:45 on India Standard Time
输出:

@FOR /F "tokens=12" %%a in ('findstr /c:"Syslog created by " 
H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a
@FOR /F "tokens=7" %%a in ('findstr /c:"Session closed @@@" 
H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a
H:\Newfolder>main.bat
H:\Newfolder>SET OUTPUT=10:30:30
H:\Newfolder>SET OUTPUT=20:50:25
H:\Newfolder>SET OUTPUT=20:50:45
H:\Newfolder>SET OUTPUT=20:55:25
Syslog created by shuklak sklkkk wedwd on Thursday, 9 August 2018, 20:47:25 on India Standard Time
...Some stuff here..
Session closed @@@ 9 August 2018, 20:50:45 on India Standard Time
最后,我对会议的总时间感兴趣

e、 g.总系统日志运行时间为:12:24:55

我知道,但不知道如何利用它

示例日志文件:

@FOR /F "tokens=12" %%a in ('findstr /c:"Syslog created by " 
H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a
@FOR /F "tokens=7" %%a in ('findstr /c:"Session closed @@@" 
H:\Newfolder\*test*.syslog') do SET OUTPUT=%%a
H:\Newfolder>main.bat
H:\Newfolder>SET OUTPUT=10:30:30
H:\Newfolder>SET OUTPUT=20:50:25
H:\Newfolder>SET OUTPUT=20:50:45
H:\Newfolder>SET OUTPUT=20:55:25
Syslog created by shuklak sklkkk wedwd on Thursday, 9 August 2018, 20:47:25 on India Standard Time
...Some stuff here..
Session closed @@@ 9 August 2018, 20:50:45 on India Standard Time

没有看到原始的日志行,我只能依赖于您的代码

  • 在我看来,您应该使用正则表达式过滤这两种行类型,以使它们按时间顺序排列
  • 您提供的链接显示了如何计算一天中的时差
  • 第一个用于分析findstring输出的命令选择行
  • echo findstr区分启动和停止时间
  • 子例程
    :TimeToSecs
    将HH:mm:ss拆分为若干部分,并计算一天中的秒数,存储开始、停止时间、秒数,还计算差值和总数
编辑一个Secs2HMS子例程

:: Q:\Test\2018\08\09\SO_51773307.cmd
@Echo off
PushD "H:\Newfolder\" ||(Echo couldn't find dir & Pause & Exit /B 1)

Set "TotalSecs=0"
For %%F in ("*test*.syslog") Do For /F "delims=" %%A in ('
    findstr /I "Syslog.created.by Session.closed.@@@" "%%F"
') Do (
    Set "Flag="
    Echo=%%A|findstr /I "Syslog.created.by" 2>&1>Nul && Set "Flag=Start"
    if defined Flag (
        FOR /F "tokens=11" %%T in ("%%A") Do Call :TimeToSecs Start "%%T"
    ) Else (
        FOR /F "tokens=7" %%T in ("%%A") Do Call :TimeToSecs Stop "%%T"
    )
)
Echo:
PopD
Goto :Eof

:TimeToSecs
Set "%1_HMS=%~2"
Echo:%~2|Findstr "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]" 2>&1>Nul || (Echo wrong format %2&Goto :Eof)
For /F "tokens=1-3 delims=:" %%H in ("%~2"
) Do Set /A "%1=(1%%H-100)*60*60+(1%%I-100)*60+(1%%J-100)"
If %1 neq Stop Goto :Eof
Set /A "Diff=Stop-Start,TotalSecs+=Diff"
Call :Secs2HMS Dur %Diff%
Call :Secs2HMS TotalDur %TotalSecs%
Echo Session from %Start_HMS% to %Stop_HMS% Duration %Dur% TotalDuration %TotalDur%
Goto :Eof

:Secs2HMS var value
setlocal
set /a "HH=%2/3600,mm=(%2-HH*3600)/60+100,ss=%2 %% 60+100"
Set "HHmmss=    %HH%:%mm:~-2%:%ss:~-2%"
endlocal&set "%1=%HHmmss:~-10%
Goto :Eof
样本输出:

> Q:\Test\2018\08\09\SO_51773307.cmd
Session from 08:47:25 to 20:50:45 Duration   12:03:20 TotalDuration   12:03:20
Session from 10:30:30 to 20:50:25 Duration   10:19:55 TotalDuration   22:23:15
Session from 20:50:45 to 20:55:25 Duration    0:04:40 TotalDuration   22:27:55
Session from 10:30:30 to 20:50:25 Duration   10:19:55 TotalDuration   32:47:50
Session from 20:50:45 to 20:55:25 Duration    0:04:40 TotalDuration   32:52:30

欢迎作为新用户使用SO。请带上这本书,同时阅读。这不是一个免费的脚本编写服务。这加起来是12小时24分55秒?要使用
TDIFF
批处理文件,可以使用现有批处理文件中的
CALL
命令。它在帮助中向您展示了如何使用它<代码>tdiff.cmd开始时间停止时间。因此,您可以使用:
CALL tdiff.cmd 10:30:30 20:50:25
@Squashman 1st syslog time=seision的第一个结尾(20:50:45)-seision的第一个开始(10:30:30)。类似于第二个系统日志,然后我计算了它。前两个输出值表示会话的开始,而其他两个输出值表示会话的结束。@实验者,这不是您的输出示例所显示的。@Squashman,第一个命令表示会话的开始时间,第二个命令表示会话的结束时间。是的,我提到的链接中的代码可能对我没有用处。请查找有问题的示例日志文件文本。我确实很难处理批处理,因为在使用通配符findstr时,第一个在输出中包含文件名,第二个在shuklak Sklkk wedwd于2018年8月9日星期四创建的
系统日志中,您没有正确计算,20:47:25
这是第11个标记,而不是第12个。查看更改的批次和额外的有效性检查一段时间。太好了!如何获得HMS格式的总时间,如示例中所示。还有,我怎样才能使最后两列整齐地(也许是正确的)对齐。确认有用答案的通常方法是投票赞成和/或接受答案。我将编辑答案,通常使用set/a将Totalsecs除以3600和60,并使用子字符串对齐!实际上,我曾尝试调整并转换为HMS,但没有成功。谢谢你按预期工作。。。