将参数字符串转换为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`:直接调用可以并且更可取(这本身就涉及单独传递参数)。

以上是将参数字符串转换为Here字符串的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>