about_Environment_Variables

简短说明

介绍如何在 PowerShell 中访问和管理环境变量。

详细说明

环境变量存储操作系统和其他程序使用的数据。 PowerShell 创建以下环境变量:

  • POWERSHELL_TELEMETRY_OPTOUT
  • POWERSHELL_DISTRIBUTION_CHANNEL
  • POWERSHELL_UPDATECHECK
  • POWERSHELL_DIAGNOSTICS_OPTOUT
  • PSExecutionPolicyPreference
  • PSModulePath
  • PSModuleAnalysisCachePath
  • PSDisableModuleAnalysisCacheCleanup

有关这些变量的完整说明,请参阅本文中的 PowerShell 环境变量

PowerShell 可以在任何受支持的操作系统平台中访问和管理环境变量。 借助 PowerShell 环境提供程序,可以在当前控制台中获取、添加、更改、清除和删除环境变量。

注意

与 Windows 不同,macOS 和 Linux 上的环境变量名称区分大小写。 例如,非 Windows 平台上 $Env:Path$Env:PATH 是不同的环境变量。

环境变量与 PowerShell 中的其他类型的变量不同,始终存储为字符串。 与其他变量不同,它们由子进程继承,例如本地后台作业和模块成员在其中运行的会话。 这使得环境变量非常适合用于存储父进程和子进程中所需的值。

在 Windows 上,可以在三个范围内定义环境变量:

  • 计算机(或系统)范围
  • 用户范围
  • 进程范围

进程 范围包含当前进程或 PowerShell 会话中可用的环境变量。 此变量列表继承自父进程,并通过从 机器用户 范围中的变量构建而成。

在 PowerShell 中更改环境变量时,更改仅影响当前会话。 此行为类似于 Windows Command Shell 中的 set 命令的行为,以及基于 Unix 的环境中的 setenv 命令的行为。 若要更改计算机或用户范围中的值,必须使用 System.Environment 类的方法。

若要更改计算机范围的变量,还必须具有权限。 如果尝试在没有足够权限的情况下更改值,该命令将失败,并且 PowerShell 显示错误。

PowerShell 提供了几种不同的方法来使用和管理环境变量。

  • 变量语法
  • 环境提供程序和项 cmdlet
  • .NET System.Environment

使用变量语法

可以使用以下语法显示和更改环境变量的值:

$Env:<variable-name>

例如,若要显示 windir 环境变量的值,

$Env:windir
C:\Windows

在此语法中,美元符号($)指示变量,驱动器名称(Env:)指示环境变量后跟变量名称(windir)。

可以使用以下语法创建和更新环境变量的值:

$Env:<variable-name> = "<new-value>"

例如,若要创建 Foo 环境变量,

$Env:Foo = 'An example'

由于环境变量始终是字符串,因此可以使用它们,就像包含字符串的任何其他变量一样。 例如:

"The 'Foo' environment variable is set to: $Env:Foo"
$Env:Foo += '!'
$Env:Foo
The 'Foo' environment variable is set to: An example

An example!

从 PowerShell 7.5 开始,可以将环境变量设置为空字符串。 设置环境变量以 $null 将其从当前会话中删除。 例如:

PS> $env:TEST = ''
PS> Get-ChildItem env:TEST

Name                           Value
----                           -----
TEST

PS> $env:TEST = $null
PS> $env:TEST.Length
0

PS> Get-ChildItem env:TEST

Get-ChildItem: Cannot find path 'TEST' because it does not exist.

有关 PowerShell 中的变量的详细信息,请参阅 about_Variables

使用环境提供程序和项 cmdlet

PowerShell 的 Environment 提供程序提供了一个接口,用于以类似于文件系统驱动器的格式与环境变量进行交互。 它允许你在 PowerShell 中获取、添加、更改、清除和删除环境变量和值。

例如,若要创建 Foo 环境变量,其值为 Bar

New-Item -Path Env:\Foo -Value 'Bar'
Name                           Value
----                           -----
Foo                            Bar

还可以复制具有 Copy-Item的环境变量,使用 Set-Item设置环境变量的值,列出具有 Get-Item的环境变量,并删除具有 Remove-Item的环境变量。

Copy-Item -Path Env:\Foo -Destination Env:\Foo2 -PassThru
Set-Item -Path Env:\Foo2 -Value 'BAR'
Get-Item -Path Env:\Foo*
Remove-Item -Path Env:\Foo* -Verbose
Name                           Value
----                           -----
Foo2                           Bar

Name                           Value
----                           -----
Foo2                           BAR
Foo                            Bar

