我知道这些循环是为了将时间变量转换为I think milliseconds。 有人可以帮我解读数学并将循环转换为分钟吗?
for /F "tokens=1-4 delims=:.," %%a in ("!start!") do (
set /a "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)
for /F "tokens=1-4 delims=:.," %%a in ("!end!") do (
set /a "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)
我想更具体一点,我不明白%%b %%c
和%%d
来自哪里或“流氓”%%
正在做什么。我不明白为什么变量乘以60 + 1或100 + 1。我猜他们要么是乘以60还是100,基于它是否在小时之间转换 - >分钟或秒 - >厘秒。我是否正确地遵循了这一点?
答案 0 :(得分:3)
在指定初始%% for
令牌后,"tokens=1-4"
选项表示总共会使用四个令牌,因此for循环会留出%% a,%% b,% %c和%% d在该循环中使用。由于!start!
的格式为HH:MM:SS.cc,%% a为HH,%% b为MM,%% c为SS,%% d为cc。
%%
是一个数学运算符,用于返回两个数的模数。 (还记得当你第一次学习除法时,你得到的是余数而不是小数吗?模数是余数。)
1是一种确保数字不以0开头的方法,因为批处理将从0开始的数字视为八进制,因此08和09根据批处理不是有效数字,这将破坏事情。由于%%以操作的顺序胜过+,因此数学实际上是(1 %% b %% 100)。这利用了批处理允许您从其他连接字符串创建变量的事实。假设%% b是05. 1 %% b %% 100变为105 %% 100,这只是5。
要将时间转换为分钟而不是厘秒,请从
更改方程式(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100
到
(((%%a*60)+1%%b %% 100)
如果要将小数部分设置为分钟值并安装PowerShell,则可以添加行
for /F "delims=" %%A in ('powershell !start!/6000') do set start=%%A
for /F "delims=" %%A in ('powershell !end!/60000') do set end=%%A
将返回十进制数字的字符串表示。因为powershell返回的值小于11位,所以您可能希望使用substring删除任何您不想要的额外数字。
答案 1 :(得分:2)
for /F "tokens=1-4 delims=:.," %%a in ("!start!") do (
set /a "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)
<强>翻译强>
tokens=1-4
表示将根据分隔符a,b,c,d
在输入中创建四个变量(:.,
)。使用%%X
表示法扩展变量。当你只看到%%
时,这只意味着一个文字百分号%
(也就是数学中的模数运算符)。
<强>等式:强>
(((((A x 60) + ("1B" % 100)) x 60) + ("1C" % 100)) x 100) + ("1D" % 100)
一步一步:
(A x 60)= X
X +(&#34; 1B&#34;%100)= Y
(Y×60)+(&#34; 1C&#34;%100)= Z
(Z x 100)+(&#34; 1D&#34;%100)=开始
请注意,我在某些变量周围使用引号来说明令牌不会与1相乘,而是附加到值1。如果B = 10
则"1B" = 110
<强>简体:强>
(((((A x 60) + B) x 60) + C) x 100) + D