关于环境变量

简短说明

介绍如何在 PowerShell 中访问 Windows 环境变量。

详细说明

环境变量存储有关操作系统环境的信息。 此信息包括操作系统路径、操作系统使用的处理器数以及临时文件夹的位置等详细信息。

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

PowerShell 可以访问和管理任何受支持的操作系统平台中的环境变量。 PowerShell 环境提供程序简化了此过程,使查看和更改环境变量变得简单。

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

使用和更改环境变量

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

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

进程范围包含当前进程或 PowerShell 会话中可用的环境变量。 此变量列表继承自父进程,是从 计算机用户 范围内的变量构造的。 基于 Unix 的平台仅具有 进程 范围。

可以通过对环境提供程序使用变量语法来显示和更改环境变量的值,而无需使用 cmdlet。 若要显示环境变量的值,请使用以下语法:

$Env:<variable-name>

例如,若要显示环境变量的值 WINDIR ,请在 PowerShell 命令提示符处键入以下命令:

$Env:windir

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

在 PowerShell 中更改环境变量时,更改仅影响当前会话。 此行为类似于 Windows Command Shell 中命令的行为 Set 和基于 UNIX 的环境中的 Setenv 命令的行为。 若要更改 Machine 或 User 作用域中的值,必须使用 System.Environment 类的方法。

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

可以使用以下语法更改变量的值,而无需使用 cmdlet:

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

例如,若要追加 ;c:\temp 到环境变量的值 Path ,请使用以下语法:

$Env:Path += ";c:\temp"

在 Linux 或 MacOS 上,命令中的冒号 (:) 将新路径与列表中其前面的路径分隔开来。

$Env:PATH += ":/usr/local/temp"

还可以使用项 cmdlet(如 Set-ItemRemove-ItemCopy-Item )更改环境变量的值。 例如,若要使用 Set-Item cmdlet 追加 ;c:\temp 到环境变量的值 Path ,请使用以下语法:

Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")

在此命令中,值括在括号中,以便将其解释为一个单位。

存储首选项的环境变量

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 提供了几种不同的方法来管理环境变量。

  • 环境提供程序驱动器
  • Item cmdlet
  • .NET System.Environment
  • 在 Windows 上,系统控制面板

使用环境提供程序

每个环境变量由 System.Collections.DictionaryEntry 类的一个实例表示。 在每个 DictionaryEntry 对象中,环境变量的名称是字典键。 变量的值是字典值。

若要在 PowerShell 中显示表示环境变量的对象的属性和方法,请使用 Get-Member cmdlet。 例如,若要显示驱动器中 Env: 所有对象的方法和属性,请键入:

Get-Item -Path Env:* | Get-Member

PowerShell 环境提供程序允许访问 PowerShell 驱动器中的环境变量 (Env: 驱动器) 。 此驱动器看起来很像文件系统驱动器。 若要转到 Env: 驱动器,请键入:

Set-Location Env:

使用 Content cmdlet 获取或设置环境变量的值。

PS Env:\> Set-Content -Path Test -Value 'Test value'
PS Env:\> Get-Content -Path Test
Test value

可以从任何其他 PowerShell 驱动器查看驱动器中的 Env: 环境变量,也可以进入 Env: 驱动器以查看和更改环境变量。

使用 Item cmdlet

引用环境变量时,请 Env: 键入驱动器名称,后跟变量的名称。 例如,若要显示环境变量的值 COMPUTERNAME ,请键入:

Get-ChildItem Env:Computername

若要显示所有环境变量的值,请键入:

Get-ChildItem Env:

由于环境变量没有子项,因此 和 Get-ChildItemGet-Item输出是相同的。

默认情况下,PowerShell 按检索环境变量的顺序显示环境变量。 若要按变量名称对环境变量列表进行排序,请将命令的 Get-ChildItem 输出通过管道传递给 Sort-Object cmdlet。 例如,在任何 PowerShell 驱动器中,键入:

Get-ChildItem Env: | Sort Name

还可以使用 Set-Location cmdlet 进入Env:驱动器:

Set-Location Env:

在驱动器中 Env: 时,可以从路径中省略 Env: 驱动器名称。 例如,若要显示所有环境变量,请键入:

PS Env:\> Get-ChildItem

若要从驱动器中Env:显示变量的值COMPUTERNAME,请键入:

PS Env:\> Get-ChildItem ComputerName

保存对环境变量的更改

若要对 Windows 上的环境变量进行持久更改,请使用系统控制面板。 选择“ 高级系统设置”。 在“ 高级 ”选项卡上,单击“ 环境变量...”。可以在 用户系统 (计算机) 范围中添加或编辑现有环境变量。 Windows 将这些值写入注册表,以便在会话和系统重启期间保留这些值。

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

使用 System.Environment 方法

System.Environment 类提供 GetEnvironmentVariableSetEnvironmentVariable 方法,用于指定变量的范围。

以下示例使用 GetEnvironmentVariable 方法获取 的计算机 PSModulePath 设置,并使用 SetEnvironmentVariable 方法将路径添加到 C:\Program Files\Fabrikam\Modules 值。

$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable("PSModulePath", $newpath, 'Machine')

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

另请参阅