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

PowerShell中调用运算符(&)传递字符串参数失效问题

解决PowerShell中mkvmerge动态参数传递问题

问题根源

直接将参数拼接成字符串传递给&调用运算符时,PowerShell会把整个字符串当作单个参数传给mkvmerge,而非拆分成独立选项。即便手动添加引号,PowerShell也不会二次解析拆分,导致mkvmerge无法识别正确的参数结构。

正确解决方案:用数组存储并传递参数

调用运算符&支持直接展开数组(用@运算符),数组的每个元素会被当作独立参数传递给程序,完全复刻硬编码参数的效果。以下是修改后的完整代码:

$mkvmerge = "C:\Program Files\MKVToolNix\mkvmerge.exe"
$applyoptions = $true
$subtitleformat = "srt"
$isolanguage = "eng"
$subtitledefault = "yes" # 补充原代码未显式声明的变量

foreach ($file in Get-ChildItem -File -Include *.mkv) {
    # 初始化参数数组
    $mkvmergeparams = @()

    # 动态添加@options.json参数
    if ($applyoptions) {
        $mkvmergeparams += '@options.json'
    }

    # 添加输出文件参数
    $outputFile = Join-Path $file.DirectoryName "Remux-$($file.BaseName).mkv"
    $mkvmergeparams += '-o', $outputFile

    # 添加输入MKV文件
    $mkvmergeparams += $file.FullName

    # 添加字幕相关参数
    if ($subtitleformat) {
        $subtitleFile = Join-Path $file.DirectoryName "$($file.BaseName).$subtitleformat"
        $mkvmergeparams += '--default-track', $subtitledefault, '--language', "0:$isolanguage", $subtitleFile
    }

    # 打印参数数组(可选,用于调试)
    $mkvmergeparams

    # 调用mkvmerge,用@展开数组
    & $mkvmerge @mkvmergeparams
}

Read-Host -Prompt "Press enter to exit"

关键细节说明

  • 数组元素独立存储:每个参数(比如-o、输出路径、输入文件)都作为数组的单独元素,避免把多个参数塞进同一个字符串里。
  • 无需手动加引号:PowerShell会自动处理含空格的路径,不需要在参数中添加"或转义字符。
  • 用Join-Path构建路径:比手动拼接字符串更可靠,避免因路径分隔符或特殊字符导致的错误。
  • @运算符展开数组:& $mkvmerge @mkvmergeparams会把数组拆分成多个独立参数,和硬编码调用的效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:15:32