2015-01-13 81 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!'')' –