VERBOSE: Performing the operation "Remove Item" on target "Item: Foo2".
VERBOSE: Performing the operation "Remove Item" on target "Item: Foo".

使用 Get-ChildItem cmdlet 查看环境变量的完整列表:

Get-ChildItem Env:

从 PowerShell 7.5 开始,可以使用环境提供程序和 Set-Item cmdlet 将环境变量设置为空字符串。 设置环境变量以 $null 将其从当前会话中删除。 例如:

PS> Set-Item env:TEST 'Foo'
PS> Get-ChildItem env:TEST

Name                           Value
----                           -----
TEST                           Foo

PS> Set-Item env:TEST ''
PS> Get-ChildItem env:TEST

Name                           Value
----                           -----
TEST

PS> Set-Item -Path env:TEST -Value $null
PS> Get-ChildItem env:TEST
Get-ChildItem: Cannot find path 'TEST' because it does not exist.

有关使用 Environment 提供程序管理环境变量的详细信息,请参阅 about_Environment_Provider

使用 System.Environment 方法

System.Environment 类提供用于获取和修改环境变量的 GetEnvironmentVariable()SetEnvironmentVariable() 方法。

以下示例创建一个新的环境变量,Foo,其值为 Bar,然后返回其值。

[Environment]::SetEnvironmentVariable('Foo','Bar')
[Environment]::GetEnvironmentVariable('Foo')
Bar

从 PowerShell 7.5 开始,可以使用该方法将环境变量设置为空字符串 SetEnvironmentVariable() ,并为变量的值指定空字符串 $null 。 例如:

PS> [Environment]::SetEnvironmentVariable('Foo','Bar')
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo                            Bar

PS> [Environment]::SetEnvironmentVariable('Foo','')
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo

PS> [Environment]::SetEnvironmentVariable('Foo','bar')
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo                            bar

PS> [Environment]::SetEnvironmentVariable('Foo',$null)
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo

注意

与变量语法和提供程序事例不同,将值赋给 $null 使用 SetEnvironmentVariable() 该方法不会删除环境变量。

有关 System.Environment 类的方法的详细信息,请参阅 环境方法

在 Windows 中创建持久性环境变量

在 Windows 上,有三种方法可用于对环境变量进行持久更改:

  • 在配置文件中设置它们
  • 使用 SetEnvironmentVariable() 方法
  • 使用系统控制面板

在你的配置文件中设置环境变量

在 PowerShell 配置文件中添加或更改的任何环境变量都可用于加载配置文件的任何会话。 此方法适用于任何受支持平台上的任何 PowerShell 版本。

例如,若要创建 CompanyUri 环境变量并更新 PATH 环境变量以包含 C:\Tools 文件夹,请将以下行添加到 PowerShell 配置文件:

$Env:CompanyUri = 'https://internal.contoso.com'
$Env:PATH += ';C:\Tools'

注意

在 Linux 或 macOS 上,使用冒号(:)而不是分号(;)将新路径与列表中前面的路径分开。

可以使用 $PROFILE 自动变量获取 PowerShell 配置文件的路径。 有关配置文件的详细信息,请参阅 about_Profiles

使用 SetEnvironmentVariable 设置环境变量()

在 Windows 上,可以将 SetEnvironmentVariable() 方法的范围指定为第三个参数,以在该范围内设置环境变量。 计算机和用户范围都保留在当前进程之外,使你能够保存新的或更改的环境变量。

例如,若要将新的环境变量 Foo,并将值 Bar保存到计算机范围:

