bat文件中给定列表中每个值的回显输出

时间:2018-10-08 17:04:14

标签: batch-file cmd

使用下面的代码,我努力为给定列表中的每个值打印计算结果。目前,它会打印出两个用户的总时间,我想在此代码第二行中列出每个用户的个人时间。\ 任何帮助将不胜感激。

@Echo off
For %%U in (a3rgcw shukla) Do (

PushD "H:\Syslogs\" ||(Echo couldn't find dir & Pause & Exit /B 1)

Set "TotalSecs=0"

For %%F in ("*%U%*.txt") Do For /F "delims=" %%A in ('
    findstr /I "system.log.created End.of.session" "%%F"
') Do (
    Set "Flag="
    Echo=%%A|findstr /I "system.log.created" 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=8" %%T in ("%%A") Do Call :TimeToSecs Stop "%%T"
    )
)
Echo TotalDuration for %%U:%TotalDur%
)
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

当前输出:

TotalDuration for a3rgcw:   7:15:00
TotalDuration for shukla:   7:15:00

所需的输出:

TotalDuration for a3rgcw:   5:15:00
TotalDuration for shukla:   2:00:00

第二个用户名为shukladfdf的示例文件:

sdsdf system log created on  ghg Thursday, 9 August 2018, 20:30:45 on India 
Standard Time
dfg
drdwewed
end of session as 9 August 2018, 22:30:45 on India Standard Time

1 个答案:

答案 0 :(得分:2)

@Echo off
Setlocal

PushD "H:\Syslogs\" ||(Echo couldn't find dir & Pause & Exit /B 1)

For %%U in (a3rgcw shukla) Do (

    Set "TotalDur="
    Set "TotalSecs=0"

    For %%F in ("*%%U*.txt") Do For /F "delims=" %%A in ('
        findstr /I "system.log.created End.of.session" "%%F"
    ') Do (
        Set "FileName=%%F"
        Set "Flag="
        Echo=%%A|findstr /I "system.log.created" 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=8" %%T in ("%%A") Do Call :TimeToSecs Stop "%%T"
        )
    )

    Set "UsrName=%%U:          "
    Call :Print UsrName
)
Echo:
PopD
Goto :Eof

:Print
If /i "%~1" == "UsrName" (
    Echo TotalDuration for %UsrName:~,10% %TotalDur%
) else If /i "%~1" == "FileName" (
    Echo Session (%FileName%^) from %Start_HMS% to %Stop_HMS% Duration:%Dur%      TotalDuration:%TotalDur%
)
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%
Call :Print FileName
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

%U%更改为%%U

Echo TotalDuration for %%U:%TotalDur%更改为 Call Echo TotalDuration for %%U:%%TotalDur%%其中 将扩展延迟到执行时间,而不是 解析时间。

添加了缺少的双引号,最后第二行关闭。

在脚本顶部添加了Setlocal作为第二次运行 同一CMD会话中脚本的设置 带有值的预设变量。

添加了标签:Print以回显输出以避免 使用延迟扩展。