使用powershell在批处理文件中添加文本文件中的浮点数



我有一个从ffprobe记录一些视频文件的视频持续时间的时间戳的文本文件,该文本文件看起来像这样:

14.068700
5.043011
84.071967
5.043011
104.058600
5.043011
134.055234
5.056000 ....

我试图把这些加起来,因为批处理文件不允许浮点数,我选择使用powershell。下面是我的代码:

set total=0
for /f "tokens=*" %%x in (timestamps.txt) do (
set item=%%x    
echo !item!
for /f  "delims=." %%i in ('powershell %total% + %item%') DO SET total=%%i      
echo %total%    
)

但是由于它是一个浮点数所以我无法执行

之类的操作
SET /a total=%total% + %total%

,这样我就不能把它作为变量添加到这一行中:

powershell %total% + %item%

我试了我能想到的每一个组合都没有运气,搜索了很多次,没有任何结果。

有任何想法如何做到这一点,或者有一个更好的方法来添加所有这些在纯批处理?

一个纯粹的Powershell解决方案会简单得多,但看到你需要batch-filepowershell:

@echo off
setlocal enabledelayedexpansion & set nums=
for /f "usebackq delims=" %%x in ("timestamps.txt") do set nums=!nums!%%x+
for /f "delims=" %%i in ('powershell %nums:~0,-1%') do set "total=%%i"
echo Total: %total%

我们只是将所有带有操作符+的数字附加到一个变量上,然后将该变量传递给powershell并获得结果。注意!需要delayedexpansion,因为我们正在设置

或者使用powershell完成所有的工作,然后简单地将结果赋值给变量:

@echo off
for /f "delims=" %%i in ('"powershell -command (Get-Content -Path "timestamps.txt" ^| Measure-Object -Sum^).Sum"') do set "total=%%i"
echo Total: %total%

所以这就是我想到的,不像它可能是优雅的,但它是工作的。希望它能快一点,但是PowerShell减慢了速度,但是绝对值得!

在做DOS的时候,他们从来没有想过使用浮点数,这真是太疯狂了,哈哈

无论如何这里是代码:

set seconds=0
set item=0
for /f "tokens=*" %%t in (%filename%_copy_two%fileextension%) do (
set item=%%t
for /f %%i in ('powershell !item!+!seconds!') do (set seconds=%%i) 
)

for /f %%i in ('powershell -NoP "[Math]::Round(!seconds!/ 60,2)"')  do (set minutes=%%i) 
set HH=00
for /f "tokens=1 delims=." %%r in ('echo %minutes%') do set min=%%r
for /f "tokens=2 delims=." %%p in ('echo %minutes%') do set sec=%%p
IF %sec% GTR 60 (
set /a newSec=!sec!-60
if !newSec! lss 10 set newSec=0!newSec!
set /a newMin=1 + !min!
if !newMin! lss 10 set newMin=0!newMin!

) else (
set /a newMin=!min!
set /a newSec=!sec!
)
IF %newMin% LSS 60 (
if !newMin! lss 10 set newMin=0!newMin!
set MM=!newMin!
if !newSec! lss 10 set newSec=0!newSec!
set SS=!newSec!
GOTO playlistTotal  
)
IF %newMin% GEQ 60 IF %newMin% LSS 120 (
set /a MM=!newMin!-60
if !MM! lss 10 set MM=0!MM!
set /a HH=01
set SS=!newSec!
GOTO playlistTotal  
)
IF %newMin% GEQ 120 IF %newMin% LSS 180 (
set /a MM=!newMin!-120
if !MM! lss 10 set MM=0!MM! 
set /a HH=02
set SS=!newSec!
GOTO playlistTotal
) 
IF %newMin% GEQ 120 IF %newMin% LSS 240 (
set /a MM=!newMin!-180
if !MM! lss 10 set MM=0!MM!
set /a HH=03    
set SS=!newSec!
GOTO playlistTotal
) 
IF !newMin! EQU 240 (
set /a MM=!newMin!-240
if !MM! lss 10 set MM=0!MM!
set /a HH=04    
set SS=!newSec! 
GOTO playlistTotal  
) 
IF %newMin% Gtr 240 (
ECHO  We do not suggest a single playlist over 4 hours.
echo  Please Go back edit your list to be shorter.
ECHO  And just append to it
del %filename%_copy%fileextension%
del %filename%_copy_two%fileextension%
GOTO editPlaylist
)

:playlistTotal
del %filename%_copy%fileextension%
del %filename%_copy_two%fileextension% 
echo.
Echo Playlist a total duration of = !HH!:!MM!:!SS!
echo.
IF !newMin! EQU 240 (
set /a MM=!newMin!-240
if !MM! lss 10 set MM=0!MM!
set /a HH=04    
set SS=!newSec! 
GOTO playlistTotal  
) 
IF %newMin% Gtr 240 (
ECHO  We do not suggest a single playlist over 4 hours.
echo  Please Go back edit your list to be shorter.
ECHO  And just append to it
del %filename%_copy%fileextension%
del %filename%_copy_two%fileextension%
GOTO editPlaylist
)

:playlistTotal
del %filename%_copy%fileextension%
del %filename%_copy_two%fileextension% 
echo.
Echo Playlist has a total duration of= !HH!:!MM!:!SS!
echo.

我希望这能帮助到一些人!有点臭,我6个月都不能问这个问题了,因为我找不到解决方案。OP

我再一次在一个问题之后发布了我的解决方案,我每次都尝试这样做,祝你有美好的一天!

编辑:感谢@Gerhard

我已更改为此,但将代码留在这里,以防有人需要以不同的方式解决类似的问题。

for /f "delims=" %%i in ('"powershell -command (Get-Content -Path "%filename%_copy_two%fileextension%" ^| Measure-Object -Sum^).Sum"') do set "seconds=%%i"
for /f %%i in ('powershell -NoP "[Math]::Round(!seconds!/ 60,2)"')  do (set minutes=%%i) 

然后保持不变,直到有人发布更好的解决方案。

您可以在一个非常简单和纯粹的批处理文件中实现这一点,它比任何PS:快得多

@echo off
setlocal
set /A factor=1000000, total=0
for /F "tokens=1,2 delims=." %%a in (timestamps.txt) do set /A total+=%%a*factor+1%%b-factor
echo %total:~0,-6%.%total:~-6%

当然,这个解决方案非常简单,因为它假设所有输入的数字都有6个小数!如果不是这种情况,那么应该相应地修改代码…

相关内容

最新更新