将参数字符串转换为Here字符串
我想用 Start-Process 和 -Wait 调用 ffmpeg,$ArgumentList 有问题
function convertgif {
$ArgumentList = @'
-i $($args[0]) -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" "$([IO.Path]::ChangeExtension($args[0], 'mp4'))"
'@
Start-Process -FilePath "C:ffmpegbinffmpeg.exe" -ArgumentList $ArgumentList -Wait -NoNewWindow;
}
我找不到如何修复错误
$args[0]: No such file or directory
回答
你不想要一个“here-string”,你想要一个可以用空格连接的数组
function convertgif {
$ArgumentList = @(
"-i"
'"' + $args[0] + '"'
"-movflags"
"faststart"
"-pix_fmt"
"yuv420p"
"-vf"
'"scale=trunc(iw/2)*2:trunc(ih/2)*2"'
'"' + [IO.Path]::ChangeExtension($args[0], 'mp4') + '"'
)
Start-Process -FilePath "C:ffmpegbinffmpeg.exe" -ArgumentList $ArgumentList -Wait -NoNewWindow;
}
在这种情况下,"-movflags"和"faststart"是两个独立的论点,尽管从 ffmpeg 的角度来看,它们属于一起。但这纯粹是 ffmpeg 如何解析其参数的语义细节,PowerShell(或 Windows,就此而言)并不关心这一点。
当然,您是否决定通过单独给予"-movflags"和"faststart"单独形成最终结果还是由您决定"-movflags faststart"。
- 虽然在理想的世界中单独传递参数无疑是更可取的,但不幸的是,[长期存在的错误](https://github.com/PowerShell/PowerShell/issues/5576) 使将所有参数编码在 _single 字符串中会更好_ - 参见 [这个答案](/sf/answers/4394922591/)。解决 OP 的直接问题所需要做的就是从 _single_-quoted here-string 切换到 _double_-quoted 字符串。但最终根本没有理由使用 `Start-Process`:直接调用可以并且更可取(这本身就涉及单独传递参数)。