自动变量是什么
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 为最近一次 | 发生错误后读取 |
| 空值变量 | 表示空值 | 可与任何对象比较,需放在左侧避免数组歧义 |
| 匹配变量 | 最近一次正则匹配结果 | 仅在匹配成功后可用 |
内部命令与外部程序的成败判断方式不同:前者看问号变量与错误集合,后者看退出码变量。把两者混用是脚本分支判断出错的常见原因。
比较空值时把空值变量写在左侧,可以避免右侧是数组时被当作集合过滤,从而出现看起来违反直觉的判断结果。