当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于环境变量

作者:精品下载站 日期:2024-12-14 02:23:14 浏览:12 分类:玩电脑

关于环境变量


简短描述

描述如何在 PowerShell 中访问和管理环境变量。

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

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

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

详细描述

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

笔记

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

与 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 的环境提供程序为您提供了一个与环境变量交互的界面,其格式类似于文件系统驱动器。它允许您在 PowerShell 中获取、添加、更改、清除和删除环境变量和值。

例如,要创建值为 BarFoo 环境变量:

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

您还可以使用 Copy-Item 复制环境变量,使用 Set-Item 设置环境变量的值,使用 Get-Item 列出环境变量code>,并使用 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:

有关使用环境提供程序管理环境变量的更多信息,请参阅about_Environment_Provider。

使用系统环境方法

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

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

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

您可以通过为变量值指定空字符串,使用 SetEnvironmentVariable() 方法删除环境变量。例如,要删除 Foo 环境变量:

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

有关 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() 方法的范围作为第三个参数,以在该范围内设置环境变量。计算机和用户范围都保留在当前进程之外,允许您保存新的或更改的环境变量。

例如,要将值为 Bar 的新环境变量 Foo 保存到机器范围:

[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 使用的特定于 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 进程之前必须设置环境变量的非默认值。有关创建持久环境变量的信息,请参阅前面的部分。

  • PSExecutionPolicyPreference

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

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

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

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

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

  • PSModulePath

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

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

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

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

    • 在 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 使用的其他环境变量

    路径信息

    • 路径

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

    • 路径文本

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

      要确保其他脚本语言的脚本在当前控制台会话中运行,请添加该脚本语言使用的文件扩展名。例如,要在当前控制台中运行Python脚本,请将.py扩展名添加到环境变量中。要使 Windows 支持 .py 扩展名作为可执行文件,您必须使用 CMD 命令 shell 的 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 转义序列的支持。

    • 期限

      以下 $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/。

  • 参见

    • about_Environment_Provider
    • about_个人资料
    • about_变量
    • 环境方法

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