about_Environment_Variables

简短说明

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

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

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

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

长说明

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

注意

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

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

在 Windows 上,环境变量可以在三个作用域内定义:

  • 计算机(或系统)作用域
  • 用户范围
  • 流程范围

Process 作用域包含当前进程或 PowerShell 会话中可用的环境变量。 该变量列表继承自父进程,并由 MachineUser 作用域中的变量构造而成。

在 PowerShell 中更改环境变量时,更改仅影响当前会话。 此行为类似于 Windows 命令外壳中的 set 命令和基于 UNIX 的环境中的 setenv 命令的行为。 要更改 Machine 或 User 作用域中的值,必须使用 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 中,环境变量不能设置为空字符串。 将环境变量设置为 $null 或空字符串会将其从当前会话中删除。 例如:

$Env:Foo = ''
$Env:Foo | Get-Member -MemberType Properties
Get-Member : You must specify an object for the Get-Member cmdlet.
At line:1 char:12
+ $env:foo | Get-Member
+            ~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand

Get-Member 返回错误,因为环境变量已被删除。 在空字符串上使用错误时,可以看到它不会返回错误:

'' | Get-Member -MemberType Properties
   TypeName: System.String

Name   MemberType Definition
----   ---------- ----------
Length Property   int Length {get;}

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

使用环境提供程序和项 cmdlet

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

例如,若要创建值为 BarFoo 环境变量,请运行以下命令:

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:

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

使用 System.Environment 方法

System.Environment 类提供 GetEnvironmentVariableSetEnvironmentVariable 方法来获取和修改环境变量。

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

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

可以使用 SetEnvironmentVariable 方法,通过为变量值指定空字符串来删除环境变量。 例如,若要删除 Foo 环境变量,请运行以下命令:

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

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

保存对环境变量的更改

在 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 方法的作用域指定为第三个参数来设置该作用域中的环境变量。 计算机和用户作用域都保留在当前进程之外,使你能够保存新的或更改的环境变量。

例如,若要将值为 Bar 的新环境变量 Foo 保存到计算机作用域,请运行以下命令:

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

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

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

使用系统控制面板保存环境变量

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

若要使用系统控制面板对 Windows 上的环境变量进行持久更改,请执行以下操作:

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

PowerShell 环境变量

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

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

  • POWERSHELL_TELEMETRY_OPTOUT

    若要选择退出遥测,请将环境变量设置为 trueyes1

    有关详细信息,请参阅 about_Telemetry

  • POWERSHELL_DISTRIBUTION_CHANNEL

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

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

  • POWERSHELL_UPDATECHECK

    可以使用 POWERSHELL_UPDATECHECK 环境变量更改更新通知行为。 支持以下值:

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

    有关详细信息,请参阅 about_Update_Notifications

  • PSExecutionPolicyPreference

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

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

    • 使用 Set-ExecutionPolicy cmdlet。 使用值为 ProcessScope 参数。

      有关更多信息,请参阅 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 使用的其他环境变量

路径信息

  • 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 转义序列。 可使用 TERM 或 NO_COLOR 环境变量关闭对 ANSI 转义序列的支持

  • TERM

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

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

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

另请参阅