为什么PowerShell会删除我传给ffmpeg的参数中的第一个"-"?
为什么PowerShell会删除我传给ffmpeg的参数中的第一个"-"?
以下是我试图编写的一个简化版的PowerShell脚本,用于合并一些.mp4文件:
[string]$inputs = ""
$filenames = "input1.mp4", "input2.mp4", "input3.mp4"
foreach ($f in $filenames) {
$inputs += "-i $f "
}
Write-Host $inputs
.\bin\ffmpeg.exe $inputs -filter_complex...
"Write-Host"将字符串按预期打印出来,但是ffmpeg给我返回一个错误,错误信息如下:
Unrecognized option 'i input1.mp4 -i input2.mp4 -i input3.mp4 '.
Error splitting the argument list: Option not found
所以看起来当参数被传递给cmd.exe以传递给ffmpeg时,有些东西丢失了(至少我认为是这样)。我读过其他问题,讨论了在参数中传递双引号的问题,但我的问题是与“-”有关。有人能解释一下我的情况是怎么回事吗?我不认为这是一个转义问题,因为第二个和第三个“-”看起来是被传递的。另外,如果我只使用“start-process”和“-argumentList”选项(并事先准备一个大的“$arguments”字符串),那么一切都正常。
powershell剥离了我传递给ffmpeg的参数中的第一个"-"是因为我将多个参数作为单个字符串传递给了ffmpeg。解决方法是使用数组来传递多个参数。
在上述代码中,将输入文件名存储在一个数组中,并使用foreach循环将每个文件名添加到$inputs字符串中。然后,将$inputs字符串作为参数传递给ffmpeg。然而,由于多个参数被传递给了单个字符串,所以powershell剥离了第一个"-"。
要解决这个问题,可以将$inputs声明为一个数组,而不是一个字符串。然后,使用+=运算符将每个参数添加到数组中。最后,将数组作为参数传递给ffmpeg。
以下是修改后的代码:
[string[]]$inputs = @() $filenames = "input1.mp4", "input2.mp4", "input3.mp4" foreach ($f in $filenames) { $inputs += "-i" $inputs += $f } Write-Host $inputs .\bin\ffmpeg.exe $inputs -filter_complex...
通过将$inputs声明为一个字符串数组,并使用"-i"和文件名作为单独的元素添加到数组中,可以确保所有参数都被正确传递给ffmpeg,而不会被剥离掉。
问题的出现原因是使用PowerShell调用ffmpeg命令时,参数的拼接方式不正确,导致PowerShell自动对参数进行了引号处理,使得ffmpeg解析参数时出现了问题。解决方法是将参数名和参数值作为数组的独立元素传递给命令,而不是使用字符串拼接。
具体的解决方法如下所示:
$filenames = "input1.mp4", "input2.mp4", "input3.mp4" $inputs = foreach ($f in $filenames) { '-i', $f } .\bin\ffmpeg.exe $inputs -filter_complex...
通过以上代码,我们将参数名和参数值分别作为数组元素传递给了ffmpeg命令,而不是使用字符串拼接。这样PowerShell会自动根据空格进行参数拼接,并在需要的情况下添加引号。这样就避免了参数被错误解析的问题。
至于你之前尝试的方法,你将所有的参数拼接成了一个字符串`$inputs`,PowerShell将其视为一个单独的参数传递给了ffmpeg命令。由于该字符串包含了空格,PowerShell对其进行了引号处理,导致最终的命令行变为`.\bin\ffmpeg.exe "-i input1.mp4 -i input2.mp4 -i input3.mp4" -filter_complex...`。由于被引号包裹的字符串在ffmpeg中被视为一个参数,因此ffmpeg会将第一个连字符去除,并将`i input1.mp4 -i input2.mp4 -i input3.mp4`作为参数名进行解析。