关于环境变量
简短说明
介绍如何在 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-Item
、 Remove-Item
和 Copy-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 }
- Windows PowerShell 5.1:
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
。
- 在 Windows 上,特定于用户的 CurrentUser 范围的位置是
此外,在其他目录(如 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-ChildItem
的Get-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 类提供 GetEnvironmentVariable 和 SetEnvironmentVariable 方法,用于指定变量的范围。
以下示例使用 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 类的方法的详细信息,请参阅 环境方法。