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和 等等
- 将
设置为结果#2参数parmlast
- 检查
是否有值。如果有,则继续移位直到没有parmlast
%1
现在必须具有最后一个参数,因此将其分配给parmlast
并删除任何引号。parmlast
获取值out.mp4
使parm
与parm1
soin.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!
)