关于原始批处理文件有两件事情发生。但从长远来看,两者都无济于事。
无论您采用何种基准测试方法,请务必捕获操作前的开始时间和操作后的结束时间。你的样本没有这样做。
%time%计算结果类似于“12:34:56.78”,并且该SET /A命令不能减去这些。您需要一个生成简单标量时间戳的命令。
我本来想说它做不到,但是批处理语言比它所认为的要强大得多,所以这里是一个简单的 TIMER.BAT 实现。为了记录,Pax 在我摆弄时击败了我一个显示弦分裂的答案,并且 Johannes Rössel 建议将算术移到测量区域之外:
@echo off
setlocal
rem Remeber start time. Note that we don't look at the date, so this
rem calculation won't work right if the program run spans local midnight.
set t0=%time: =0%
rem do something here.... but probably with more care about quoting.
rem specifically, odd things will happen if any arguments contain
rem precent signs or carets and there may be no way to prevent it.
%*
rem Capture the end time before doing anything else
set t=%time: =0%
rem make t0 into a scaler in 100ths of a second, being careful not
rem to let SET/A misinterpret 08 and 09 as octal
set /a h=1%t0:~0,2%-100
set /a m=1%t0:~3,2%-100
set /a s=1%t0:~6,2%-100
set /a c=1%t0:~9,2%-100
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem make t into a scaler in 100ths of a second
set /a h=1%t:~0,2%-100
set /a m=1%t:~3,2%-100
set /a s=1%t:~6,2%-100
set /a c=1%t:~9,2%-100
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem runtime in 100ths is now just end - start
set /a runtime = %endtime% - %starttime%
set runtime = %s%.%c%
echo Started at %t0%
echo Ran for %runtime%0 ms
您可以通过不打扰第二部分的百分之一来简化算术并对其整体准确性更加诚实。假设你有一个 sleep 命令或其他一些浪费时间的命令,它就在这里起作用:
C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>
编辑:我按照评论中的建议修改了代码及其描述。
我认为,当 NT 团队将 COMMAND.COM 替换为 CMD.EXE 时,他们认为他们无法让它变得非常不同。但实际上,它几乎是一种全新的语言。如果启用了扩展,许多常用的常用命令都有新功能。
其中之一是SETLOCAL防止变量修改调用者的环境。另一个是SET /A给你大量的算术。我在这里使用的主要技巧是新的子字符串提取语法,这%t:~3,2%意味着在名为的变量的值中从偏移量 3 开始的两个字符t。
对于真正令人震惊的事情,请查看 set 的完整描述(尝试SET /?提示),如果这不会吓到您,请查看FOR /?并注意它可以解析文件中的文本......
编辑 2:修复了对 Frankie 在评论中包含08或09报告的时间字段的错误处理。调整了一些东西,并添加了一些评论。
请注意,这里有一个明显的疏忽,我可能不会修复。如果命令的开始日期与结束日期不同,它将不起作用。也就是说,它会做一些与一天中的时间相关的数学运算并报告差异,但差异并不意味着什么。
修复它以至少警告这种情况很容易。修复它以做正确的事情更难。
编辑 3:修复了 %h% 未正确设置单位数小时的错误。这是由于 %time% 返回“9:01:23.45”。注意空间。使用 %time: =0% 将空格替换为前导零,并且将正确设置 %h%。仅当脚本从一位数小时运行到下一小时时,才会发生此错误。