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

[玩转系统] PowerShell 环境变量:终极指南

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

PowerShell 环境变量:终极指南


一旦您掌握了窍门,使用 PowerShell 设置 Windows 环境变量、读取环境变量以及创建新的环境变量就变得非常简单。您在本文中学到的技巧适用于 Windows 10 环境变量以及 Windows 7 SP1/Windows Server 2008 之后的任何 Windows 客户端/服务器。

PowerShell 提供了许多不同的方式与 $env: PSDrive 中的 Windows 环境变量进行交互。注册表和[System.Environment] .NET 类。您将在此分步演练中了解每种方法,包括了解环境变量范围。

假设

在本文中,我将在 Windows 10 上使用 Windows PowerShell 5.1。但是,如果您在 Windows 7 SP1 或更高版本上拥有高于 v3 的任何版本的 Windows PowerShell,那么我将向您展示的技术应该可以正常工作。

什么是环境变量?

顾名思义,环境变量存储有关 Windows 和应用程序使用的环境的信息。环境变量可以通过图形应用程序(例如 Windows 资源管理器)和纯文本编辑器(例如记事本)以及 cmd.exe 和 PowerShell 来访问。

使用环境变量可以帮助您避免在 PowerShell 脚本或模块中对文件路径、用户名或计算机名等进行硬编码。

常用环境变量

当您开始详细了解如何在 PowerShell 中使用环境变量时,您将遇到许多不同的变量。有些比其他更有用。下面列出了一些常见的环境变量及其用法,供参考。

ClientName

通过远程桌面会话连接的远程计算机的名称。

SessionName

这有助于确定操作系统是否将当前 Windows 会话视为在控制台上运行。对于控制台会话,SessionName 将为“Console”。与 Hyper-V 虚拟机的增强会话连接不会将 SessionName 报告为“Console”,而标准会话则会报告。

ComputerName

计算机的名称。

SystemRoot and Windir

当前 Windows 安装的路径。

ProgramFiles and ProgramFiles(x86)

x64 和 x86 程序的默认位置。

ProgramW6432

程序的默认位置,避免 32/64 位重定向。该变量仅适用于在 64 位平台上运行的 32 位进程。这意味着您可以使用它来识别 32 位 PowerShell 实例何时在 64 位系统上运行。

UserDNSDomain

当前用户登录的 Active Directory 域的完全限定域名。仅在域登录时出现。

UserDomain

当前用户登录的域的 NETBIOS 样式名称。如果没有域,可以是计算机名称。

UserDomainRoamingProfile

用户漫游配置文件的中央副本的位置(如果有)。仅在域登录时出现。

UserName

当前登录用户的名称。

UserProfile

当前用户的配置文件在本地计算机上的位置。

环境变量范围

环境变量有三个范围。将范围视为变量层,这些变量层层叠加以给出总体情况。这些“层”相结合,为 Windows 中任何正在运行的进程提供许多不同的环境变量。

环境变量作用域“层次结构”

这些“层”中的每一层要么相互组合,要么相互覆盖。它们在如下层次结构中定义:机器 -> 用户 -> 进程,每个作用域变量都会覆盖父变量(如果父变量中存在)范围。

例如,常见的环境变量是TEMP。该变量存储 Windows 本地临时文件夹的文件夹路径。该环境变量设置为:

  • C:\WINDOWS\TEMP机器范围内
  • user 范围内的 C:\Users\AppData\Local\Temp
  • C:\Users\AppData\Local\Temp进程范围内。

如果用户范围内没有设置TEMP环境变量,那么最终结果将是C:\WINDOWS\TEMP

环境变量作用域类型

Windows 中存在三种不同的环境变量作用域。

机器

机器范围内的环境变量与正在运行的 Windows 实例相关联。任何用户帐户都可以读取这些内容,但设置、更改或删除它们需要使用提升的权限来完成。

用户

user 范围内的环境变量与运行当前进程的用户相关联。用户变量会覆盖具有相同名称的机器范围变量。

注意:Microsoft 建议计算机和用户范围的环境变量值包含不超过 2048 个字符。

过程

进程范围内的环境变量是机器用户范围的组合,以及Windows动态创建的一些变量。

