CMD传递带有等号的双引号,外部双引号作为参数

时间:2015-01-13 04:37:53

标签: batch-file 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. space是一个分隔符,所以我使用" ..."
  2. =也是分隔符;在" ..."但
  3. "也需要在" ..."然后再造成空间破坏参数。
  4. 尝试了几种ESCAPE方式但失败了。 请给我任何有用的想法。

    现在我用:

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

    并添加替换:

    set opt=%opt:'="%
    

1 个答案:

答案 0 :(得分: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.mp4set命令中的引号,确保该行上的尾随空格包含在赋值给变量的值中。)

parm1设置为这些参数中的第一个,如果它们存在则删除引号(~执行此操作),以便parm1变为in.mpg

接下来我们有一个循环

  • “移动”参数的位置:#1被删除,#2变为#1和 等等。
  • parmlast设置为结果#2参数。
  • 检查parmlast是否有值。如果有,请继续移动,直到没有。

%1现在必须拥有最后一个参数,因此请将其分配给parmlast并删除任何引号。 parmlast获取值out.mp4

make parmparm1具有相同的值in.mpg

现在是另一个循环。删除parmparams的第一个字符,直到parm为空。这会从in.mpg中删除params,因此params变为"-vf "hqdn3d=0:0:4:0" -c:v h264" out.mp4

接下来,提取一个类似的技巧,这次使用paramlastout.mp4 end 中删除paramsparams变为"-vf "hqdn3d=0:0:4:0" -c:v h264"

最后一步 - 使用ffmpeg开关回显所需的-i行,parm1的值,来自params的字符串减去前2个和后2个字符( Space Space 并应用parmlast中的最后一个参数。