2017-09-18 29 views
0

我正在嘗試編寫一個Windows批處理文件,它使用ffmpeg將具有舊* .flv視頻的整個文件夾轉換爲* .mp4視頻。爲什麼我的批處理文件無法獲取文件大小?

批處理文件或多或少的作品,但我想在刪除源文件之前做一些測試。其中一個測試是輸出文件應該至少是原始文件的2/3,但我無法使其工作。

這是我的bat文件(包括所有的調試回聲線包括):

@echo off 

setlocal EnableExtensions EnableDelayedExpansion 

::------------------------------------------------------------------------------------- 
:: get options and folder path 
set opzione=%~1% 
set cartella=%~2% 
:: who's who? 
if "%opzione:~3,1%"=="" (
    echo. 
) else (
    if "%opzione:~0,1%"=="/" (
     echo. 
    ) else (
     set opzione=%~2% 
     set cartella=%~1% 
    ) 
) 
::echo. 
::echo Cartella = %cartella% 
::echo Opzione = %opzione% 
::echo. 



::------------------------------------------------------------------------------------- 
:Check_path 
    set FLV_FOLDER="%cartella%" 

    if %FLV_FOLDER% == "" ( 
     echo ... Invalid 
     goto :uscita 
    ) else (
     echo ... OK. 
    ) 

::------------------------------------------------------------------------------------- 
:Check_Options (STILL W.I.P.) 
    set Lista=0 
    set Convert=0 
    set Delete=0 

    if "%opzione%"=="/c" (set Convert=1) 
    if "%opzione%"=="/l" (set Lista=1) 
    if "%opzione%"=="/d" (set Delete=1) 

::echo Lista = %Lista% 



::------------------------------------------------------------------------------------- 
:Loop_path 
@cls 
echo Looping all .flv files in %FLV_FOLDER%... 

    for /R %FLV_FOLDER% %%a IN (*.flv) do call :Converting_Function "%%a" 
    goto :uscita 



::------------------------------------------------------------------------------------- 
:Converting_Function 
    set infile="%~1" 
    set outfile="%~dpn1.mp4" 

    set outsize=0 
    set insize=0 
    set minsize=0 

    if not %Lista%==0 goto :just_list 

    echo Converting %infile% to %outfile% 
    ffmpeg -v error -i %infile% -c copy -copyts %outfile% 

    ::....................CHECKS........................................................ 
echo Errors from ffmpeg? 
    if errorlevel 1 goto :error_ffmpeg 

echo Do the outfile exist? 
    if not exist %outfile% goto :error_exist 

echo Is outfile big enough? 
    :: (say yes if outfile size > infile size*2/3) 
    for /f %%S in (%outfile%) do set "outsize=%%~zS" 
echo %outfile% size is %outsize% 
    for /f %%S in (%infile%) do set insize=%%~zS 
echo %infile% size is %insize% 
    set /A "minsize=(%insize%*3)/2" 
echo minsize is %minsize% 

    if not %outsize% GTR %minsize% goto :error_size 
    ren "%~1" "%~n1.todelete" 
::    del /q %infile% 
    goto :eof 
:error_ffmpeg 
    echo Convertion error 
    pause 
    if exist %outfile% del /q %outfile% 
    goto :eof 
:error_exist 
    echo %outfile% does not exist 
pause 
    goto :eof 
:error_size 
    echo Size of %outfile% is 0 
pause 
    goto :eof 
:just_list 
    echo %infile% 
    goto :eof 

:uscita 
pause 

這是輸出:

Converting "T:\C++Stuffs\_PROVACONV_\Monaco - Machine_#1 - Monday Morning.flv" to "T:\C++Stuffs\_PROVACONV_\Monaco - Machine_#1 - Monday Morning.mp4" 
[flv @ 0000000000577320] Packet mismatch 107347968 1638 1638 
Errors from ffmpeg? 
Do the outfile exist? 
Is outfile big enough? 
"T:\C++Stuffs\_PROVACONV_\Monaco - Machine_#1 - Monday Morning.mp4" size is 
"T:\C++Stuffs\_PROVACONV_\Monaco - Machine_#1 - Monday Morning.flv" size is 
Operando mancante. 
minsize is 0 
0 non atteso. 
D:\ffmpeg-20170204-b1e2192-win64-static\bin> 

Operando mancante意味着缺少操作數0非atteso意思是意外的0

爲什麼我在變量中沒有文件大小?什麼是缺少的操作數?

+1

爲什麼使用'for/F'來確定文件大小? 'for/F'旨在讀取文件內容;你應該使用'for'而不用'/ F'開關來代替... – aschipfl

+0

這就是問題所在!我使用它,因爲我用Google搜索並使用了類似問題的接受答案。 – Parduz

+0

我想知道爲什麼這個問題是downvoted ...雖然我的問題可能是愚蠢的,我做了我的搜索,做了我的嘗試,張貼我的代碼,沒有要求「爲我做」回答.... – Parduz

回答

2

環境變量infileoutfile使用雙引號括起來定義文件名。不建議按照Why is no string output with 'echo %var%' after using 'set var = text' on command line?的回答中的說明進行解釋。但這是有效的,並按預期工作。

命令行獲得輸出文件的文件大小

for /f %%S in (%outfile%) do set "outsize=%%~zS" 

由例如Windows命令解釋器在執行前處理以

for /f %S in ("C:\Path\File Name.mp4") do set "outsize=%~zS" 

它可以在一個命令提示窗口執行讀取for /?for /F集合(圓括號之間的字符串)解釋爲字符串,如果用雙引號括起來,除了選項使用這是不是在這裏完成。由於這個原因,FOR將字符串C:\Path\File Name.mp4拆分爲使用空格/製表符作爲分隔符的標記,並將第一個標記分配給循環變量S。因此,分配給S的例子是C:\Path\File。此文件的文件大小不能由Windows命令解釋程序確定,因爲此文件不存在。

的解決方案是使用FOR沒有選項/F

for %%S in (%outfile%) do set "outsize=%%~zS" 

和命令行獲取輸入文件的文件大小

for /f %%S in (%infile%) do set insize=%%~zS 

可以通過

set "insize=%~z1" 
被替換

runn上的幫助輸出在命令提示符窗口call /?中解釋了這個參數修飾符,用於在調用它時獲取作爲第一個參數傳遞給批處理文件的文件的大小。


上運行set /?幫助輸出解釋說,在算術表達式中的環境變量的當前值可以通過指定只用他們的名字的環境變量,而無需使用%!引用。即使在從(開始並以匹配)結尾的命令塊內,該工作也可以工作。

與算術表達式的命令行

set /A "minsize=(%insize%*3)/2" 

可導致上insize不是在

set /A "minsize=(*3)/2" 

執行被定義這解釋了錯誤消息,因爲確實是有缺少該左操作數乘法。

該解決方案使用命令SET幫助推薦的算術表達式。

set /A "minsize=(insize*3)/2" 

該算術表達式永遠不會失敗的評估。在環境變量insize沒有定義的情況下,在幫助解釋算術表達式的評估時,它被0代替。請參閱Debugging a batch file

請注意,Windows命令解釋器僅支持具有32位有符號整數值的算術表達式。因此,文件大小爲2 GiB或更高的視頻文件無法通過批處理代碼正確處理。

相關問題