PowerShell 环境变量
Aug 25, 2025
PowerShell 环境变量以键值对形式存储系统和用户配置,并且可在不同进程与脚本中访问。可以使用 Get-ChildItem Env: 列出,通过 $Env:<Name> 进行访问,通过 Set-Item 或 [Environment]::SetEnvironmentVariable() 进行修改,并通过 Remove-Item 移除。变量存在于进程、用户或计算机(机器)作用域中;只有在用户或机器级别定义时,变更才会持续生效。最佳实践包括:限制作用域、避免硬编码机密、为变量编写文档,并在安全的前提下测试变更。
PowerShell 环境变量简介
环境变量是操作系统中预定义的变量,它们以键值对的形式提供,用于存储重要的系统级或用户特定信息,例如路径、用户配置和系统设置。这些变量可以在 PowerShell 脚本和会话中访问,在诸如配置软件、调整系统路径以及管理用户特定设置等任务中发挥重要作用。它们的功能类似全局变量,可在整个操作系统和脚本环境中访问。虽然 PowerShell 允许轻松操作这些变量,但在修改或删除时必须谨慎,因为不正确的更改可能导致系统不稳定或应用程序失败。比如,PATH 变量用于存储包含可执行文件的目录,它对系统定位并执行命令至关重要。
列出 PowerShell 环境变量
在 PowerShell 中,列出所有环境变量最直接的方法之一是使用带有“Env:”驱动器的 Get-ChildItem cmdlet。该命令允许用户以清晰有序的格式访问并显示环境变量存储库中的内容。
要列出 PowerShell 会话中可用的所有环境变量,只需执行以下命令即可。
Get-ChildItem Env:
输出通常会包含大量环境变量,其中有些可能是你熟悉的。
- PATH:用于存放可执行文件的目录列表。
- TEMP: 临时文件存储目录的路径。
- USERPROFILE: 当前用户配置文件目录的路径,例如 C:\Users\Administrator.Milkyway。
- COMPUTERNAME: 计算机名称。
- OS: 操作系统名称,例如 Windows_NT。
- HOMEPATH: 用户的主目录。
访问并打印环境变量
要实现这一点,主要有两种方法:使用 “$Env:<variable-name>” 语法,或结合变量名使用 “Get-ChildItem” cmdlet。例如,如果你想访问 USERNAME 变量,你可以在 PowerShell 中使用下面的命令来获取环境变量。
$Env:USERNAME
只需执行此命令,控制台就会打印已登录用户的名称。
第二种方法是使用 Get-ChildItem cmdlet。你可以像下面这样指定要检查的环境变量。
(Get-ChildItem Env:USERNAME).Value
您可以使用相同的方法来输出其他环境变量,例如 PATH、COMPUTERNAME、USERPROFILE 或 TEMP。
$Env:Path
(Get-ChildItem Env:Path).Value
设置 PowerShell 环境变量
创建或更新环境变量的过程很简单,可以使用以下语法来完成。
$Env:<variable-name> = “<value>”
面向初学者的 Windows PowerShell 脚本教程(PDF)
了解更多创建环境变量
创建新的环境变量就像把一个值赋给变量名一样简单。例如,如果你想创建一个名为“Foo”的环境变量并将其设置为特定值,可以使用以下命令。
$Env:Foo = “Hello”
您可以使用下面的 cmdlet 来访问该变量,从而确认它已正确设置。
$Env:Foo
更新环境变量
如果变量“Foo”已经存在,并且您希望更新其值,则可以使用相同的语法。
$Env:Foo = “NewValue”
可以按如下方式检查变量的值。
$Env:Foo
需要注意的一点是,使用 $Env: 前缀对环境变量所做的更改只会在当前 PowerShell 会话的持续时间内生效。关闭会话后,在该会话中创建或修改的任何自定义环境变量都会丢失。如果你需要创建或更新在会话结束后仍然保持不变的环境变量,则需要使用 “SetX” 命令,它允许在用户或系统级别定义环境变量。例如,要创建一个名为 “Foo” 的永久环境变量,并赋予相同的值,可以使用下面的 cmdlet。
SetX Foo “MyVariableValue”
你可以通过进入“系统属性”→“高级”选项卡→“环境变量”→“为当前用户的用户变量”来检查永久变量。
向现有环境变量追加值
在 PowerShell 中向现有环境变量追加值,当你希望在不覆盖其现有值的情况下扩展当前配置时会很有用。一个常见的场景是 PATH 环境变量:你可能希望为可执行文件添加额外的目录。在 PowerShell 中,“+=”运算符可以无缝完成这一操作;该运算符专门用于向变量追加值。
例如,如果你想把新的目录追加到 `Path` 环境变量中,可以使用以下命令。
$Env:Path += “;C:\Test\SecurityService”
分号( ; )之所以重要,是因为它在 PATH 变量中充当各个独立路径之间的分隔符。没有它的话,新路径会直接与现有路径拼接在一起,从而可能导致意外结果。要验证该值是否已成功追加,可以使用下面的 cmdlet 输出更新后的变量。
$Env:Path
PowerShell 环境变量的作用域
理解 PowerShell 环境变量的作用域对于有效的脚本编写和系统配置非常重要。环境变量可以存在于不同的作用域中,这些作用域会决定它们在不同上下文中的可用性和生命周期。
对环境变量的“机器(machine)”“用户(user)”和“进程(process)”作用域进行说明。
环境变量的三个主要作用域分别是 machine(计算机)、user(用户)和 process(进程)。每个作用域在可访问性与继承规则方面都有自己的规定,这会显著影响脚本和应用程序的行为方式。
Machine 作用域
Machine 作用域的环境变量是适用于计算机上所有用户和正在运行的进程的系统级变量。这些变量通常由操作系统或管理员设置,并且在会话和重新启动后仍会保持不变。要访问或修改 Machine 作用域的环境变量,你需要具有管理员权限。
User 作用域
另一方面,User 作用域的环境变量是特定于各个用户个人资料的,并且对在该用户资料下运行的所有进程可见。这些变量是持久性的,但仅对创建它们的用户可用;同时无需管理员权限也可以对其进行修改。如果某个用户设置了一个 User 作用域的变量,那么同一台机器上的其他用户将无法访问它。
进程作用域
进程作用域的环境变量只存在于创建它们的那个进程或会话实例中。它们是临时的,进程结束后就会消失。该作用域通常用于脚本和应用程序:你希望仅在执行期间才适用的设置就可以在这里定义。
环境变量如何被子进程继承
环境变量会从父进程继承到子进程。这意味着:如果你在 PowerShell 会话中创建环境变量(进程作用域),那么从该会话启动的任何外部应用程序或脚本都会继承该变量。 如果你设置用户级环境变量(例如 MY_USER_VAR),它会在不同的 PowerShell 会话之间保持不变,并且在该用户下启动的任何进程都会继承其值。 如果你设置的是全局机器变量(例如 MY_MACHINE_VAR),它将被系统中的每个用户继承,并且所有进程都将能够访问该变量。
在不同平台上修改环境变量
在修改环境变量时,不同操作系统之间的做法可能差异很大,尤其是在 Windows 与 macOS 和 Linux 等类 Unix 系统之间。这种差异包括语法、大小写敏感性以及用于修改的可用命令等方面。
macOS/Linux 与 Windows 的大小写敏感性。
操作系统之间的关键差异之一在于:它们如何处理环境变量名称的大小写敏感性。
Windows
Windows 中的环境变量名称不区分大小写。例如,PATH、Path 和 path 都指向同一个环境变量。这意味着你可以在不担心命令中大小写写法的情况下引用或修改这些变量。
macOS/Linux
类 Unix 系统在环境变量名称方面区分大小写。因此,PATH 和 path 会被识别为两个不同的变量。这意味着在处理环境变量时,脚本或命令必须使用完全一致的大小写,以避免混淆或错误。
临时与永久环境变量
PowerShell 中的环境变量可以根据其设置方式以及更改的作用域,被分为临时或永久两类。理解这两种环境变量的区别对于管理配置以及确保变量在会话或系统重启后仍能保留非常重要。
临时变量在 PowerShell 会话中的工作方式
临时环境变量仅在当前 PowerShell 会话的上下文中定义并使用。这些变量可以使用 $Env: 前缀创建和修改。关闭 PowerShell 会话后,任何临时变量都会丢失,并且其值不会保留到后续会话中。临时变量在需要为当前会话快速配置且不影响全局或用户特定设置时尤其有用。
持久环境变量
持久环境变量存储在系统配置中,即使你关闭并重新打开 PowerShell 或重启计算机,它们也会保持可用。要在 PowerShell 中创建或修改持久环境变量,你可以使用 .NET 的“System.Environment”类。
添加或修改持久环境变量的语法如下。
[Environment]::SetEnvironmentVariable(‘VariableName’, ‘Value’, ‘Scope’)
Scope 参数可以是三个值之一:Machine、User 或 Process。
例如,要创建一个名为“Foo”、值为“Bar”的持久性用户作用域环境变量,你可以运行以下命令。
[Environment]::SetEnvironmentVariable(‘Foo’, ‘Bar’, ‘User’)
如果要设置机器作用域变量,就需要运行下面的命令。
[Environment]::SetEnvironmentVariable(‘Foo’, ‘Bar’, ‘Machine’)
上述命令将需要管理员权限,因为面向机器的更改会影响系统上的所有用户。
GetEnvironmentVariable() 方法用于显示环境变量的值。您可以指定环境变量的名称。下面是一个示例 cmdlet。
[System.Environment]::GetEnvironmentVariable(‘Foo’)
可能需要验证上述命令的作用范围
使用 Environment Provider 和 Item Cmdlet
使用环境提供程序将环境变量作为文件系统驱动器来管理
PowerShell 提供了一个环境提供程序,可将环境变量视为文件系统驱动器,从而让用户能够像管理文件和目录一样管理环境变量。 Env: 在 PowerShell 中的驱动器可用于访问环境变量。每个环境变量都会被视为 Env: 驱动器中的一个项,你可以使用标准的 cmdlet 与这些变量进行交互。下面概述了用于与环境提供程序配合的关键 cmdlet,例如 New-Item、Set-Item、Get-Item 和 Remove-Item。
New-Item
可以按照下面的示例语法和 cmdlet,使用 New-Item cmdlet 来创建新的环境变量。
New-Item -Path Env:MY_NEW_VAR -Value “MyValue”
New-Item -Path Env: -Name “MyVariable” -Value “HelloWorld”
此命令会创建一个新的环境变量,并使其在当前会话期间可用。
Set-Item
如果你想更新现有环境变量的值,或在它尚不存在时创建它,可以使用下面示例中的 Set-Item cmdlet。
Set-Item -Path Env:MY_NEW_VAR -Value “UpdatedValue”
Set-Item -Path Env:MyVariable -Value “NewValue”
此命令将把环境变量的值设置为新值。如果变量不存在,此命令会使用指定的值创建它。
Get-Item
要检索现有环境变量的值,可以按照下面的示例 cmdlet 使用 Get-Item cmdlet。
Get-Item -Path Env:MY_NEW_VAR
Get-Item -Path Env:MyVariable
这将返回一个对象,用于表示环境变量,包括其名称以及分配给它的值。
Remove-Item
要删除现有的环境变量,可以使用 Remove-Item cmdlet。
Remove-Item -Path Env:MY_NEW_VAR
Remove-Item -Path Env:MyVariable
此命令将从环境变量中移除变量。你可以使用 Get-Item cmdlet 来进行验证。需要注意的是,一旦移除了该变量,除非重新创建,否则无法恢复。
常见的 PowerShell 环境变量
PowerShell 有若干关键环境变量会影响其行为和配置。这些变量用于配置 PowerShell 的运行方式、它在哪里查找模块和脚本,以及一些用户偏好设置。下面列出了一些在 PowerShell 中常用的关键环境变量。
POWERSHELL_TELEMETRY_OPTOUT
此环境变量用于控制 PowerShell 是否将遥测数据发送到 Microsoft。将该变量设置为 1 时,PowerShell 将选择退出向 Microsoft 发送使用数据和崩溃报告。默认情况下,PowerShell 会出于改进目的发送匿名使用数据,但你可以选择退出。
POWERSHELL_DISTRIBUTION_CHANNEL
指定安装 PowerShell 所使用的分发渠道。这有助于识别 PowerShell 是否通过 Windows 包管理器(winget)、MSI 或其他包管理器安装。这样 Microsoft 就能跟踪哪些渠道使用得最多。
POWERSHELL_UPDATECHECK
此环境变量用于控制 PowerShell 是否会自动检查更新。如果设置为 1,PowerShell 将检查与外壳(shell)相关的更新。如果设置为 0,则会禁用自动更新检查。这有助于管理 PowerShell 如何处理更新。
PSExecutionPolicyPreference
此环境变量用于指定运行脚本时要使用的默认 PowerShell 执行策略。若已设置,它将覆盖通过 Set-ExecutionPolicy 配置的执行策略。例如将其设置为 RemoteSigned,意味着只有本地创建的脚本才能在无需签名的情况下运行。
PSModulePath
此变量包含 PowerShell 模块存储位置及从中加载的路径。它是一个以冒号分隔的目录列表,PowerShell 会在这些目录中搜索以查找模块。你可以修改该变量以为自定义模块加入额外的目录。
PSModuleAnalysisCachePath
该变量用于指定 PowerShell 存储模块分析缓存的路径。PowerShell 会使用模块分析在加载模块时优化性能,而缓存会保存对模块进行解析后的元数据。设置自定义路径可以将该缓存位置重定向到其他位置。
PSDisableModuleAnalysisCacheCleanup
如果将此变量设置为 1,PowerShell 将禁用对模块分析缓存的自动清理。默认情况下,PowerShell 会自动清除未使用的分析缓存以节省磁盘空间,但可以将该变量设置为以阻止此操作。
还有一些其他环境变量可用于通过 PowerShell 配置你的环境或检索与系统相关的信息。其中部分已经在上面的这篇博客中提到过了,下面是一些更常见的环境变量。
- USERNAME:返回当前用户的用户名。
- ProgramFiles: 指向“Program Files”目录,通常为 C:\Program Files。
- ProgramFiles(x86): 指向“Program Files (x86)”目录,通常用于 64 位系统上的 32 位应用程序。
- ALLUSERSPROFILE: 指向所有用户的配置文件目录(通常为 C:\ProgramData)。
- WINDIR: 指向 Windows 目录(通常为 C:\Windows)。
通过控制面板管理环境变量
你可以直接通过 Windows 控制面板设置或修改环境变量。按照以下步骤操作,你就能轻松通过 Windows 控制面板管理环境变量,并根据需要自定义系统设置。
- 按下“Windows + R”打开“运行”对话框。输入“control”,然后按 Enter 打开控制面板;或者在开始按钮旁边的搜索栏中搜索“control panel”,并选择它。
- 在控制面板中,单击“System”。在左侧边栏中,单击“Advanced system settings”。
- 在“System Properties(系统属性)”窗口中,单击右下角的“Environment Variables*”按钮。
- 在“Environment Variables”窗口中,你会看到两个部分:“User variables”(用于当前用户)和“System variables”(用于所有用户)。
- 要创建新的变量,请在相应部分下单击“新建(New)”。
- 要编辑现有变量,请在列表中选择该变量,然后单击“编辑(Edit)”。
- 要删除变量,请选中它,然后单击“删除(Delete)”。
- 如果正在创建或编辑变量,请在相应字段中输入“变量名称(Variable name)”和“变量值(Variable value)”。对于像 Path 这样的变量,你可以通过使用分号分隔来添加新的路径。下面是 PATH 变量的截图。
- 完成更改后,单击“确定(OK)”以关闭每个对话框并保存您的修改。
- 为使更改生效,您可能需要重新启动任何已打开的应用程序或命令提示符。
PowerShell 环境变量常见问题的排查
PowerShell 中的环境变量可能比较难处理,尤其是在处理作用域(scopes)、持久性(persistence),或尝试设置无效值时。下面列出了一些用户在使用环境变量时常遇到的问题。
将环境变量设置为空字符串
当您尝试将环境变量设置为一个空字符串时,可能看不到预期的行为。它可能不会清除该变量,而是仍然保留先前的值。将环境变量设置为空字符串并不会移除它,只是为其赋予一个空值。要彻底移除环境变量而不是将其设置为空字符串,您可以使用 Remove-Item cmdlet。
为设置环境变量使用了不正确的作用域
设置环境变量时,如果指定了错误的作用域(用户 vs. 进程 vs. 计算机),该变量可能不会在你预期的地方可用。要为用户或系统作用域永久设置该变量,你可以使用下面的 cmdlet。
[System.Environment]::SetEnvironmentVariable(‘Variable’, ‘Value’, ‘scope’)
设置环境变量后更改未生效
修改环境变量后,你可能会发现更改不会立即反映到子进程或其他应用程序中。环境变量会在进程中进行缓存。当你在一个会话中修改环境变量时,其他会话可能要等到重新启动后才会看到该更改。为确保其他应用程序能看到更改,请重新启动它们。在某些情况下,为了让应用程序获取到更改,可能需要重新启动系统。
设置系统变量时的权限错误
尝试设置系统级环境变量时,可能会遇到“access denied”错误。修改系统环境变量通常需要管理员权限。请以管理员身份运行 PowerShell。
变量无法跨会话保留
您设置了环境变量,希望它在不同会话中保持不变,但它消失了。
如果变量仅使用“$env:”在当前会话中设置,那么在关闭 PowerShell 后它不会保留。请确保使用 System.Environment 类或注册表编辑器在用户级或系统级设置该变量。
大小写敏感性不匹配
在 Windows 上,环境变量名称不区分大小写,但在使用跨平台脚本时(例如在 Linux 或 macOS 上的 PowerShell Core),可能会遇到大小写敏感性问题。编写将在多个平台上运行的脚本时,请确保在环境变量名称上始终使用正确的大小写。
管理环境变量的最佳实践
有效地管理环境变量对于在 PowerShell 中维持稳定且高效的工作环境至关重要。下面是一些在不同平台上高效使用环境变量的最佳实践。
使用描述性名称
为环境变量选择清晰且具有描述性的名称,以便轻松识别。例如,用 MY_APP_CONFIG_PATH 代替像 CONFIG_PATH 这样含糊的名字。这样他人(以及未来的你)更容易理解该变量的作用。另一个例子是:不要使用“Var_Database”,而应使用更具描述性的“DatabaseConnectionString”。
适当限制作用域
了解环境变量的不同作用域(进程、用户、计算机),并根据需求设置合适的作用域。将变量限制在所需的最小作用域内,以避免潜在冲突。临时变量或仅适用于当前会话的变量使用进程作用域。需要在跨会话期间对当前用户可用,但不能对其他用户生效的变量使用用户作用域。对所有用户和进程都应可访问的系统级配置使用计算机作用域,例如数据库连接字符串或系统级配置文件。
对变量进行文档说明
在文档文件中或脚本注释里说明每个环境变量的用途、使用方式以及任何依赖关系。这样将来他人或你自己更容易理解你的配置。
避免将敏感数据进行硬编码
与其将 API 密钥、密码或其他数值等敏感信息硬编码到脚本中,不如使用环境变量,使脚本更灵活、更易移植。这样,同一个脚本就可以在不同配置的不同机器上运行。
检查是否已存在变量
在创建新的环境变量之前,请先检查它是否已经存在,以避免意外覆盖。这可以确保你的脚本或应用程序不会因为缺少环境变量而失败。
使用配置文件脚本以实现持久性
如果希望某些环境变量在多个会话之间保持持久性,请考虑将它们放入你的 PowerShell 配置文件中。这样,每次你打开新的 PowerShell 会话时,它们都会被自动设置。
清理未使用的环境变量
移除未使用的环境变量,以防止杂乱并避免潜在冲突,尤其是在长时间运行的会话或大型系统中。你可以使用 PowerShell 的 Remove-Item cmdlet 来删除环境变量。这有助于保持环境整洁,并避免意外使用过期或不相关的变量。
在安全的环境中测试
在对关键环境变量进行更改之前,尤其是在生产环境中,请先在开发或预发布(staging)环境中进行测试,以避免中断。
修改路径(Path)时要小心
修改 PATH 变量时,请确保不会无意中删除重要路径。请始终使用追加(+=)而不是覆盖(=),并在必要时备份现有的 PATH。
考虑跨平台兼容性
如果你的脚本将在不同环境(Windows、Linux、macOS)中运行,请考虑 Linux 和 macOS 上环境变量名称的大小写敏感性。Windows 的环境变量不区分大小写,但 Linux/macOS 的环境变量区分大小写。请在所有目标平台上测试脚本,以确保环境变量能够正常工作,并相应调整你的做法。
FAQ
分享到
了解更多
关于作者
Jonathan Blackwell
软件开发负责人
自 2012 年以来,工程师兼创新者 Jonathan Blackwell 一直提供工程领导力,使 Netwrix GroupID 成为 Active Directory 和 Azure AD 环境中群组与用户管理领域的领先者。他在研发、市场与销售方面的经验,使 Jonathan 能够全面理解 Identity 市场以及买家如何思考。