about_Environment_Variables

简短说明

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

长说明

环境变量存储操作系统和其他程序使用的数据。 例如, WINDIR 环境变量包含 Windows 安装目录的位置。 程序可以查询此变量的值,以确定 Windows 操作系统文件所在的位置。

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

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

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

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

进程范围包含当前进程或 PowerShell 会话中可用的环境变量。 此变量列表继承自父进程,是从 计算机用户 作用域中的变量构造的。

在 PowerShell 中更改环境变量时,更改仅影响当前会话。 此行为类似于 Windows Command Shell 中的 命令和 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!

由于环境变量不能是空字符串,因此将环境变量设置为 $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 的环境 提供程序提供了一个界面,用于以类似于文件系统驱动器的格式与环境变量进行交互。 它允许在 PowerShell 中获取、添加、更改、清除和删除环境变量和值。

例如,创建 Foo 值为 的 Bar环境变量:

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

还可以使用 Copy-Item复制环境变量,使用 设置环境变量的值,使用 Set-ItemGet-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".

有关使用 环境 提供程序管理环境变量的详细信息,请参阅 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 上,使用冒号 (:) 而不是分号 (;) 将新路径与列表中其前面的路径分开。

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

使用 SetEnvironmentVariable 保存环境变量

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

例如,若要将具有 值Bar的新环境变量Foo保存到计算机范围,请执行以下操作:

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

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

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

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

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

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

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

PowerShell 的环境变量

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

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

  • PSExecutionPolicyPreference

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

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

    • 使用 Set-ExecutionPolicy cmdlet。 使用值为“Process”的 Scope 参数。

      有关详细信息,请参阅 about_Execution_Policies

  • 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 cannot 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来关闭它们。

    设置此环境变量会在当前进程中立即生效。

  • PSModulePath

    环境变量 $env:PSModulePath 包含搜索以查找模块和资源的文件夹位置的列表。

    默认情况下,分配到 $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

  • POWERSHELL_UPDATECHECK

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

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

    有关详细信息,请参阅 about_Update_Notifications

  • POWERSHELL_TELEMETRY_OPTOUT

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

    有关详细信息,请参阅 about_Telemetry

PowerShell 使用的其他环境变量

路径信息

  • PATHEXT

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

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

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

  • XDG 变量

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

    • XDG_CONFIG_HOME
    • XDG_DATA_HOME
    • XDG_CACHE_HOME

另请参阅