阅读 SET 帮助(HELP SET
从命令提示符键入),您会看到 SET 总是将零前缀数字解释为八进制。没有设置会强制以 10 为基数。相反,您必须操纵字符串,使其不以零开头。
无需写入临时文件。您可以使用 FOR /F 来解析输出,它还可以将输出分解为小时、分钟和秒标记。
我知道有两种简单的方法可以绕过前导 0。
一种方法是在值前面加上 1,然后使用 mod(余数)运算符提取所需的数字。在您的情况下,小时数将被限制为最大值 99。如果您需要支持最多 999,那么您可以前缀 10 并采用 1000 的 mod。请注意,可以使用单个 SET / 执行多个分配使用,
分隔每个赋值的语句。SET /A 遵循正确的优先顺序,因此不需要括号。
@echo off
for /f "tokens=2-4 delims=:. " %%A in ('ffmpeg -i test.ts 2^>^&1 ^| find "Duration"') do (
set /a Hours=1%%A%%100, Mins=1%%B%%100, Secs=1%%C%%100, Duration_In_Seconds=Hours*3600+Mins*60+Secs
)
另一种方法是使用 FOR /F 循环去除前导零。我附加一个 1,然后除以 10,这样仍然会处理一个只有零的字符串。
@echo off
for /f "tokens=2-4 delims=:. " %%A in ('ffmpeg -i test.ts 2^>^&1 ^| find "Duration"') do (
for /f "delims=0" %%N in ("%%A1") do set /a Hours=%%N/10
for /f "delims=0" %%N in ("%%B1") do set /a Mins=%%N/10
for /f "delims=0" %%N in ("%%C1") do set /a Secs=%%N/10
set /a Duration_In_Seconds=Hours*3600+Mins*60+Secs
)
如果您愿意,如果小数秒大于或等于 0.5,则可以轻松扩展代码以将秒数向上舍入。只需添加,
作为分隔符来解析额外的标记,然后使用一些数学技巧来进行舍入。
@echo off
for /f "tokens=2-5 delims=:., " %%A in ('ffmpeg -i test.ts 2^>^&1 ^| find "Duration"') do (
for /f "delims=0" %%N in ("%%A1") do set /a Hours=%%N/10
for /f "delims=0" %%N in ("%%B1") do set /a Mins=%%N/10
for /f "delims=0" %%N in ("%%C%%D1") do set /a Secs=(%%N+500)/1000
set /a Duration_In_Seconds=Hours*3600+Mins*60+Secs
)