在空或单个项目完成时,PowerShell 自动完成脚本出现运行时错误
作者: VedantMadane创建于 2026年8月10日更新于 2026年8月10日
描述
Cobra 生成的 PowerShell 完成脚本在各种边缘情况中会出现运行时异常,原因是它如何解析和过滤完成输出数组($Out):
- 空输出时的 Null Pointer/MethodNotFound 异常: 如果命令执行返回没有输出(例如,如果 CLI 二进制文件崩溃、失败或仅返回没有完成项且 stdout 为空),则数组 $Out 为空。生成的脚本调用 $Out[-1].TrimStart(':'),而不检查 $Out 中是否包含任何元素。这会引发一个致命的 PowerShell 错误:
You cannot call a method on a null-valued expression.
- 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'.
- 相同字符串值的过滤冲突:
为了删除指令(例如
:4),脚本使用:
$Out = $Out | Where-Object { $_ -ne $Out[-1] }
而不是通过索引仅删除最后一个项,而是过滤出与最后一个项值匹配的所有项。如果命令合法地输出了与指令字符串匹配的完成项(例如,当标志或参数完成为字符串 :0 时),则会被错误地删除。
内容来源: spf13/cobra