You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中如何从单个字符串向可执行文件传递多个参数?

问题描述

现有如下PowerShell脚本:

# 这些实际作为cmdlet参数传入脚本
$FFmpegPath = "ffmpeg"
$Args = "-i MyInput.mp4 MyOutput.webm"

& $FFmpegPath $Args

预期执行的命令是ffmpeg -i MyInput.mp4 MyOutput.webm,但FFmpeg报错无法解析参数。通过Process Hacker查看发现,PowerShell实际执行的是ffmpeg "-i MyInput.mp4 MyOutput.webm"——整个参数字符串被当成单个参数传递,导致FFmpeg无法识别。

需要解决的是:如何将整个参数字符串按照常规参数分隔规则(空格分隔参数,内部转义引号保留并阻止空格成为分隔符)拆分为独立参数传递给程序?

解决方案

PowerShell直接传递字符串变量给外部程序时,会把整个字符串作为单个参数处理。要正确拆分参数,可使用以下几种方法:

方法1:使用Invoke-Expression(注意风险)

若参数字符串来源可信,可直接拼接命令并执行,PowerShell会自动按规则拆分参数:

Invoke-Expression "$FFmpegPath $Args"

⚠️ 注意:如果$Args包含不可信内容,这种方式可能带来安全风险,需谨慎使用。

方法2:用PSParser安全拆分参数

这是更可靠的方式,能遵循PowerShell的参数解析规则,正确处理带引号的含空格参数:

$tokens = @()
$errors = @()
[System.Management.Automation.PSParser]::Tokenize($Args, [ref]$tokens, [ref]$errors)
$splitArgs = $tokens | Where-Object { $_.Type -in 'CommandArgument', 'CommandParameter' } | Select-Object -ExpandProperty Content

& $FFmpegPath $splitArgs

比如参数里有"-i "My Video.mp4""这类带空格的路径,该方法也能正确识别为单个参数。

方法3:简单场景下手动拆分

如果参数中没有带引号的含空格内容,可直接用-split拆分:

$splitArgs = $Args -split '\s+'
& $FFmpegPath $splitArgs

这种方式无法处理带引号的复杂参数,仅适用于简单场景。

内容的提问来源于stack exchange,提问作者Kotauskas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:48:14