$Error 与异常排查是什么
PowerShell 把每次错误封成一条 ErrorRecord,滚动保存在自动变量 $Error 里,最新一条是 $Error[0]。它比屏幕上闪过的红字信息量大得多:除了消息文本,还带 CategoryInfo、TargetObject、InvocationInfo 与底层 Exception,能回答“哪个命令、对哪个对象、因为什么出错”。命令加 -ErrorVariable 还能把错误沉淀到自定义变量,再配合 -ErrorAction SilentlyContinue 实现“静默执行、事后检查”。
基本信息
| 适用平台 | PowerShell 5.1 / 7.x 通用 |
|---|---|
| 常用入口 | $Error[0]、$Error[0].Exception.Message、$Error[0].CategoryInfo |
| 容量 | 默认保留最近 256 条,可用 $MaximumErrorCount 调整 |
| 清空方式 | $Error.Clear() |
| 命令级参数 | -ErrorVariable ev 把错误存到变量;-ErrorAction 控制是否中断 |
| 配套参数 | $ErrorActionPreference 影响整个会话的默认行为 |
典型使用场景
- 交互式排查:命令报错后逐层展开 ErrorRecord 找真正原因
- 写脚本时把错误收集到变量,最后统一汇总上报
- 区分“命令失败”与“命令无输出”这两种看起来一样的情况
- 定位批量操作中具体哪一条执行失败
- 捕获 InvocationInfo 还原出错时的完整命令与位置
常用示例
常用示例
Get-ChildItem D:\nope # 故意制造一个错误
$Error[0].CategoryInfo # 看错误分类与目标对象
$Error[0].Exception.Message # 看底层异常消息
$Error[0].InvocationInfo.PositionMessage # 看出错时的命令上下文
$Error.Count # 当前累积了多少条错误
Get-Service nosuchsvc -ErrorVariable ev -ErrorAction SilentlyContinue; $ev | Select-Object -First 1 # 静默执行后检查
$Error.Clear() # 复查前先清空,避免误读旧记录ErrorRecord 关键字段
| 字段 | 含义 | 排查价值 |
|---|---|---|
| Exception.Message | 底层异常消息 | 常常比界面提示更具体 |
| CategoryInfo | 错误类别与目标对象 | 区分权限、参数、对象不存在 |
| TargetObject | 出错时操作的输入对象 | 批量场景定位到具体条目 |
| InvocationInfo | 出错命令与源位置 | 还原脚本哪一行触发 |
| FullyQualifiedErrorId | 错误标识串 | 搜索官方文档与社区最有效 |
$Error 是滚动列表,越早查看越准确:继续执行几条命令之后,$Error[0] 就已经不是你要找的那条了,排查前先清空或直接看 Count 变化。
错误被 try/catch 捕获后同样会进 $Error 列表,所以不能用“$Error 里有记录”来判断脚本是否失败;自动化判断要以退出码与 try/catch 的控制流为准。