以下是正在运行的进程可用的环境变量列表。所有这些变量都是动态创建的。

    ALLUSERSPROFILE
    APPDATA
    COMPUTERNAME
    HOMEDRIVE
    HOMEPATH
    LOCALAPPDATA
    LOGONSERVER
    PROMPT
    PUBLIC
    SESSION
    SystemDrive
    SystemRoot
    USERDNSDOMAIN
    USERDOMAIN
    USERDOMAIN_ROAMINGPROFILE
    USERNAME
    USERPROFILE

    注册表中的环境变量

    环境变量存储在两个注册表位置,一个用于用户范围,一个用于计算机范围。

    不要使用注册表来管理环境变量

    更改注册表内的变量时有一个问题。任何正在运行的进程都不会看到注册表中的变量更改。进程只能看到进程启动时存在的注册表变量和值,除非 Windows 通知它们发生了更改。

    您可以使用 .NET 类,而不是直接修改注册表。 .NET [System.Environment] 类可以修改计算机和用户范围的环境变量并为您处理注册表事务。

    直接修改注册表中的环境变量虽然可能,但没有意义。 .NET 类提供了一种更简单、Microsoft 支持的方法。您将在本文后面了解如何使用 [System.Environment] .NET 类。

    环境变量注册表位置和查询

    我希望您已经确信不要直接修改注册表,但如果您想查看其中的内容,可以在 HKEY_CURRENT_USER\Environment 键中找到所有用户环境变量。机器范围的环境变量存储在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 中。

    这些键的内部包含类型为 REG_SZREG_EXPAND_SZ 的注册表值。 REG_EXPAND_SZ 值将环境变量嵌入为其值的一部分。当检索值时,这些环境变量会扩展。

    要演示这一点,请使用 REG 实用程序。这是 Windows 附带的一个小型命令行实用程序。

    查询 TEMP 环境变量,如下所示。使用 QUERY 参数运行 REG 以检索 TEMP 变量的值。

    > REG QUERY HKCU\Environment /V TEMP
    
    HKEY_CURRENT_USER\Environment     
        TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp

    您有时会注意到显示的环境变量被百分比符号 (%COMPUTERNAME%) 包围,如上所示。这是通过 cmd.exe 和批处理文件显示环境变量的老式方法。请注意,PowerShell 无法识别此格式。

    REG 实用程序允许我们查看注册表值的本机值。值类型为 REG_EXPAND_SZ,并且该值包含 %USERPROFILE% 环境变量。

    如果您希望使用 PowerShell 检索注册表值,则可以使用 Get-Item cmdlet,如下所示。

    PS51> Get-ItemProperty -Path HKCU:\Environment -Name TEMP
    
    TEMP         : C:\Users\<your username>\AppData\Local\Temp
    PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Environment
    PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
    PSChildName  : Environment
    PSDrive      : HKCU
    PSProvider   : Microsoft.PowerShell.Core\Registry

    通过 GUI 查看和设置 Windows 环境变量

    要查看用户和系统环境变量的 GUI 视图,请从 PowerShell、命令提示符或 Windows Key+R 运行 SystemPropertiesAdvanced.exe 以显示“系统属性高级”选项卡。单击下图中突出显示的EnvironmentVariables按钮。

    如下所示的环境变量对话框允许您查看、创建和修改用户和计算机范围的环境变量。请注意,该对话框将机器范围变量称为“系统变量”。

    现在您已经了解了环境变量,让我们开始讨论您的目的:使用 PowerShell 管理它们!

    您可以通过多种不同的方式使用 PowerShell 与环境变量进行交互。

    • Env: PSDrive 和 Provider - 基于会话。仅为当前 PowerShell 会话设置环境变量的值
    • $env: 变量 - 基于会话。仅为当前 PowerShell 会话设置环境变量的值
    • [System.Environment] .NET 类 - 允许您在会话和重新启动之间保留用户和系统范围的环境变量

    Env: PSDrive 和 Provider

    读取环境变量的最佳方法之一是称为 PowerShell 驱动器(PS 驱动器)的 PowerShell 概念。 PS 驱动器允许您通过 Env: 驱动器将环境变量视为文件系统。

    切换到 Env: 驱动器

    与所有 PS 驱动器一样,您可以通过 Env:\TEMPEnv:\COMPUTERNAME 等路径引用它。但是为了节省一些击键,请切换到 Env : 驱动器就像任何文件系统驱动器一样,如下所示。

    PS51> cd Env:
    PS51 Env:\>
    
    ## or
    
    PS51> Set-Location Env:
    PS Env:\>

    使用 Env: 驱动器进行制表符补全

    您可以使用与访问文件系统相同的命令(例如 Get-ItemGet-ChildItem)来访问环境变量。但您读取的是 Env: 驱动器,而不是文件系统。

    由于环境变量存储在 PS 驱动器中,因此您可以使用 PowerShell 的 Tab 自动补全功能来循环访问可用变量,如下所示。

    [玩转系统] PowerShell 环境变量:终极指南

    现在让我们通过几个示例来了解如何使用 Env: PS 驱动器来处理环境变量。

    使用 Env: 列出环境变量

    PS51> Get-Item -Path Env:
    PS51> Get-Item -Path Env:USERNAME

    使用带有 Env: 的通配符列出环境变量

    PS51> Get-Item -Path Env:user*

    使用 Env: 查找环境变量值

    这些命令的结果是键/值[System.Collections.DictionaryEntry] .NET 对象。这些对象在 Name 属性中保存环境变量的名称,在 Value 属性中保存值。

    您可以通过将 Get-Item 命令引用括在括号中并引用 Value 属性来访问环境变量的特定值,如下所示:

    PS51> (Get-Item -Path Env:computername).Value
    MYCOMPUTERHOSTNAME

    如果您只需要返回某些环境变量,请使用标准 PowerShell cmdlet(例如 Select-ObjectWhere-Object)来选择和筛选 返回的对象>Env: 提供商。

    在下面的示例中,仅返回环境变量 COMPUTERNAME

    PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'

    作为替代方法,请使用 Get-Content cmdlet。此 cmdlet 返回一个包含环境变量值的 [String] 对象。该对象处理起来更简单,因为它仅返回值,而不是具有 NameValue 属性的对象。

    PS51> Get-Content -Path Env:\COMPUTERNAME

    演示:在字符串中插入环境值

    使用Get-Content,您可以查找环境变量的值并将COMPUTERNAME 环境变量插入到文本字符串中。

    PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)
    Computer Name is: MYCOMPUTER

    使用 Env: 设置(并创建)环境变量

    使用 New-Item cmdlet 通过 PowerShell 创建新的环境变量。以 Env:\ 形式为 Name 值提供环境变量的名称,并为 Value 提供环境变量的值> 参数如下图所示。

    PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PC
    Name                           Value
    ----                           -----
    MYCOMPUTER                     MY-WIN10-PC

    使用 Set-item cmdlet 设置环境变量,或者创建一个新环境变量(如果尚不存在)。您可以在下面看到使用 Set-Item cmdlet,您可以创建或修改环境变量。

    PS51> Set-Item -Path Env:testvariable -Value "Alpha"

    使用 Env: 复制环境变量

    有时会出现需要复制环境变量值的情况。您可以使用Copy-Item cmdlet 来执行此操作。

    在下面您可以看到 COMPUTERNAME 变量的值被复制到 MYCOMPUTER,覆盖其现有值。

    PS51> Get-Item -Path Env:\MYCOMPUTER
    
    Name                           Value
    ----                           -----
    MYCOMPUTER                     MY-WIN10-PC
    
    PS51> Copy-Item -Path Env:\COMPUTERNAME -Destination Env:\MYCOMPUTER
    PS51> Get-Item -Path Env:\MYCOMPUTER
    
    Name                           Value
    ----                           -----
    MYCOMPUTER                     WIN10-1903

    使用 Env: 删除环境变量

    可能会出现不再需要环境变量的情况。您可以使用以下三种方法之一删除环境变量:

    • 使用 Set-Item cmdlet 将环境变量设置为空值
    PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''
    • 使用 Remove-Item cmdlet。
    PS51> Remove-Item -Path Env:\MYCOMPUTER
    • 使用 Clear-Item cmdlet。
    PS51> Clear-Item -Path Env:\MYCOMPUTER

    使用 Env: 重命名环境变量

    在需要更改环境变量名称的情况下,您可以选择重命名,而不是使用 Env: 提供程序删除并重新创建。

    使用 Rename-Item cmdlet 更改环境变量的名称,同时保留其值。下面您可以看到 MYCOMPUTER 变量已重命名为 OLDCOMPUTER,同时保留其值。

    PS51> Rename-Item -Path Env:\MYCOMPUTER -NewName OLDCOMPUTER
    PS51> Get-Item -Path OLDCOMPUTER
    Name                           Value
    ----                           -----
    OLDCOMPUTER                    WIN10-1903

    $Env: 变量

    掌握了 Env: 驱动器将环境变量视为文件后,本节将向您展示如何将它们视为变量。管理会话中环境变量的另一种方法是使用 PowerShell 表达式解析器。此功能允许您使用 $Env: 范围来访问环境变量。

    使用 $Env: 获取环境变量

    使用 $Env 作用域,您可以直接引用环境变量,而无需使用 Get-Item 等命令,如下所示。

    PS51> $env:computername

    此方法可以轻松地将环境变量插入到字符串中,如下所示:

    PS51> "The Computer Name is {0}" -f $env:computername
    The Computer Name is WIN10-1809
    PS51> "The Computer Name is $env:computername"
    The Computer Name is WIN10-1809

    使用 $Env: 设置或创建环境变量

    使用此方法设置环境变量非常简单。如果还不存在,这也会创建一个新的环境变量,如下所示。

    PS51> $env:testvariable = "Alpha"

    使用 += 语法添加到现有值,而不是覆盖它。

    PS51> $env:testvariable = "Alpha"
    PS51> $env:testvariable += ",Beta"
    
    PS51> $env:testvariable
    Alpha,Beta

    使用 $Env: 删除环境变量

    要使用此方法删除环境变量,只需将其值设置为空字符串即可。

    PS51> $env:testvariable = ''

    使用 [System.Environment] .NET 类

    .NET 类[System.Environment] 还提供获取和设置环境变量的方法。这是直接访问各种环境范围并设置跨 PowerShell 会话生存的环境变量的唯一方法。

    在以下所有示例中,如果未提供范围,则假定为进程范围。

    使用[System.Environment]时,您将使用一些不同的.NET静态类方法。您不需要了解什么是静态方法。您只需要了解如何使用您将要学习的任何技术,您需要首先引用该类 ([System.Environment]),后跟两个冒号 (: :) 然后是方法。

    使用 [System.Environment] 列出环境变量

    如果您想查看特定范围内的所有环境变量,可以使用 GetEnvironmentVariables 方法。此方法返回指定为方法参数(在括号中)的范围内的所有环境变量。

    PS51> [System.Environment]::GetEnvironmentVariables('User')
    PS51> [System.Environment]::GetEnvironmentVariables('Machine')
    PS51> [System.Environment]::GetEnvironmentVariables('Process')
    
    # The same as Process
    PS51> [System.Environment]::GetEnvironmentVariables()

    使用[System.Environment]获取单个环境变量

    如果您需要查找特定的环境变量,可以通过两种不同的方式进行。

    • GetEnvironmentVariables(). - 不推荐
    GetEnvironmentVariable('<var name>','<scope>')

    获取环境变量()

    使用 GetEnvironmentVariables() 方法,您可以使用点表示法来引用该值。将 [System.Environment] 类和静态方法引用括在括号中,后跟一个点,然后是环境变量的名称,如下所示:

    PS51> ([System.Environment]::GetEnvironmentVariables()).APPDATA

    请注意,以这种方式引用环境变量时,必须确保大小写匹配!在上面的示例中,尝试使用 appdata 引用 APPDATA 变量。请改用 GetEnvironmentVariable()

    获取环境变量()

    不要使用 GetEnvironmentVariables() 方法,而是使用 GetEnvironmentVariable() 来查找单个环境变量。它解决了大小写问题,还允许您指定范围。

    要使用此方法,请指定环境变量名称以及您要查找该变量的范围,并以逗号分隔。

    PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','User')
    # Blank
    
    PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','Machine')
    # Blank
    
    PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','Process')  WIN10-1903
    
    # The same as Process
    PS51> [System.Environment]::GetEnvironmentVariable('ComputerName')
    WIN10-1903

    使用 [System.Environment] 设置环境变量

    使用 SetEnvironmentVariable() 方法为给定范围设置环境变量的值,或者创建一个新的环境变量(如果尚不存在)。

    在进程范围中设置变量时,您会发现进程范围是不稳定的,而用户和机器范围的更改是永久性的。

    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','User')
    
    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','Process')
    
    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','Machine')
    
     # The same as Process
    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha')

    注意:使用 32767 个字符或更多字符的变量名称或值调用 SetEnvironmentVariable 方法将导致抛出异常。

    使用 [System.Environment] 删除环境变量

    使用 SetEnvironmentVariable() 方法通过将环境变量的值设置为空字符串来删除给定范围的环境变量。

    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'User')
    
    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'Process')
    
    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'Machine')
    
    # The same as process
    PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '')

    有用的 PowerShell 环境变量

    与许多其他 Windows 应用程序一样,PowerShell 有一些自己的环境变量。需要了解的两个有用的环境变量是 PSExecutionPolicyPreference 和 PSModulePath。

    PSExecutionPolicyPreference

    PSExecutionPolicyPreference 环境变量存储当前的 PowerShell 执行策略。如果通过以下方式设置特定于会话的 PowerShell 执行策略,则会创建它:

    • 使用 ProcessScope 参数运行 Set-ExecutionPolicy cmdlet
    • 运行 powershell.exe 可执行文件来启动新会话,并使用 ExecutionPolicy 命令行参数设置会话策略。

    PSModulePath

    如果您未指定完整路径,则 PSModulePath 环境变量包含 PowerShell 搜索模块的路径。它的构成与标准 PATH 环境变量非常相似,各个目录路径以分号分隔。

    PS51> $env:PSModulePath
    C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

    快速提示:拆分每个文件夹以获取字符串数组,以便使用 $env:PSModulePath.split(';') 单独处理每个路径

    概括

    环境变量是获取有关正在运行的系统的信息或跨会话和重新启动存储信息的有用方法。无论您只是读取默认的 Windows 操作系统环境变量还是创建自己的环境变量,您现在都可以通过 PowerShell 使用多种方式来管理它们!

    进一步阅读

    • about_Environment_Variables
    • Microsoft 文档中的 .NET [System.Environment] 类
    • 了解 PowerShell 字符串格式和扩展字符串

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

    取消回复欢迎 发表评论:

    关灯