Windows 我不理解这个脚本中发生的数学运算

Windows 我不理解这个脚本中发生的数学运算,windows,batch-file,math,for-loop,time,Windows,Batch File,Math,For Loop,Time,我知道这些循环是为了将时间变量转换成毫秒。 有人能帮我把数学解出来,把循环转换成分钟吗 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 (

我知道这些循环是为了将时间变量转换成毫秒。 有人能帮我把数学解出来,把循环转换成分钟吗

    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。我的理解正确吗

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+1B%100=Y Y x 60+1C%100=Z Z x 100+1D%100=开始

请注意,我在一些变量周围使用引号来说明标记不是与1相乘,而是附加到1的值。e、 g.如果B=10,则1B=110

简化:

A x 60+B x 60+C x 100+D

翻译成:

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+1B%100=Y Y x 60+1C%100=Z Z x 100+1D%100=开始

请注意,我在一些变量周围使用引号来说明标记不是与1相乘,而是附加到1的值。e、 g.如果B=10,则1B=110

简化:

A x 60+B x 60+C x 100+D

指定初始%%A for令牌后,令牌=1-4选项表示总共将使用四个令牌,因此for循环留出%%A、%%B、%%C和%%D供该循环使用。自从开始格式为HH:MM:SS.cc、%%a是HH、%%b是MM、%%c是SS、%%d是cc

%%是用于返回两个数字的模的数学运算符。还记得你第一次学习除法时,得到的是一个余数而不是小数吗?模数是余数

1是确保数字不以0开头的一种方法,因为batch将以0开头的数字视为八进制,因此根据batch,08和09不是有效的数字,这将破坏一切。由于%%trumps+按运算顺序排列,因此计算结果实际上是1%%b%%100。这充分利用了批处理允许您从其他连接的字符串中创建变量这一事实。假设%%b是05。1%%b%%100变为105%%100,仅为5

要将时间转换为分钟而不是厘米秒,请将公式更改为

(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 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位,因此您可能希望使用a删除任何不需要的额外数字。

在指定初始%%a for标记后,tokens=1-4选项表示总共将使用四个标记,因此for循环留出%%a、%%b、%%c和%%d在该循环中使用。自从开始格式为HH:MM:SS.cc、%%a是HH、%%b是MM、%%c是SS、%%d是cc

%%是用于返回两个数字的模的数学运算符。还记得你第一次学习除法时,得到的是一个余数而不是小数吗?模数是余数

1是确保数字不以0开头的一种方法,因为batch将以0开头的数字视为八进制,因此根据batch,08和09不是有效的数字,这将破坏一切。由于%%trumps+按运算顺序排列,因此计算结果实际上是1%%b%%100。这充分利用了批处理允许您从其他连接的字符串中创建变量这一事实。假设%%b是05。1%%b%%100变为105%%100,仅为5

要将时间转换为分钟而不是厘米秒,请将公式更改为

(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 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位,因此您可能需要使用a删除任何不需要的额外数字。

这太棒了,谢谢!我只写了大约一个月的批处理,我一直有一个困难的时候,我的头围绕着lo
类似这样的循环的op语法。很高兴能提供帮助。另外,请阅读SomethingDark的精彩解释,他解释了为什么在批处理脚本中使用1%%B%100。这太棒了,谢谢!我只写了大约一个月的批处理,很难理解这样的循环的for循环语法。很高兴能提供帮助。也请阅读一些ThingDark的好解释,他解释了为什么1%%B%100用于批处理脚本。但这只给了我四舍五入的分钟数。批处理无法进行非整数运算。另外,您从未指定要非整分钟。很抱歉,有没有办法使用魔法获得浮点结果?@David,如果您安装了powershell,我添加了一些代码,将返回您要查找的十进制值的字符串表示形式。但这只会给我四舍五入的分钟数。Batch无法进行非整数数学运算。另外,您从未指定要非整分钟。很抱歉,有没有办法使用魔法获得浮点结果?@David,如果您安装了powershell,我添加了一些代码,这些代码将返回您要查找的十进制值的字符串表示形式。