[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')

可以通过将变量的值设置为空字符串,从用户或计算机范围中删除环境变量。

[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')

在系统控制面板中设置环境变量

在系统控制面板中,可以在 用户系统(计算机)范围中添加或编辑现有环境变量。 Windows 将这些值写入注册表,以便在会话和系统重启期间保留这些值。

若要使用系统控制面板对 Windows 上的环境变量进行持久更改:

  1. 打开系统控制面板。
  2. 选择系统
  3. 选择 高级系统设置
  4. 转到“高级”选项卡。
  5. 选择“环境变量...”。
  6. 请进行修改。

在非 Windows 平台上创建持久性环境变量

Linux 和 macOS 具有操作系统在启动应用程序之前用于设置环境变量的配置文件和脚本。

将 PowerShell 作为默认 (登录) shell 运行时,可以在操作系统支持的全局初始化文件中定义环境变量。 例如,在 Linux 上,可以将环境变量添加到 /etc/environment 文件,或创建一个脚本来设置环境变量并将其放入 /etc/profile.d 文件夹中。 在 macOS 上,可以将环境变量添加到 /etc/profile 文件。

从另一个 shell 启动 PowerShell 时,可以在非登录 shell 使用的特定初始化文件中定义环境变量,例如 ~/.bashrc 对于 bash~/.zshrc 对于 zsh

有关详细信息,请参阅操作系统和默认 shell 的文档。

PowerShell 环境变量

PowerShell 功能可以使用环境变量来存储用户首选项。 这些变量的运作方式类似于首选项变量,但它们会被创建它们的会话的子会话继承。 有关首选项变量的详细信息,请参阅 about_Preference_Variables

存储首选项的环境变量包括:

  • POWERSHELL_TELEMETRY_OPTOUT

    若要选择退出遥测,请将环境变量设置为 trueyes1。 有关详细信息,请参阅 about_Telemetry

    要使此环境变量生效,必须在启动 PowerShell 进程之前设置它。 有关创建持久性环境变量的信息,请参阅前面的部分。

  • POWERSHELL_DISTRIBUTION_CHANNEL

    从 PowerShell 7.2 开始,此环境变量由安装程序包设置,以记录 PowerShell 安装的方法和源。

    此信息包含在发送到Microsoft的遥测数据中。 用户不应更改此值。

  • POWERSHELL_UPDATECHECK

    可以使用 POWERSHELL_UPDATECHECK 环境变量更改更新通知行为。 请参阅 about_Update_Notifications获取更多信息。

    支持以下值:

    • Off 关闭更新通知功能
    • Default 与未定义 POWERSHELL_UPDATECHECK相同:
      • GA 版本通知 GA 版本的更新
      • 预览版/RC 版本通知 GA 版本和预览版的更新
    • LTS 仅通知长期服务 (LTS) GA 版本的更新

    在启动 PowerShell 进程之前,必须设置环境变量的非默认值。 有关创建持久性环境变量的信息,请参阅前面的部分。

  • POWERSHELL_DIAGNOSTICS_OPTOUT

    此环境变量已在 PowerShell 7.6-preview.5 中添加。 默认情况下,PowerShell 会创建用于进程间通信(IPC)的命名管道,例如 Enter-PSHostProcess。 PowerShell 在启动时创建命名管道,以便在需要时使用它。

    在非 Windows 平台上,命名管道作为文件夹中的文件 /tmp 实现。 如果 PowerShell 崩溃,可能无法删除这些文件。 随着时间的推移,这些文件可以累积。

    从 PowerShell 7.6 开始, POWERSHELL_DIAGNOSTICS_OPTOUT 设置为 false. 若要关闭命名管道的创建,请将环境变量设置为trueyes1

  • PSExecutionPolicyPreference

    存储为当前会话设置的执行策略。 仅当为单个会话设置执行策略时,此环境变量才存在。 可以通过两种不同的方式执行此操作。

    • 使用 ExecutionPolicy 参数从命令行启动会话,以设置会话的执行策略。

    • 使用 Set-ExecutionPolicy 命令。 使用值为 Process 参数。

    • 手动设置环境变量。 更改此变量的值会更改当前进程的执行策略。

    此信息仅适用于 Windows 平台。 有关更多信息,请参阅 about_Execution_Policies

  • PSModulePath

    $Env:PSModulePath 环境变量包含搜索以查找模块和资源的文件夹位置的列表。 在 Windows 上,文件夹位置列表由分号(;)字符分隔。 在非 Windows 平台上,冒号(:)分隔环境变量中的文件夹位置。

    默认情况下,分配给 $Env:PSModulePath 的有效位置为:

    • 系统范围的位置:这些文件夹包含随 PowerShell 一起随附的模块。 模块存储在 $PSHOME\Modules 位置。 此外,这是安装 Windows 管理模块的位置。

    • 用户安装的模块:这些模块由用户安装。 Install-Module 具有 Scope 参数,可用于指定是为当前用户还是所有用户安装模块。 有关详细信息,请参阅 Install-Module

      • 在 Windows 上,特定于用户的 CurrentUser 范围的位置是 $HOME\Documents\PowerShell\Modules 文件夹。 AllUsers 作用域的位置为 $Env:ProgramFiles\PowerShell\Modules
      • 在非 Windows 系统上,特定于用户的 CurrentUser 范围的位置是 $HOME/.local/share/powershell/Modules 文件夹。 AllUsers 作用域的位置为 /usr/local/share/powershell/Modules

    此外,在其他目录中安装模块的安装程序(如 Program Files 目录)可以将其位置追加到 $Env:PSModulePath 的值。

    有关详细信息,请参阅 about_PSModulePath

  • PSModuleAnalysisCachePath

    PowerShell 提供对用于缓存有关模块及其 cmdlet 的数据的文件的控制。 缓存在启动时在搜索命令时读取,并在导入模块后在后台线程上写入。

    缓存的默认位置为:

    • Windows PowerShell 5.1:$Env:LOCALAPPDATA\Microsoft\Windows\PowerShell
    • PowerShell 6.0 及更高版本:$Env:LOCALAPPDATA\Microsoft\PowerShell
    • 非 Windows 默认值:~/.cache/powershell

    缓存的默认文件名为 ModuleAnalysisCache。 安装多个 PowerShell 实例时,文件名包含十六进制后缀,以便每个安装都有唯一的文件名。

    注意

    如果命令发现无法正常工作,例如 IntelliSense 显示不存在的命令,则可以删除缓存文件。 下次启动 PowerShell 时,将重新创建缓存。

    若要更改缓存的默认位置,请先设置环境变量,然后再启动 PowerShell。 该值应命名 PowerShell 有权创建和写入文件的完整路径(包括文件名)。

    对此环境变量的更改仅影响子进程。 有关创建持久性环境变量的信息,请参阅前面的部分。

    若要禁用文件缓存,请将此值设置为无效位置,例如:

    # `NUL` here is a special device on Windows that can't be written to,
    # on non-Windows you would use `/dev/null`
    $Env:PSModuleAnalysisCachePath = 'NUL'
    

    这会设置 NUL 设备的路径。 PowerShell 无法写入路径,但未返回错误。 可以使用跟踪器查看报告的错误:

    Trace-Command -PSHost -Name Modules -Expression {
      Import-Module Microsoft.PowerShell.Management -Force
    }
    
  • PSDisableModuleAnalysisCacheCleanup

    写出模块分析缓存时,PowerShell 会检查不再存在的模块,以避免不必要的大型缓存。 有时不需要这些检查,在这种情况下,可以通过将此环境变量值设置为 1来将其关闭。

    设置此环境变量对当前进程中的后续清理事件生效。 若要确保在启动时禁用清理,必须在启动 PowerShell 之前设置环境变量。 有关创建持久性环境变量的信息,请参阅前面的部分。

PowerShell 使用的其他环境变量

路径信息

  • PATH

    $Env:PATH 环境变量包含操作系统搜索可执行文件的文件夹位置的列表。 在 Windows 上,文件夹位置列表由分号(;)字符分隔。 在非 Windows 平台上,冒号(:)分隔环境变量中的文件夹位置。

  • PATHEXT

    $Env:PATHEXT 变量包含 Windows 认为是可执行文件的文件扩展名列表。 从 PowerShell 执行包含其中一个扩展名的脚本文件时,脚本在当前控制台或终端会话中运行。 如果未列出文件扩展名,脚本将在新的控制台会话中运行。

    若要确保另一个脚本语言的脚本在当前控制台会话中运行,请添加脚本语言使用的文件扩展名。 例如,若要在当前控制台中运行 Python 脚本,请将 .py 扩展添加到环境变量。 若要使 Windows 支持 .py 扩展名作为可执行文件,必须使用 CMD 命令行界面的 ftypeassoc 命令注册文件扩展名。 PowerShell 没有用于注册文件处理程序的直接方法。 有关详细信息,请参阅 ftype 命令的文档。

    PowerShell 脚本始终在当前控制台会话中启动。 无需添加 .ps1 扩展。

  • XDG 变量

    在非 Windows 平台上,PowerShell 使用以下由 XDG 基目录规范定义的以下 XDG 环境变量。

    • XDG_CONFIG_HOME
    • XDG_DATA_HOME
    • XDG_CACHE_HOME

终端功能

从 PowerShell 7.2 开始,以下环境变量可用于控制虚拟终端功能,例如对输出进行着色的 ANSI 转义序列。 可以使用 TERMNO_COLOR 环境变量关闭对 ANSI 转义序列的支持。

  • TERM

    以下 $Env:TERM 的值按如下方式更改该行为:

    • dumb - 设置 $Host.UI.SupportsVirtualTerminal = $false
    • xterm-mono - 设置 $PSStyle.OutputRendering = PlainText
    • xterm - 设置 $PSStyle.OutputRendering = PlainText
  • NO_COLOR

    如果存在 $Env:NO_COLOR,则 $PSStyle.OutputRendering 设置为 PlainText。 有关 NO_COLOR 环境变量的详细信息,请参阅 https://no-color.org/

另请参阅