在变量%waveDuration%中我的持续时间为0:00:35.368667(0小时,0分钟,35秒+各种毫秒)
我希望以@25 fps PAL
的帧数转换它使35.36 X 25 = 884,21 - >舍入= 884(结果将放入新变量%framecount%)
我尝试了2种类型的批量计算器,但我错了一些我无法解决的问题。请问我该怎么办?感谢
for /f "tokens=1-4 delims=:," %%a in (
"%waveduration%"
) do set /a "framecount"=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%d0)/10 ) * 25 / 100
并将值放在.txt
中for /f "tokens=1-4 delims=:," %%a in ('c:\duration.txt') do set /a "number_Of_Frames=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%d0)/10 ) * 25 / 100"
但是,正如所说:这似乎不起作用
答案 0 :(得分:2)
set "t=:%waveduration:.=:%"
for /f "tokens=1-4 delims=:" %%a in ("%t::0=: %") do set /a "framecount=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%d0)/100000 ) * 25 / 100"
echo %framecount%
将所有内容转换为百分之一秒即可运行。
已编辑:如mojo所示,此解决方案与毫秒格式紧密相关,还需要一种不同的方式来处理它们(在这种情况下,前导零是重要的)。如果它可以变化,那么
set "waveduration=0:00:35.368667"
for /f "tokens=1-4 delims=:." %%a in (":%waveduration::0=: %") do (
set "framecount=1%%d00"
setlocal enabledelayedexpansion
for /f %%x in ("!framecount:~0,3!") do (
endlocal
set /a "framecount=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%x-100) ) * 25 / 100"
)
)
echo %framecount%
答案 1 :(得分:1)
CMD / Batch只进行整数运算。你必须自己做浮点数。在这个例子中,我将小数秒作为整数处理,首先乘以帧速率,然后除以推导的小数分母(10 num_digits )。
我还必须执行连续的SET /A
操作,因为CMD不喜欢包含括号的表达式。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "waveduration=0:00:35.368667"
SET FRAME_RATE=25
FOR /F "tokens=1-4 delims=:." %%a IN ("%waveduration::0=:%") DO (
SET DENOM=1
FOR /L %%i IN (0,1,8) DO (
IF %%d GTR !DENOM! SET /A DENOM*=10
)
SET /A "framecount=(%%a*3600 + %%b*60 + %%c)*%FRAME_RATE% + %%d*%FRAME_RATE%/!DENOM!"
)
@ECHO %waveduration% : %framecount%
答案 2 :(得分:1)
在bat脚本中使用Powershell:
@echo off
SET "waveduration=0:05:35.368667"
for /f "tokens=1-4 delims=:." %%a in ('echo %waveduration%') do (
for /f "delims=" %%x in ('powershell ^(0.%%d + ^(%%a * 3600^) + ^(%%b * 60^) + %%c^)*25') do echo FrameCount = %%x)