我有一個文本檔案,它記錄了一些視頻檔案的視頻持續時間的 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%
我已經嘗試了我能想到的每一個組合,但沒有運氣,很多搜索都沒有回來。
知道如何做到這一點,或者有沒有更好的方法將所有這些以純批處理方式加起來?
uj5u.com熱心網友回復:
一個純粹的Powershell解決方案會簡單得多,但是根據您batch-file的需要powershell:
@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%
uj5u.com熱心網友回復:
所以這就是我想出的,雖然沒有它可能的優雅,但它正在作業。希望它更快一點,但 PowerShell 會減慢速度,但絕對值得!
做他們從來沒想過使用浮點數的時候想想真是太瘋狂了,哈哈
反正這里是代碼:
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.
我希望這可以幫助某人!考慮到我找不到遇到我的解決方案 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)
然后保持原樣,直到有人發布更好的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460742.html
下一篇:OpenJDK版本控制
