当前位置:首页 » 编程软件 » bat脚本for循环计算时间差

bat脚本for循环计算时间差

发布时间: 2022-08-17 05:08:06

㈠ 批处理bat计算两个时间差

这个是脚本代码[保存为etime.bat放在当前路径下即可:
复制代码
代码如下:
:etime
<begin_time>
<end_time>
<return>
rem
所测试任务的执行时间不超过1天
//
骨瘦如柴版
setlocal&set
be=%~1:%~2&set
cc=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1%%c&set
dy=-8640000
for
/f
"delims=:
tokens=1-6"
%%a
in
("%be:.=%")do
endlocal&set/a
%3=%cc%,%3+=%dy%*("%3>>31")&exit/b
计算两个时间点差的函数批处理etime
今天兴趣大法思考了好多bat的问题,以至于通宵
在论坛逛看到有个求时间差的"函数"被打搅调用地方不少(大都是测试代码执行效率的)
复制代码
代码如下:
:time0
::计算时间差(封装)
@echo
off&setlocal&set
/a
n=0&rem
code
随风
@bbs.bathome.cn
for
/f
"tokens=1-8
delims=.:
"
%%a
in
("%~1:%~2")
do
(
set
/a
n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
set
/a
n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
set
/a
s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
set
"ok=%s%
小时
%f%
分钟
%m%

%n%
毫秒"
endlocal&set
%~3=%ok:-=%&goto
:EOF
这个代码的算法是统一找时间点凌晨0:00:00.00然后计算任何一个时间点到凌晨的时间差(单位跑秒)
然后任意两个时间点求时间差就是他们相对凌晨时间点的时间数的差
对09这样的非法8进制数的处理用到了一些技巧,还有两个时间参数不分先后顺序,可全可点,
但是这个代码一行是可以省去的(既然是常被人掉用自然体积越小越好):
复制代码
代码如下:
@echo
off&setlocal&set/a
n=0&set
"s=+:%~1^&echo
-:%~2"
for
/f
"tokens=1-5
delims=.:"
%%a
in
('echo
%s%')
do
(rem
code
随风
@bbs.bathome.cn
set/a
n%%a=10%%b%%100*360000+10%%c%%100*6000+10%%d%%100*100+10%%e%%100)
set
/a
s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
set
"ok=%s%
小时
%f%
分钟
%m%

%n%
毫秒"
endlocal&(if
%3.
equ
.
(echo
%ok:-=%)
else
set
%~3=%ok:-=%)&exit/b
再研究下,有更简短的版本
这个代码是我在cn-dos写过的,今天再优化了下更简短
代码的算法深入一层:
用hmsw(各字母代表一个两位数字)表示标准时间
我们记他到凌晨的相对时间数为Tx
Tx=hmsw时间点-0:00:00.00时间点=h*3600*100+m*60*100+100*s+w
hmsw
8位10进制数表示的时间数(单位0.01秒)就是hmsw跑秒
hmsw=w+100*s+10000*m+1000000*h
hmsw-Tx=640000*h+4000*m
所以Tx=hmsw-(640000*h+4000*m)=hmsw-4000*(160*h+m)
那么Tx_2-Tx_1=hmsw_2-hmsw_1-4000*(160*(h_2-h_1)+(m_2-m_1))
对与09这样的非法8进制数我们给他们每个前面加上1就可以保证是十进制数又能保证差值不变
对于非同一天的时间(这种情况较少,除非你在接近0晨时调用)我们把用8640000-去替换负号
再用set/a赋值
就是下面代码用到的算法
Tx_2-Tx_1=hmsw_2-hmsw_1-4000*(160*(1h_2-1h_1)+(1m_2-1m_1))
复制代码
代码如下:
rem
兼容时间点跨天的情行,时间格式00:00:00.00
或者
0:00:00.00
皆可
:_difftime
<Begin_Time>
<End_Time>
[ret]
//返回两个时间点的差值(单位0.01秒)
Setlocal
enabledelayedexpansion&set
b=0%1&set
e=0%2&set
c=1!e:~-11!-1!b:~-11!&set
c=!c::=!
set/a
c=%c:.=%-4000*(160*(1%e:~-11,-9%-1%b:~-11,-9%)+1%e:~-8,-6%-1%b:~-8,-6%)
endlocal
&
(if
%3.==.
(echo
%c:-=8640000-%)
else
set/a
%3=%c:-=8640000-%)&exit/b
给difftime前面加上_是为了表明不是临时写的子过程也为了以后连接库函数标签的唯一性
//
题外话:
对于子过程,若启用了变量延迟,原则上三行都可以写完,尽量写紧凑些(因为没人读),但是对于算法,
思路性的东西要能舍得笔墨,越详细越好,我发现即使你的代码写得再好,不会有人全搬,都会小修改,
你自己初写代码时不可能考虑到所有人使用的具体情况,自然没人愿意很详细看你的代码,倒是你的思路为
别人提供了一个方法,在此意义上函数库的作用起到方法库的作用

㈡ bat脚本循环获取时间相同

换个变量名称,不要改变系统变量的值
第一次把结果赋值给变量time,那么第二次时,后面的截取就是从第一次的结果中截取,而不是从系统时间变量

㈢ bat 如何循环一段命令 goto或for都行

让bat脚本循环执行有以下两种方法:

第一、可以直接加个%0,即执行本身,实现循环。

第二、用goto命令,去到要重复的开头,如果要限制次数,可以先set 一个值,循环一次减1,条件命令到0退出,实现循环。

(3)bat脚本for循环计算时间差扩展阅读:

goto语句一般格式如下:

goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。

如: label: i++;

loop: while(x<7);

goto loop;

goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

㈣ bat脚本for循环问题

@echooff
for/l%%ain(1,1,50)do(
for/l%%bin(1,1,50)do(
echoa=%%ab=%%b
SET/Ac=%%a+%%b
callecho%%c%%
)
)

㈤ dos命令for循环中时间问题

应该叫bat脚本较合适一些
由于bat执行时会有个预处理,它是逐句进行的,并且复合句例如一个for循环整体算一个复合句作为一个处理单元,预处理的一个工作就是把%var%类的变量值给"扩展"开来,取值当然就是开始预处理该复合句时的赋值情况,所以%time%会一直不变
解决方法,这里示例一种加call 且%符双写的方法:
call echo %%i %%date%% %%time%%>>.\run.TXT (也许不会跨日运行 则date外不双写%%也行)
此提问请详见命令行输入 set/? 的帮助信息,其中一段 "终于添加了延迟环境变量扩充的支持..." 也举有例子,介绍的是最常用的处理方法

㈥ bat中for循环时间问题

@echooff
rem间隔指定秒数打开网页
set#=Anyquestion&set$=Q&set/az=0x53b7e0b4
title%#%+%$%%$%%z%
cd/d"%~dp0"
sett=10
for/l%%ain(019)do(
startC:Progra~1Intern~1iexplore.exe"http://www..com/%%a"
>nulping/n%t%0
)
pause
exit

㈦ BAT通过循环运行时间计算求得命令执行时间的平均值

你把时间直接相减是不对的, 1 %time%里含非数字的分隔符 2 如果发生借位,是把它看成一串10进制来算的,就是说1小时当成100分,1分当成100秒
帮你写了个测试批处理,我机上时间格式如 9:02:00.03 形式(若不同可能要改for /f "tokens=2-4 delims=:. " ),调用另一批处理我用的call :sub,你也可以把另一批处理的代码贴到这标签处, 我这里是用随机延时作为测的时间,次数只用了3次(改set nu),计算方面,不考虑每次超过59分钟的情况
输出格式方面你自己酌情更改
@echo off&setlocal enabledelayedexpansion
set nu=3
echo/&echo 测试中。。。
for /L %%i in (1,1,%nu%)do (
title . 第 %%i 次
set tb=!time!
call :sub
set te=!time!
call :cout cb%%i !tb!
call :cout ce%%i !te!
set/a "c%%i=(6000+ce%%i-cb%%i)%%6000"
set/a "c=c%%i"
set cc%%i=!c:~,-2!.!c:~-2!
if "!cc%%i:~,1!"=="." set cc%%i=0!cc%%i!
set t%%i=!tb! ~ !te! == !cc%%i! s
)
(echo %date:~,10% 随机延时测试:&echo/)>test.txt
for /L %%i in (1,1,%nu%)do (
echo %%i !t%%i!>>test.txt
set/a tot+=c%%i)
set/a av=tot*100/nu+50
set av=%av:~,-4%.%av:~-4,2%
if "!av:~,1!"=="." set av=0!av!
(echo/&echo %nu% 次平均用时: %av% s)>>test.txt
title . OK
echo/&echo %nu% 次平均用时: %av% s
endlocal
echo/&pause
start test.txt
goto :eof

:cout
for /f "tokens=2-4 delims=:. " %%a in ("%2")do (
set/a "%1=(1%%a-100)*6000+1%%b%%c-10000")
goto :eof

:sub
set/a "ran=%random%%%8000+100"
ping -n 1 -w %ran% 9 >nul
goto :eof

㈧ bat 语句 怎么计算两个时间差

bat语句中计算两个时间差,可以先将时间转换成秒数,然后,将两个时间数进行相减即可。

参考代码:

@echooff
setns=0
rem显示开始时间
settime1=%time%
echo当前时间是%time1%
call:time2sec%time1%
sett1=%ns%
pause
rem显示结束时间
settime2=%time%
echo当前时间是%time2%
call:time2sec%time2%
sett2=%ns%
rem计算时间差
set/atdiff=%t2%-%t1%
echodiff%time1%from%time2%=%tdiff%seconds.

pause
goto:eof

:time2sec
rem将时间转换成秒数,保存到ns中
settt=%1
sethh=%tt:~0,2%
setmm=%tt:~3,2%
setss=%tt:~6,2%
set/ans=(%hh%*60+%mm%)*60+%ss%
goto:eof

编程:bat文件的for循环写法:

编程bat文件的for循环写法:
@echo off
for /l %%a in (1,1,9) do (
for /l %%b in (1,1,9) do (
for /l %%c in (1,1,9) do (
echo %%a%%b%%c>>1.txt
)
)
)
pause

%%1是变量名,变量名只能是一个字.可为任意数字或字母;
/l是for里的一个递增参数(初始值,递增值,最终值)。

㈩ 写一个bat文件,传两个参数,在两个参数之间循环。参数是日期形式的字符串。下面是代码。

首先说一下问题,

因为在批处理开始执行的时候,每一个引用的变量都会被扩充。

因此重新变量赋值改变后,使用%变量%来引用变量值的话,

得到的会是原来的变量值,启用延迟变量扩充可以解决。

看一个例子:


set var=value

if "%var%"=="value" (

set var=new_value

if "%var%"=="new_value" @echo 看见这个说明新的变量值引用成功。

)


结果是不会看见消息的。

正确做法是


SetLocal EnableDelayedExpansion

set var=value

if "%var%"=="value" (

set var=new_value

if "!var!"=="new_value" @echo看见这个说明新的变量值引用成功, var:!var!

)


然后是for变量的理解,你对for变量理解有误。在你给出这段代码中,

for变量%%n 是按照循环体(20121231,1,20130102)中设好的范围,

被依次赋值为数字 20121231 到 20130102,

虽然你在do ( ... ) 这部分,通过call调用执行了另一段代码,

但你调用的这部分代码,其实际效果也只是满足IF的条件判断,来新增并赋值了begain_d,begain_m,begain_y 这几个变量而已,没有影响到%%n的值。

所以你在你for语句执行到最后一条命令 echo 今天是第%%n天时,返回给你的只会是

今天是第 20121231 天

今天是第 20121232 天

今天是第 20121233 天

... ...

今天是第 20130102 天

这样的结果。


所以从你的批处理代码中确实没法搞明白你想做什么。

如果是想实现表示日期的数字每日递增,你的FOR循环就已经实现了。

如果是想计算日期差,并不需要用循环来将全部日期都列出一遍。

你可以直接描述一下你具体想通过批处理实现怎样的效果。

以便根据你的描述,重新给出对应的脚本代码

热点内容
公司管理数据库 发布:2025-03-24 07:19:15 浏览:667
河南电脑服务器托管云主机 发布:2025-03-24 07:10:36 浏览:471
收件服务器应该是什么 发布:2025-03-24 06:52:37 浏览:873
小黄狗编程 发布:2025-03-24 06:43:02 浏览:639
华为手机手画密码如何设置 发布:2025-03-24 06:40:20 浏览:658
读java源码 发布:2025-03-24 06:29:06 浏览:35
欧皇源码 发布:2025-03-24 06:26:18 浏览:858
为什么id密码在异地登录 发布:2025-03-24 06:17:13 浏览:46
google地图连接服务器地址 发布:2025-03-24 06:12:43 浏览:359
安卓怎么样恢复手机删除的视频 发布:2025-03-24 06:07:03 浏览:133