2012-11-01 57 views
2
@echo off 
rem ffmpeg -i test.ts 2>&1 | find "Duration" > duration.txt 
rem set /p duration=<duration.txt 

set duration= Duration: 01:09:52.59, start: 0.136811, bitrate: 10740 kb/s 

set /a Hours=%duration:~12,2% 
set /a Mins=%duration:~15,2% 
set /a Secs=%duration:~18,2% 

set /a Duration_In_Seconds=(hours*3600)+(mins*60)+secs 

echo %duration_In_seconds% 

當我嘗試將「09」設置爲名爲mins的整數變量時,它失敗。.BAT - 將字符串變量中的數字轉換爲基數10整數變量

無效的號碼。數字常量是十進制(17),十六進制(0x11)或八進制(021)。

我需要將字符串轉換爲整數,這樣我就可以使用一些基本的數學在幾秒鐘內

回答

2

閱讀SET幫助(從命令提示符HELP SET型)制定時間,你會看到,SET總是解釋零前綴數字爲八進制。沒有設置會強制使用base 10.相反,您必須操作字符串,使其不以零開頭。

沒有必要寫入臨時文件。您可以使用FOR/F分析輸出,也可以將輸出分爲小時,分鐘和秒鐘標記。

我知道的2層簡單的方法來繞過主導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 
) 
+0

謝謝dbhenman。我似乎要求的每一個問題都可以通過for命令來解決:D – Kiwijunglist

+0

set/a小時= 1%持續時間:〜12,2%然後使用(小時-100)幾小時也可以工作:D – Kiwijunglist

+0

您的代碼在2 >&1在這個時候是意外的。 – Kiwijunglist