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
相关产品推荐
相关产品推荐

