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

Batch file 为bat文件中给定列表中的每个值回显输出,batch-file,cmd,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

使用下面的代码,我很难打印给定列表中每个值的计算结果。目前,它打印两个用户的总组合时间,我想回显每个用户的单独时间,这列在代码的第二行\ 任何帮助都将不胜感激

@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
第二个用户名为
shukladff
的示例文件:

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
%U%
更改为
%U

将%%U:%TotalDur%%的回波总持续时间更改为
调用%%U:%%TotalDur%%的Echo TotalDuration
将扩展延迟到执行时间,而不是
解析时间

添加了缺少的双引号,最后第二行结束

在脚本顶部添加了
Setlocal
,可能是第二次运行 无法设置同一CMD会话中脚本的 使用值预测变量

添加标签
:打印
,以回显输出以避免

使用延迟扩展。

感谢您提供当前和所需的输出。您是否也可以提供输入的小样本?请查找更新的样本数据。您使用的是%U%而不是%%U。请添加Squashman提到的修复。%%U:%%TotalDur%%的行
Echo TotalDuration
可以更改为
调用%%U:%%TotalDur%%的Echo TotalDuration,以将扩展延迟到执行时间。您的示例输出舒克拉的总持续时间:2:00:00
。样本没有重现问题。当前
7:15:00
到所需的
2:00:00
未知如何从样本中获得该结果。@michael_heath,在使用Squashman和您提到的修复程序进行更改后,工作正常,您可以将此作为答案发布。非常感谢。我观察到,虽然文件名没有定义
用户
名称,但它仍然会打印来自上一个结果的值。
a3rgcw
被找到并使用值处理它。如果未找到
shukla
,则它会回显来自
a3rgcw
的结果。通过在每个循环开始时取消定义
TotalDur
修复。只需2个小更改(抱歉再次打扰)。1.我希望
%TotalDur%
右对齐,因为
用户名
长度会变化。2.我还想在此处打印文件名:
::Echo Session()从%Start\u HMS%到
。修改了一些代码以处理您的请求。1. <代码>UsrName
修剪为10个字符以进行对齐。如果长度不正确,请调整数字和空格。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