首页/系统/Windows 运维速查/自动变量 $_ $? $LASTEXITCODE $Error
PowerShell 基础66 条

自动变量 $_ $? $LASTEXITCODE $Error

内置自动变量记录当前对象、上条命令成败、外部程序退出码与错误集合,是脚本判断与排错的核心抓手。

Windows 运维速查系统更新于 2026-10-13

自动变量是什么

PowerShell 在会话中始终维护一批内置变量,用来记录当前上下文与最近一次执行的结果:当前管道对象、上一条命令是否成功、外部程序的退出码、错误集合、空值等。它们不需要声明,随时可读。脚本里判断成败、记录失败原因、控制输出,几乎都依赖这几个变量。需要注意的是它们随时会被下一条语句覆盖,取值必须在产生结果的命令之后立刻进行,稍晚一步就会读到别人的值。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7 及以上
当前对象下划线占位符,指代管道中正在处理的对象
成败标记问号变量,值为真表示上一条命令执行成功
退出码外部程序退出码变量,仅由外部程序或脚本更新,0 表示成功
错误集合专用变量保存最近发生的错误对象,取第一个即最近一次错误
空值内置空值变量,用于比较与清空赋值

典型使用场景

  • 判断上一条命令是否成功,决定后续分支
  • 读取外部程序的退出码,判断批处理类工具的成败
  • 取最近的错误对象,输出异常信息用于排障与日志
  • 在管道脚本块里引用当前对象,做过滤与计算
  • 用空值变量做显式比较,避免与字符串空值混淆
  • 临时丢弃不需要的输出,保持控制台整洁

常用示例

常用示例
# 判断上一条命令是否成功
Get-Item D:\nope -ErrorAction SilentlyContinue
if (-not $?) { $Error[0].Exception.Message }
# 读取外部程序退出码
ping -n 1 127.0.0.1 > $null
$LASTEXITCODE
# 管道中的当前对象
Get-Process | ForEach-Object { $_.Id }
# 丢弃不需要的输出
Get-ChildItem D:\Logs > $null
# 显式比较空值
if ($null -eq $value) { '值为空' }
# 查看最近的错误对象
$Error[0] | Select-Object CategoryInfo, Exception

自动变量速查

变量含义取值时机
下划线占位符管道中的当前对象仅在脚本块内有效
问号变量上一条命令是否成功必须紧接该命令之后读取
退出码变量外部程序返回的退出码每次外部程序或脚本执行后更新
错误集合错误对象列表,索引 0 为最近一次发生错误后读取
空值变量表示空值可与任何对象比较,需放在左侧避免数组歧义
匹配变量最近一次正则匹配结果仅在匹配成功后可用
内部命令与外部程序的成败判断方式不同:前者看问号变量与错误集合,后者看退出码变量。把两者混用是脚本分支判断出错的常见原因。
比较空值时把空值变量写在左侧,可以避免右侧是数组时被当作集合过滤,从而出现看起来违反直觉的判断结果。

易错点

  • 晚一步读取成败标记:问号变量只反映最近一条命令,中间夹了别的语句就会失效
  • 用退出码变量判断内置命令:它只由外部程序或脚本更新,内置命令执行后其值可能还是上一条外部程序留下的
  • 把外部程序退出码一律按零判断:不少工具用非零表示正常结果,判断标准要按工具约定
  • 空值比较时把变量放在右侧:与数组比较会变成集合过滤,结果难以预期
  • 在脚本块外使用下划线占位符:它只在管道处理过程中有效,脚本语句里取到的是空值

数据来源与参考

  • Microsoft Learn:about_Automatic_Variables

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