2015-01-13 107 views
1

感謝您的關注。此案是這樣的:CMD將等號與外部雙引號作爲參數傳遞給雙引號

[ffm.bat] 
rem %0 in "options" out 
set opt=%2 
set opt=%opt:~1,-1%&rem de-quotes 
set ffcmdstr=ffmpeg -i "%~1" %2 "%~3" 

如果我想ffcmdstr變量設置爲以下幾點:

ffmpeg -i in.mpg -vf "hqdn3d=0:0:4:0" -c:v h264 out.mp4 

理想我進入:

ffm.bat in.mpg "-vf "hqdn3d=0:0:4:0" -c:v h264" out.mp4 

問題:

  1. 空格是分隔符,所以我用「...」
  2. =也是一個分隔符;以內罰款「......」但
  3. ‘還需要內’...」,然後事業空間再次打破了參數。

試了逃生通道,但失敗了。 請給我任何有用的想法。

現在我用:

"-vf 'hqdn3d=0:0:4:0' -c:v h264" 

,並添加替代:

set opt=%opt:'="% 
+0

我推薦一種不同的評論方法。在另一個命令的同一行使用REM非常混亂。我只是在你正在評論的命令之前使用':: comment',或者甚至使用'REM註釋'。 – unclemeat

+0

我建議你使用單引號的方法,然後用雙引號代替是最好的方法。但是,您是否真的需要將單引號替換掉?你還可以用單引號中的開關值調用ffmpeg命令嗎? – unclemeat

+0

@unclemeat,之後的評論是爲你的幫手,但謝謝。不幸的是,無論ffmpeg是否接受單引號,該cmd字符串都不會被Win的COMMAND.COM接受。並導致ffmpeg錯誤: 1. '[NULL @ 0000000004bb96a0]無法找到'-vf'的合適輸出格式hq n3d = 0:0:4:0'-c:v h264'' 2。 '-vf'hqdn3d = 0:0:4:0'-c:v h264:無效參數' –

回答

1
@ECHO OFF 
SETLOCAL 
CALL :gffmpeg "in.mpg -vf "hqdn3d=0:0:4:0" -c:v h264 out.mp4" 
CALL :gffmpeg2 in.mpg "-vf "hqdn3d=0:0:4:0" -c:v h264" out.mp4 
GOTO :eof 

:gffmpeg 
SET "params=%*" 
ECHO ffmpeg -i %params:~1,-1% 
GOTO :EOF 

:gffmpeg2 
SET "params=%*" 
SET parm1=%~1 
:parml 
SHIFT 
SET "parmlast=%~2" 
IF DEFINED parmlast GOTO parml 
SET "parmlast=%~1" 

SET "parm=%parm1%" 
:parm1L 
IF DEFINED parm SET "parm=%parm:~1%"&SET "params=%params:~1%"&GOTO parm1L 

SET "parm=%parmlast%" 
:parmLL 
IF DEFINED parm SET "parm=%parm:~1%"&SET "params=%params:~0,-1%"&GOTO parmLL 

ECHO ffmpeg -i %parm1% %params:~2,-2% %parmlast% 
GOTO :EOF 

這裏有兩種方法 - 第一種方法需要重新格式化參數提供的;第二個是你目前掌握的。


所以,服用第二方法步驟一步:

駕駛批次thisbatch in.mpg「-vf 「hqdn3d = 0:0:4:0」 -c: v H264" out.mp4

@ECHO OFF 
SETLOCAL 

SET "params=%*" 
SET parm1=%~1 
:parml 
SHIFT 
SET "parmlast=%~2" 
IF DEFINED parmlast GOTO parml 
SET "parmlast=%~1" 

SET "parm=%parm1%" 
:parm1L 
IF DEFINED parm SET "parm=%parm:~1%"&SET "params=%params:~1%"&GOTO parm1L 

SET "parm=%parmlast%" 
:parmLL 
IF DEFINED parm SET "parm=%parm:~1%"&SET "params=%params:~0,-1%"&GOTO parmLL 

ECHO ffmpeg -i %parm1% %params:~2,-2% %parmlast% 
GOTO :EOF 

首先,設置params到整個命令尾in.mpg "-vf "hqdn3d=0:0:4:0" -c:v h264" out.mp4(在set命令引號確保就行後續空格 includ版在分配給該變量的值。)

parm1到第一這些參數,其中移除了引號如果它們存在(的~執行此),因此變得parm1in.mpg

接下來,我們具有

  • 「偏移」 中的參數位置的環:#1被丟棄,#2變爲#1和 等。
  • parmlast設置爲結果#2參數。
  • 檢查parmlast是否有值。如果有,繼續轉移,直到它沒有。

%1現在必須具有最後一個參數,因此將其指定爲parmlast並刪除任何引號。 parmlast獲得值out.mp4

化妝parm具有相同的價值parm1所以in.mpg

現在另一個循環。刪除第一個字符parmparams,直到parm爲空。這消除了從in.mpg所以params變得params"-vf "hqdn3d=0:0:4:0" -c:v h264" out.mp4

接着,拉相似的技巧,此時使用paramlast端的params除去out.mp4params變得"-vf "hqdn3d=0:0:4:0" -c:v h264"

最後一步 - 回波與-i開關,的parm1值,從params字符串減去第一2和最後2個字符(空間」所需ffmpeg空間分別爲)並應用parmlast的最後一個參數。

+0

[gffmpeg] '%* =「in.mpg -vf」hqdn3d = 0:0:4:0 「-c:v H264 out.mp4」' '%0 =:gffmpeg' '%1 =「in.mpg -vf 」hqdn3d' '%2 = 0:0:4:0「 - c:v h264 out.mp4「' '%3 =' %4 = %5 = %6 = %7 = %8 = %9 = –

+0

我仍在研究你的答案的第二種方法。我學到的唯一的東西是雙引號內的參數作爲相同的參數。 (0,1,9)do(''call set _pn = %%%%%% n'' call echo。%%%%')。%% * =%params%''for/l %% n in(0,1,9)do %% n =!_ pn!'')' –