#2481·cobra

在空或单个项目完成时,PowerShell 自动完成脚本出现运行时错误

作者: VedantMadane创建于 2026年8月10日更新于 2026年8月10日

描述

Cobra 生成的 PowerShell 完成脚本在各种边缘情况中会出现运行时异常,原因是它如何解析和过滤完成输出数组($Out):

  1. 空输出时的 Null Pointer/MethodNotFound 异常: 如果命令执行返回没有输出(例如,如果 CLI 二进制文件崩溃、失败或仅返回没有完成项且 stdout 为空),则数组 $Out 为空。生成的脚本调用 $Out[-1].TrimStart(':'),而不检查 $Out 中是否包含任何元素。这会引发一个致命的 PowerShell 错误:
You cannot call a method on a null-valued expression.
  1. System.Char 和 String 类型混淆: PowerShell 管道会自动将包含单个元素的数组解包为一个标量对象(例如 System.String)。在下一个执行阶段,查询 $Out[-1] 会返回一个 System.Char,而不是一个 System.String。由于 System.Char 没有 TrimStart 方法,调用它会引发:
Method invocation failed because [System.Char] does not contain a method named 'TrimStart'.
  1. 相同字符串值的过滤冲突: 为了删除指令(例如 :4),脚本使用:
$Out = $Out | Where-Object { $_ -ne $Out[-1] }

而不是通过索引仅删除最后一个项,而是过滤出与最后一个项值匹配的所有项。如果命令合法地输出了与指令字符串匹配的完成项(例如,当标志或参数完成为字符串 :0 时),则会被错误地删除。