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

Batch file CMD传递带等号的双引号,外部双引号作为参数,batch-file,cmd,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 "hq

谢谢你的关心。情况如下:

[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
问题:

  • 空格是分隔符,所以我使用“…”
  • =也是一个分隔符;很好,但是
  • “…”中也需要“…”然后导致空格再次打断参数
  • 尝试了几种逃跑方法,但失败了。 请给我一些有用的想法

    现在我使用:

    "-vf 'hqdn3d=0:0:4:0' -c:v h264"
    
    并添加替换项:

    set opt=%opt:'="%
    
    @ECHO关闭
    SETLOCAL
    调用:gffmpeg“in.mpg-vf”hqdn3d=0:0:4:0“-c:v h264 out.mp4”
    调用:gffmpeg2 in.mpg“-vf”hqdn3d=0:0:4:0“-c:v h264”out.mp4
    后藤:eof
    :gffmpeg
    设置“参数=%*”
    ECHO ffmpeg-i%参数:~1,-1%
    后藤:EOF
    :gffmpeg2
    设置“参数=%*”
    集合parm1=%~1
    :parml
    移位
    设置“parmlast=%~2”
    如果定义了parmlast转到parml
    设置“parmlast=%~1”
    设置“parm=%parm1%”
    :parm1L
    如果已定义参数集“parm=%parm:~1%”和集“params=%params:~1%”和GOTO parm1L
    设置“parm=%parmlast%”
    :parmLL
    如果已定义参数集“parm=%parm:~1%”和集“params=%params:~0,-1%”和转到参数集
    ECHO ffmpeg-i%parm1%%参数:~2,-2%%parmlast%
    后藤:EOF
    
    这里有两种方法-第一种方法需要对提供的参数进行重新格式化;第二种方法是根据您当前的情况进行格式化


    因此,逐步采用第二种方法:

    使用该批在.mpg“-vf”hqdn3d=0:0:4:0“-c:v h264”out.mp4中驱动批

    @ECHO关闭
    SETLOCAL
    设置“参数=%*”
    集合parm1=%~1
    :parml
    移位
    设置“parmlast=%~2”
    如果定义了parmlast转到parml
    设置“parmlast=%~1”
    设置“parm=%parm1%”
    :parm1L
    如果已定义参数集“parm=%parm:~1%”和集“params=%params:~1%”和GOTO parm1L
    设置“parm=%parmlast%”
    :parmLL
    如果已定义参数集“parm=%parm:~1%”和集“params=%params:~0,-1%”和转到参数集
    ECHO ffmpeg-i%parm1%%参数:~2,-2%%parmlast%
    后藤:EOF
    
    首先,将
    params
    设置为整个命令尾
    in.mpg“-vf”hqdn3d=0:0:4:0“-c:v h264”out.mp4
    set
    命令中的引号确保行上的尾随空格不包含在分配给变量的值中。)

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

    接下来我们有一个循环

    • “移动”参数的位置:#1被删除,#2变为#1和 等等
    • parmlast
      设置为结果#2参数
    • 检查
      parmlast
      是否有值。如果有,则继续移位直到没有
    %1
    现在必须具有最后一个参数,因此将其分配给
    parmlast
    并删除任何引号。
    parmlast
    获取值
    out.mp4

    使
    parm
    parm1
    so
    in.mpg

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

    接下来,使用一个类似的技巧,这次使用
    paramlast
    删除
    。从
    params
    末尾的mp4
    变为
    “-vf”hqdn3d=0:0:4:0“-c:v h264”


    最后一步-使用
    -i
    开关回显所需的
    ffmpeg
    行、
    parm1
    的值、
    params
    中的字符串减去前2个和最后2个字符(分别为空格和空格)并应用
    parmlast

    中的最后一个参数。我建议使用不同的注释方法。在另一个命令的同一行上使用REM非常混乱。我只会在您要注释的命令之前的行上使用
    ::comment
    ,甚至
    REM comment
    。我建议您使用单引号的方法,then替换双引号是最好的方法。但是,您真的需要替换掉单引号吗?您仍然可以使用单引号中的开关值调用ffmpeg命令吗?@Unclesmeat,执行后的注释供您的助手使用,但谢谢。不幸的是,无论ffmpeg是否接受单引号,此cmd字符串都是无效的Win的COMMAND.COM不接受。这会导致ffmpeg错误:1。
    [NULL@000000000 4BB96A0]无法为'-vf'hq n3d=0:0:4:0'-c:v h264'
    2。
    -vf'hqdn3d=0:0:4:0'-c:v h264:无效参数
    [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=我仍在研究你答案的第二种方法。我学到的唯一一件事是,双引号内参数旁边的单词被视为同一个参数<代码>回显。%%*=%params%
    用于(0,1,9)do中的/l%%n(
    调用集
    调用回显。%%%n=!\U pn!