标题: [数值计算] 求助计算花费时间的批处理为什么变量一直显示为0? [打印本页]
作者: LTSC1809 时间: 2023-4-23 20:04 标题: 求助计算花费时间的批处理为什么变量一直显示为0?
我做了一个基准测试批处理,测试bat文件解释器的性能,但是最后输出花费的时间,总是输出0,代码如下:- @echo off
- title 基准测试
- color 0a
- set /p number=Type_RunNumber:
- set t1=%time%
- set a=0
- :run
- set /a a=a+1
- if %a% gtr %number%=goto end_run
- goto run
- :end_run
- set t2=%time%
- set /a t3=t2-t1
- title 加法%a%次
- echo Run_Number:%number% Run_Time:%t3%
- pause
复制代码
最后那个echo中有一个变量:%t3%,这个变量的值理论上应该就是运行花费的时间,这个值是怎么求出来的可以在代码里往前找一找,前面的%time%不是我自己定义的变量,在批处理中它的值就是当前的时间,现在的问题是,显示的运行时间永远是0,哪怕肉眼观察的运行时间有好几秒,求助
作者: idwma 时间: 2023-4-23 21:22
变量%time%不是纯数字呀
作者: LTSC1809 时间: 2023-4-23 21:31
回复 2# idwma
我一开始就是这么弄得,还正常显示时间,但是刚刚就加了个标题和颜色,就这样了,我也很疑惑啊,那部分我什么也没动啊
作者: idwma 时间: 2023-4-23 21:41
那就不太清楚了,变量里有非数字确实是会变0的
作者: LTSC1809 时间: 2023-4-23 21:44
今天评分超限了,技术分先欠着
作者: Batcher 时间: 2023-4-23 22:36
回复 1# LTSC1809
系统变量%time%的值是 22:34:43.41 这种格式,里面有冒号和点。
你这样 set /a t3=t2-t1 直接做减法是错误的用法。
参考:批处理函数库里面有计算日期、星期、时间等实例
http://bbs.bathome.net/thread-3056-1-1.html
作者: LTSC1809 时间: 2023-4-23 22:37
回复 2# idwma
也就是说t1和t2被赋值了%time%的值,不能在set /a里面运算了是吗,那么,怎么得到程序运行时间呢?如有思路望解答,谢谢
作者: LTSC1809 时间: 2023-4-23 22:44
本帖最后由 LTSC1809 于 2023-4-23 22:48 编辑
回复 6# Batcher
自学的批处理,才疏学浅,这几篇文章有很多看不懂,不过我好像有思路了,用for /f中的token,可以提取指定节的字符串,把每一节分开提取出来然后用for逐个做减法就好?我和vbs搞混了,vbs中有一个timer()函数,他和批处理的%time%功能一样,结果却可以直接运算,最近也做了个vbs的性能测试程序,用到了这一点,被误导了
作者: Batcher 时间: 2023-4-24 08:10
回复 8# LTSC1809
可以,做好时分秒的转换就行了。
另外就是,注意跨天的情况,比如晚上11点59分执行到凌晨0点之后。
批处理计算时间差获取代码运行时间(兼容跨天)
http://bbs.bathome.net/thread-4701-1-1.html
批处理计算时间差
http://bbs.bathome.net/thread-3372-1-1.html
批处理调用PowerShell统计脚本执行时间
https://mp.weixin.qq.com/s/bgjZ0Gj3ZMkQn-EW0v2K0g
作者: LTSC1809 时间: 2023-4-24 11:37
回复 9# Batcher
谢了,跨天大概不用考虑,毕竟我应该也不会半夜运行
作者: LTSC1809 时间: 2023-4-24 19:15
本帖最后由 LTSC1809 于 2023-4-24 19:20 编辑
求助,现在用我说的for提取出来每一个节,但是for /f语句只能处理文件怎么办,我唯一能想到的办法就是先生成两个临时文件分别存储变量t1和t2,做完for语句以后再删除,但是有没有不用生成临时文件的方法,现在的代码如下,运行时提示找不到文件,所以我才说要生成临时文件。现在的代码如下:- @echo off
- title 基准测试
- color 0a
- set /p number=Type_RunNumber:
- set t1=%time%
- set a=0
- :run
- set /a a=a+1
- if %a% gtr %number%=goto end_run
- goto run
- :end_run
- set t2=%time%
- for /f "delims=:.tokens=1" %%i in (%t1%) do set t1h=%%i
- for /f "delims=:.tokens=2" %%i in (%t1%) do set t1m=%%i
- for /f "delims=:.tokens=3" %%i in (%t1%) do set t1s=%%i
- for /f "delims=:.tokens=4" %%i in (%t1%) do set t1ms=%%i
- for /f "delims=:.tokens=1" %%i in (%t2%) do set t1h=%%i
- for /f "delims=:.tokens=2" %%i in (%t2%) do set t1m=%%i
- for /f "delims=:.tokens=3" %%i in (%t2%) do set t1s=%%i
- for /f "delims=:.tokens=4" %%i in (%t2%) do set t1ms=%%i
- set /a t3h=t2h-t1h
- set /a t3m=t2m-t1m
- set /a t3s=t2s-t1s
- set /a t3ms=t2ms-t1ms
- title 加法%a%次
- echo Run_Number:%number% Run_Time:%t3h%:%t3m%:%t3s%.%t3ms%
- pause
复制代码
作者: LTSC1809 时间: 2023-4-24 19:31
还有,这是我生成临时文件的方法来处理的,这次能输出运行时间了,但是时间给我显示-9:-19:-19.-19什么鬼啊,代码如下:- @echo off
- title 基准测试
- color 0a
- set /p number=Type_RunNumber:
- set t1=%time%
- set a=0
- :run
- set /a a=a+1
- if %a% gtr %number%=goto end_run
- goto run
- :end_run
- set t2=%time%
- echo %t1%>t1.txt
- echo %t2%>t2.txt
- for /f "delims=:.tokens=1" %%i in (t1.txt) do set t1h=%%i
- for /f "delims=:.tokens=2" %%i in (t1.txt) do set t1m=%%i
- for /f "delims=:.tokens=3" %%i in (t1.txt) do set t1s=%%i
- for /f "delims=:.tokens=4" %%i in (t1.txt) do set t1ms=%%i
- for /f "delims=:.tokens=1" %%i in (t2.txt) do set t1h=%%i
- for /f "delims=:.tokens=2" %%i in (t2.txt) do set t1m=%%i
- for /f "delims=:.tokens=3" %%i in (t2.txt) do set t1s=%%i
- for /f "delims=:.tokens=4" %%i in (t2.txt) do set t1ms=%%i
- del t1.txt
- del t2.txt
- set /a t3h=t2h-t1h
- set /a t3m=t2m-t1m
- set /a t3s=t2s-t1s
- set /a t3ms=t2ms-t1ms
- title 加法%a%次
- echo Run_Number:%number% Run_Time:%t3h%:%t3m%:%t3s%.%t3ms%
- pause
复制代码
作者: 77七 时间: 2023-4-24 19:32
http://www.bathome.net/redirect. ... 12081&pid=76757
直接用现成的吧...
作者: Batcher 时间: 2023-4-24 22:45
回复 11# LTSC1809
万里长征第一步:- @echo off
- set "t1=%time%"
- echo,%t1%
- for /f "tokens=1-4 delims=:." %%a in ("%t1%") do (
- set "Hh1=%%a"
- set "Mi1=%%b"
- set "Ss1=%%c"
- set "Cs1=%%d"
- )
- echo,%Hh1%
- echo,%Mi1%
- echo,%Ss1%
- echo,%Cs1%
- pause
复制代码
作者: Batcher 时间: 2023-4-24 22:49
回复 12# LTSC1809
19行到22行的变量名应该是t2?不是t1?
25行到28行这样直接做减法是不对的,因为没有考虑小学减法的借位。
作者: LTSC1809 时间: 2023-4-25 11:41
回复 15# Batcher 那不是变量,因为for /f只能处理文件,所以无奈生成了两个临时文件来存储变量供for /f使用,t1和t2是文件名,并没有错,不过借位这个确实没考虑到 ,输出的时间是负数是因为没有弄借位吗?那为什么第一个数字也就是小时 它已经没有可以借的了,为什么还是负数 要怎么做才能让它正常显示运行时间
作者: LTSC1809 时间: 2023-4-25 12:11
回复 15# Batcher那不是变量,因为for /f只能处理文件,无奈只好生成临时文件给for用,用完再删除,t1和t2都是文件名,而且也没弄错文件名,不过借位这一点我确实没考虑到,但是我也没什么思路实现借位,能提供一下借位的方法吗?谢谢
作者: LTSC1809 时间: 2023-4-25 17:11
回复 14# Batcher
echo后面的逗号是什么意思,有什么用?
作者: jyswjjgdwtdtj 时间: 2023-4-25 17:19
回复 18# LTSC1809
防止命令出错
echo输出echo的模式
echo,输出空行
echo,balabala输出balabala
作者: LTSC1809 时间: 2023-4-25 17:43
回复 19# jyswjjgdwtdtj 这样啊,之前一直都是echo然后空格输入内容,原来还可以加逗号,涨知识了
作者: Batcher 时间: 2023-4-25 22:22
回复 16# LTSC1809
我说的是19-22这里不对:
for /f "delims=:.tokens=1" %%i in (t2.txt) do set t1h=%%i
for /f "delims=:.tokens=2" %%i in (t2.txt) do set t1m=%%i
for /f "delims=:.tokens=3" %%i in (t2.txt) do set t1s=%%i
for /f "delims=:.tokens=4" %%i in (t2.txt) do set t1ms=%%i
作者: Batcher 时间: 2023-4-25 22:33
回复 17# LTSC1809
你看到哪个教程上面这么说的?
可以考虑换个教程,例如:
http://bbs.bathome.net/thread-31727-1-1.html
作者: LTSC1809 时间: 2023-4-25 22:45
回复 22# Batcher 给变量加个引号就好了对吗,还有把变量名改了就能解决显示时间是负数的问题?
作者: LTSC1809 时间: 2023-4-25 22:53
回复 22# Batcher 改好了,请参阅- @echo off
- title 基准测试
- color 0a
- set /p number=Type_RunNumber:
- set t1=%time%
- set a=0
- :run
- set /a a=a+1
- if %a% gtr %number%=goto end_run
- goto run
- :end_run
- set t2=%time%
- for /f "delims=:.tokens=1" %%i in ("%t1%") do set t1h=%%i
- for /f "delims=:.tokens=2" %%i in ("%t1%") do set t1m=%%i
- for /f "delims=:.tokens=3" %%i in ("%t1%") do set t1s=%%i
- for /f "delims=:.tokens=4" %%i in ("%t1%") do set t1ms=%%i
- for /f "delims=:.tokens=1" %%i in ("%t2%") do set t2h=%%i
- for /f "delims=:.tokens=2" %%i in ("%t2%") do set t2m=%%i
- for /f "delims=:.tokens=3" %%i in ("%t2%") do set t2s=%%i
- for /f "delims=:.tokens=4" %%i in ("%t2%") do set t2ms=%%i
- set /a t3h=t2h-t1h
- set /a t3m=t2m-t1m
- set /a t3s=t2s-t1s
- set /a t3ms=t2ms-t1ms
- title 加法%a%次
- echo Run_Number:%number% Run_Time:%t3h%:%t3m%:%t3s%.%t3ms%
- pause
复制代码
作者: LTSC1809 时间: 2023-4-25 22:54
自学的批处理果然还是不太好,今后望大家多多指教
作者: mzzyb 时间: 2023-4-26 17:38
本帖最后由 mzzyb 于 2023-4-26 17:40 编辑
你可以直接提取当前系统的时间配合if函数判断,运算一下,就可以了,
提取时 %time:~0,2%
提取分 %time:~3,2%
下面是个简单的例子,希望帮到你- set /p h=请输小时:
- set /p m=请输分钟:
- set /a nowh=%time:~0,2%
- set /a nowm=%time:~3,2%
- echo %nowh%
- echo %nowm%
- if %nowh% equ %h% (
- set /a "t=(%m%-%nowm%)*60"
- shutdown /s /t %t%
- ) else if %nowm% GTR %m% (
- set /a "t=(%h%-%nowh%-1)*3600+(60-%nowm%+%m%)*60"
- shutdown /s /t %t%
- ) else (set /a "t=(%h%-%nowh%)*3600+(%m%-%nowm%)*60"
- shutdown /s /t %t%
- )
复制代码
作者: LTSC1809 时间: 2023-4-26 17:41
回复 26# mzzyb 谢谢回复,但是time变量不是纯数字,有冒号点号,怎么运算啊
作者: mzzyb 时间: 2023-4-26 18:00
回复 27# LTSC1809
你试了那两个参数就知道,它是分别提取时,分为数字,可以用来计算的
作者: terse 时间: 2023-4-26 18:47
- @echo off
- for /f "tokens=1-3delims=:." %%i in ("%time%") do set /a t1=%%i*3600+ (10%%j)%%100*60+10%%k%%100
- for /l %%i in (1,1,30000) do ver>nul
- for /f "tokens=1-3delims=:." %%i in ("%time%") do set /a t2=%%i*3600+ (10%%j)%%100*60+10%%k%%100
- set /at=t2 - t1
- echo;%t%
- pause
复制代码
作者: Batcher 时间: 2023-4-26 23:20
回复 25# LTSC1809
咱们这个论坛里面懂批处理的基本上都是自学的
作者: hnfeng 时间: 2023-4-28 09:36
http://bbs.bathome.net/thread-63632-1-1.html
运行你的程序前,运行一下GetSec.exe,得到一个秒数,运行你的程序后再运行一下GetSec.exe,得到第二个秒数,两个秒数相差,就是你程序运行的时间。- @echo off&cd /d "%~dp0"
-
- for /f %%s in ('GetSec.exe') do set Sec1=%%s
-
- ping 127.1 -n 6
-
- for /f %%s in ('GetSec.exe') do set Sec2=%%s
- set /a s=%Sec2%-%Sec1%
- echo.&echo;运行时间: %s% 秒
- echo.&pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |