变量是任何编程语言的基础工具,在 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 | 上一个外部程序的退出码 |
$PSVersionTable | PowerShell 的版本信息 |
$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: 修改,并注意作用域和持久性 |
Write-Output $greeting0
Write-Output $greeting1
$env:
设置环境变量(临时)Write-Output $greeting2
注意:这种方式只在当前 PowerShell 会话中有效,关闭窗口后失效。
PowerShell 使用 $变量名
定义变量,类型自动推断
可存储任意数据类型,包括字符串、数组、哈希表、对象等
作用域控制变量的"生存范围",常用的有 Local
、Script
、Global
内置变量和环境变量非常实用,但要注意其作用域限制
任务 1:定义一个字符串变量 $title
并输出:
Write-Output $greeting3
任务 2:在函数中定义变量,并尝试在函数外访问
Write-Output $greeting4
任务 3:设置并读取环境变量 APP_ENV
Write-Output $greeting5