PowerShell 变量和作用域

变量是任何编程语言的基础工具,在 PowerShell 中也不例外。

我们可以用变量存储数字、字符串、对象、数组、哈希表……而真正让 PowerShell 变量变得强大的,是它的 作用域机制。理解作用域,可以让你写出更稳定、结构更清晰的脚本,避免变量冲突或意外覆盖。

本节将带你全面认识 PowerShell 中变量的使用方式、数据类型、作用域规则以及最佳实践。


一、变量基础

定义变量

在 PowerShell 中,变量以美元符号($)开头,后跟变量名。

$greeting = "Hello, PowerShell"$number = 100

变量赋值不需要事先声明类型,PowerShell 会自动推断数据类型。

读取变量

直接引用变量即可读取其值:

Write-Output $greeting

还可以插入到字符串中:

Write-Output "提示信息:$greeting"

如果字符串使用单引号,则不会解析变量:

Write-Output '提示信息:$greeting'   # 输出字面值

查看变量类型

$number.GetType()

常见变量类型举例

示例类型示例值
$str = "abC++"字符串(String)"abc"
$num = 123整数(Int32)123
$arr = 1, 2, 3数组(Array)[1, 2, 3]
$obj = Get-Process对象集合(Object[])进程列表
$hashtable = @{}哈希表(Hashtable)@{Name="Tom";Age=30}

二、特殊变量


PowerShell 预定义了许多有用的内置变量:

变量名描述
$_管道中当前处理的对象
$?上一个命令是否成功
$LASTEXITCODE上一个外部程序的退出码
$PSVersionTablePowerShell 的版本信息
$env:PATH环境变量 PATH

三、变量作用域概念

什么是作用域?

作用域(Scope) 指变量在何处有效。PowerShell 支持多个作用域层级,确保变量不会被无意中覆盖。

常见作用域包括:

作用域描述
Global全局作用域,脚本或 shell 的顶层作用域
Local当前函数或代码块中的变量(默认作用域)
Script当前脚本文件中有效的变量
Private当前作用域内有效,外部无法访问

示例演示:变量作用域差异

$global:name = "Tom"       # 全局变量$name = "Alice"            # 本地变量function Show-Name {
    $name = "Bob"          # 函数内的局部变量
    Write-Output "函数内部:$name"}Show-NameWrite-Output "函数外部:$name"Write-Output "全局变量:$global:name"

输出结果:

函数内部:Bob函数外部:Alice全局变量:Tom

显式设置作用域

你可以在变量名前加作用域标识符来明确变量的可见范围:

$script:dbName = "MyDatabase"  # 仅对当前脚本可见$global:apiKey = "abcdef12345" # 对所有位置可用

查看当前作用域中的变量

Get-Variable

或者列出全局变量:

Get-Variable -Scope Global

四、常见错误与注意事项

问题情况原因与建议
函数内设置的变量外部无法访问没有使用 global: 或 script: 显式声明
同名变量被覆盖建议用作用域前缀区分重要变量
环境变量修改未生效请使用 $env: 修改,并注意作用域和持久性

五、实践示例

示例 1:创建一个函数并使用全局变量作为配置

Write-Output $greeting0

示例 2:函数中定义变量对外不可见(局部作用域)

Write-Output $greeting1

示例 3:使用 $env: 设置环境变量(临时)

Write-Output $greeting2

注意:这种方式只在当前 PowerShell 会话中有效,关闭窗口后失效。


六、小结

  • PowerShell 使用 $变量名 定义变量,类型自动推断

  • 可存储任意数据类型,包括字符串、数组、哈希表、对象等

  • 作用域控制变量的"生存范围",常用的有 LocalScriptGlobal

  • 正确理解作用域有助于编写结构清晰可维护性强的脚本

  • 内置变量和环境变量非常实用,但要注意其作用域限制


七、练习任务

任务 1:定义一个字符串变量 $title 并输出:

Write-Output $greeting3

任务 2:在函数中定义变量,并尝试在函数外访问

Write-Output $greeting4

任务 3:设置并读取环境变量 APP_ENV

Write-Output $greeting5