我不遵循此脚本中发生的数学运算

时间:2014-12-23 20:31:39

标签: windows batch-file math for-loop time

我知道这些循环是为了将时间变量转换为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,基于它是否在小时之间转换 - >分钟或秒 - >厘秒。我是否正确地遵循了这一点?

2 个答案:

答案 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表示法扩展变量。当你只看到%%时,这只意味着一个文字百分号%(也就是数学中的模数运算符)。

  • 令牌1 = A
  • 令牌2 = B
  • 令牌3 = C
  • 令牌4 = D

<强>等式:

(((((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