Php 如何在Windows上正确转义shell参数?

Php 如何在Windows上正确转义shell参数?,php,windows,command-line,ffmpeg,Php,Windows,Command Line,Ffmpeg,我试图为命令行脚本正确转义用户提供的数据。通常我会使用,但是这根本不起作用,因为它以光荣的方式破坏了最终的命令行 该用例试图使用ffmpeg将元数据添加到视频中。一个简化且孤立的问题案例是以下命令: ffmpeg -i in.mp4 -metadata author="My Name" out.mp4 作者值由用户提供(My Name)。我尝试仅转义用户提供的部件,导致: ffmpeg -i in.mp4 -metadata author=""My Name"" out.mp4 这将导致以下

我试图为命令行脚本正确转义用户提供的数据。通常我会使用,但是这根本不起作用,因为它以光荣的方式破坏了最终的命令行

该用例试图使用ffmpeg将元数据添加到视频中。一个简化且孤立的问题案例是以下命令:

ffmpeg -i in.mp4 -metadata author="My Name" out.mp4
作者值由用户提供(
My Name
)。我尝试仅转义用户提供的部件,导致:

ffmpeg -i in.mp4 -metadata author=""My Name"" out.mp4
这将导致以下ffmpeg错误:

名称:无效参数

接下来,我尝试转义整个标志(
-metadata author=“My Name”
),结果是:

ffmpeg -i in.mp4 "-metadata author= My Name " out.mp4
-metadata "author= My Name "
-metadata "author= My  Name  " // it eats my quotes
“无法识别的选项‘元数据作者=我的姓名’

测试用例:

$flag = '-metadata author="%s"';

var_dump(sprintf($flag, escapeshellarg('My Name')));
var_dump(escapeshellarg(sprintf($flag, 'My Name')));
是否有任何东西可以正确地转义用户提供的数据,这样用户就不能将任意标志传递给我的命令,并且可以使ffmpeg高兴,而不必手动执行,从而有忘记某些内容并将其搞糟的风险

更新

我还尝试转义整个标志值,除非用户提供的部件中有双引号,否则该值有效:

$flag = 'author="%s"';

var_dump('-metadata ' . escapeshellarg(sprintf($flag, 'My Name')));
var_dump('-metadata ' . escapeshellarg(sprintf($flag, 'My "Name"')));
其结果是:

ffmpeg -i in.mp4 "-metadata author= My Name " out.mp4
-metadata "author= My Name "
-metadata "author= My  Name  " // it eats my quotes

假设
ffmpeg
使用Microsoft C运行时解析命令行(这可能取决于它的构建方式),您可以通过将引号加倍来嵌入引号,例如,
-metadata“author=My”Name“
。大多数其他字符在引号内已经是安全的。但是,与在命令行中包含用户提供的数据相比,使用命令行可能更安全、更简单。(正确的解决方案是使用库而不是可执行文件,但我不知道
ffmpeg
是否支持此功能。)