首页/系统/Windows 运维速查/变量作用域与 script/global
PowerShell 基础66 条

变量作用域与 script/global

函数、脚本块与模块各有作用域:默认赋值只在当前作用域生效,跨作用域修改要显式加 scope 前缀。

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

概念是什么

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 语句共用父作用域,块内赋值会直接改到外层变量;这与函数的行为不同,是变量被意外修改的常见盲点。

易错点

  • 函数里写 $x = 1 只是局部赋值,外部 $x 不变,容易被误判为“改了没生效”
  • 管道脚本块与 foreach 语句共享父作用域,命名冲突会静默覆盖外层变量
  • $using: 只适用于远程与作业的脚本块,在本地普通脚本块里使用会报错
  • 滥用 $global: 会污染会话状态,脚本互相干扰且问题难以复现
  • 变量未初始化就直接累加,可能得到 $null 参与运算,结果与预期不符

数据来源与参考

  • Microsoft Learn:about_Scopes

相关工具

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