概念是什么
PowerShell 的变量作用域按容器分层:全局、脚本、函数与脚本块各自成域。默认赋值只影响当前作用域,父作用域的变量可读不可写;要跨层修改必须显式加作用域前缀或使用 Set-Variable -Scope。远程执行与后台作业还有专用的 $using: 前缀用于引用调用方变量。
基本信息
| 适用平台 | PowerShell 3.0 及以后($using: 需 3.0+,远程与作业均可) |
|---|---|
| 语法 | $script:x、$global:x、$env:x、$using:x |
| 核心规则 | 读父级变量可直接引用;写父级变量需作用域前缀 |
| 相关命令 | Set-Variable -Scope、Get-Variable -Scope |
典型使用场景
- 脚本里的函数需要累加统计量,用 $script: 让计数在多次调用间保留
- 模块内需要对外暴露配置项,用 $global: 显式声明
- 远程执行或 Start-Job 时把本地变量传进去,用 $using:
- 排查“赋值了却看不到效果”,先确认是否落在子作用域
- 避免污染会话:临时变量不要声明成全局
常用示例
常用示例
$script:total = 0 # 声明为脚本级变量
function Add-One { $script:total += 1 }
Add-One
$total # 1:函数内的修改对脚本层可见
function NoScope { $local = 5 } # $local 只在函数作用域内存在
NoScope
# 后台作业或远程执行中引用调用方变量
$name = 'srv01'
Start-Job { "目标: $using:name" }作用域前缀读法
| 前缀 | 作用范围 | 典型用途 |
|---|---|---|
| 无前缀 | 当前作用域 | 函数内部的临时变量 |
| $local: | 当前作用域 | 显式声明,消除歧义 |
| $script: | 当前脚本文件 | 函数之间共享状态 |
| $global: | 整个会话 | 配置项与跨脚本共享数据 |
| $env: | 进程环境变量 | 系统路径与外部程序配置 |
| $using: | 调用方作用域 | 远程与作业中引入本地变量 |
脚本内函数要修改外部变量,最常用的就是 $script:;远程执行与后台作业引用本地变量用 $using:,它只在脚本块开始执行时被求值一次。
管道脚本块(ForEach-Object { })与 foreach 语句共用父作用域,块内赋值会直接改到外层变量;这与函数的行为不同,是变量被意外修改的常见盲点。