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