使用windows系统时,当安装或解压一个可执行程序后,为了更方便的调用程序,往往会向环境变量 path中添加该程序的路径,一般都是通过图形界面来添加,这样比较麻烦,下面通过powershell命令行来实现同等效果。

注册表中存储环境变量的位置有两个:

# 存储用户环境变量
HKCU:\Environment\

# 存储系统环境变量
HKLM:\SYSTEM\ControlSet001\Control\Session Manager\Environment\

其分别对应下图的两个位置:

注意:

  • 若想操作当前登录用户的环境变量path,则修改注册表HKCU:\Environment\
  • 若想操作系统变量path,则可对注册表HKLM:\SYSTEM\ControlSet001\Control\Session Manager\Environment\进行修改

1、系统环境变量path

PWD C:\Users\fy\Desktop 🕐 2022-07-25 05:35:56
PS > $sysEnv = Get-Item 'HKLM:\SYSTEM\ControlSet001\Control\Session Manager\Environment\'

PWD C:\Users\fy\Desktop 🕐 2022-07-25 05:36:21
PS > $sysEnv.GetValue('path', '', [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) -split ';'
%SystemRoot%\system32
%SystemRoot%
%SystemRoot%\System32\Wbem
%SystemRoot%\System32\OpenSSH\
%SystemRoot%\System32\WindowsPowerShell\v1.0\
C:\Program Files\dotnet\
C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
C:\Program Files (x86)\VMware\VMware Workstation\bin\
C:\ProgramData\chocolatey\bin
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\
C:\Program Files (x86)\dotnet\

2、用户环境变量path

PWD C:\Users\fy\Desktop 🕐 2022-07-25 05:34:42
PS > $userEnv = Get-Item HKCU:\Environment\

PWD C:\Users\fy\Desktop 🕐 2022-07-25 05:34:55
PS > $userEnv.GetValue('path', '', [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) -split ';'
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\
C:\Program Files\MySQL\MySQL Server 8.0\bin\
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.2.5.0_x64__8wekyb3d8bbwe
C:\soft_bin\
C:\Users\fy\.dotnet\tools
C:\Users\fy\AppData\Local\Microsoft\WindowsApps
C:\Users\fy\scoop\shims
C:\Users\fy\scoop\apps\graphviz\current\bin\
C:\Users\fy\scoop\apps\gsudo\current
C:\Users\fy\scoop\apps\llvm\current\bin
C:\Users\fy\scoop\apps\mingw\current\bin
C:\Users\fy\scoop\apps\mongodb-database-tools\current\bin
C:\Users\fy\scoop\apps\nodejs-lts\current
C:\Users\fy\scoop\apps\nodejs-lts\current\bin
C:\Users\fy\scoop\apps\python39\current
C:\Users\fy\scoop\apps\python39\current\Scripts
C:\Users\fy\scoop\apps\vscode\current\bin
C:\wsr\jdk-11.0.15.1\bin
C:\wsr\Neovim\bin
C:\wsr\Vim\vim90\
C:\wsr\WinRAR\

1 管理环境变量 PATH

1.1 添加powershell函数

function kmanage-env-path {
    <#
    .DESCRIPTION
    管理用户或系统环境变量 PATH ,支持该变量值的添加、删除、查看

    .PARAMETER add
    向 PATH 中添加值时必须添加的参数

    .PARAMETER delete
    从 PATH 中删除值时必须添加的参数

    .PARAMETER view
    查看 PATH 中的值时必须添加的参数

    .PARAMETER paths
    向 PTATH 中添加或删除值时必须传递的参数,参数值为待添加或删除的路径,支持同
    时添加或删除多个路径,传递多个路径值时,每个路径用英文逗号分隔,若路径值中有
    空格,则要用引号将路径括住

    .PARAMETER machine
    要操作的 PATH 的类型,默认对用户环境变量 PATH 进行操作,若要操作系统环境变量
    PATH,则开启此开关

    .PARAMETER y
    若开启此开关则不确认直接删除,否则删除前向用户确认

    .EXAMPLE
    kmanage-env-path -add c:\users\fy\desktop
    向用户环境变量 PATH 中添加值

    .EXAMPLE
    kmanage-env-path -add c:\users\fy\desktop, "c:\Program Files\path\to\bin" -machine
    向系统环境变量 PATH 中添加值。

    .EXAMPLE
    kmanage-env-path -delete c:\users\fy\desktop -y
    从用户环境变量 PATH 中删除值,删除时不确认

    .EXAMPLE
    kmanage-env-path -delete c:\users\fy\desktop, "c:\Program Files\path\to\bin"
    从用户环境变量 PATH 中删除值

    .EXAMPLE
    kmanage-env-path -delete $(kmanage-env-path -view | grep -i python)
    从用户环境变量 PATH 中删除所有带 python 的路径

    .EXAMPLE
    kmanage-env-path -delete "c:\Program Files\path\to\bin" -machine
    从系统环境变量 PATH 中删除值
    注意:修改系统环境变量 PATH 时需要以管理员权限打开 powershell 运行函数,查看
        则不需要管理员权限

    .EXAMPLE
    kmanage-env-path -view
    查看用户环境变量 PATH 中的值

    .EXAMPLE
    kmanage-env-path -view -machine
    查看系统环境变量 PATH 中的值
    #>
    Param(
        [Parameter(ParameterSetName = 'AddPath', Mandatory)]
        [Switch]$add,
        [Parameter(ParameterSetName = 'DelPath', Mandatory)]
        [Switch]$delete,
        [Parameter(ParameterSetName = 'ViewPath', Mandatory)]
        [Switch]$view,

        [Parameter(ParameterSetName = 'AddPath', Mandatory, Position = 1)]
        [Parameter(ParameterSetName = 'DelPath', Mandatory, Position = 1)]
        $paths,

        [Parameter(ParameterSetName = 'AddPath')]
        [Parameter(ParameterSetName = 'DelPath')]
        [Parameter(ParameterSetName = 'ViewPath')]
        [switch]$machine,

        [Parameter(ParameterSetName = 'DelPath')]
        [Switch]$y
    )

    begin {
        $regKey = if ($machine) {
            'HKLM:\SYSTEM\ControlSet001\Control\Session Manager\Environment\'
        } else {
            'HKCU:\Environment'
        }

        $regVal = (Get-Item -Path $regKey).GetValue("PATH", "",
            [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)

        if (';' -ne $regVal.Chars($regVal.Length - 1)) { $regVal += ';' }
    }
    process {
        switch ($PSCmdlet.ParameterSetName) {
            'AddPath' {
                foreach ($entry in $paths) {
                    $entry = $entry.Trim()
                    if ([string]::IsNullOrEmpty($entry)) { continue }
                    $regVal += $entry + ';'
                }
            }
            'DelPath' {
                foreach ($entry in $paths) {
                    $entry = $entry.Trim()
                    if ([string]::IsNullOrEmpty($entry)) { continue }

                    #在参数末尾添加路径分隔符 \
                    if ('\' -ne $entry.Chars($entry.Length - 1)) {
                        $entry += '\'
                    }
                    $entry += ';'

                    # 若注册表中对应的路径末尾没有 \,则删除 \ 重新匹配
                    if ($regVal.IndexOf($entry) -eq -1) {
                        $entry = $entry.Remove($entry.Length - 2, 1)
                    }

                    #去掉参数末尾 \ 后,再次检测。若存在对应值,则执行删除操作
                    if ($regVal.IndexOf($entry) -ne -1) {
                        switch ($y) {
                            $true { $regVal = $regVal.Replace($entry, '') }
                            Default {
                                $choice = Read-Host "确定删除 `'$($entry.Remove($entry.Length - 1))`' (y/n)?"
                                if ('y' -eq $choice) {
                                    $regVal = $regVal.Replace($entry, '')
                                }
                            }
                        }
                    }
                }
            }
            'ViewPath' {
                $regVal.Split(';')
            }
        }
    }
    end {
        #将修改后的 PATH 值写回注册表
        if ($PSCmdlet.ParameterSetName -ne "ViewPath" -and ($regVal.Length -gt 0)) {
            Set-ItemProperty -Path $regKey -Name Path -Value $regVal
        }
    }
}

打开powershell,将上述函数添加到 powershell 配置文件中,请执行.$profile命令或重新打开一个powershell实例才能使用函数。如果没有则在目录下新建对应文件即可:

#powershell 5.x 配置文件
C:\Users\username\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

#powershell 7.x 配置文件
C:\Users\username\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

在这里插入图片描述

添加之后,使用时只需要调用相应函数并传递参数即可。实现的效果是永久性的,因为是通过直接操作注册表实现的。注意:

  • 若操作的是用户环境变量 PATH,需要注销登陆并重新登陆,才能使更改生效
  • 若操作的是系统环境变量 PATH,则需要重启电脑使之生效

1.2 函数用法

修改系统环境变量path时,需用管理员权限执行powershell

PS > man kmanage-env-path

NAME
    kmanage-env-path
    
SYNOPSIS
    
    
SYNTAX
    kmanage-env-path -add [-paths] <Object> [-machine] [<CommonParameters>]
    
    kmanage-env-path -delete [-paths] <Object> [-machine] [-y] [<CommonParameters>]
    
    kmanage-env-path -view [-machine] [<CommonParameters>]
    
    
DESCRIPTION
    管理用户或系统环境变量 PATH ,支持该变量值的添加、删除、查看
    

PARAMETERS
    -add [<SwitchParameter>]PATH 中添加值时必须添加的参数
        
        Required?                    true
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -delete [<SwitchParameter>]PATH 中删除值时必须添加的参数
        
        Required?                    true
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -view [<SwitchParameter>]
        查看 PATH 中的值时必须添加的参数
        
        Required?                    true
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -paths <Object>
        向 PTATH 中添加或删除值时必须传递的参数,参数值为待添加或删除的路径,支持同
        时添加或删除多个路径,传递多个路径值时,每个路径用英文逗号分隔,若路径值中有
        空格,则要用引号将路径括住
        
        Required?                    true
        Position?                    2
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -machine [<SwitchParameter>]
        要操作的 PATH 的类型,默认对用户环境变量 PATH 进行操作,若要操作系统环境变量
        PATH,则开启此开关
        
        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -y [<SwitchParameter>]
        若开启此开关则不确认直接删除,否则删除前向用户确认
        
        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216). 
    
INPUTS
    
OUTPUTS
    
    -------------------------- EXAMPLE 1 --------------------------
    
    PS > kmanage-env-path -add c:\users\fy\desktop
    向用户环境变量 PATH 中添加值
    
    
    
    
    
    
    -------------------------- EXAMPLE 2 --------------------------
    
    PS > kmanage-env-path -add c:\users\fy\desktop, "c:\Program Files\path\to\bin" -machine
    向系统环境变量 PATH 中添加值。
    
    
    
    
    
    
    -------------------------- EXAMPLE 3 --------------------------
    
    PS > kmanage-env-path -delete c:\users\fy\desktop -y
    从用户环境变量 PATH 中删除值,删除时不确认
    
    
    
    
    
    
    -------------------------- EXAMPLE 4 --------------------------
    
    PS > kmanage-env-path -delete c:\users\fy\desktop, "c:\Program Files\path\to\bin"
    从用户环境变量 PATH 中删除值
    
    
    
    
    
    
    -------------------------- EXAMPLE 5 --------------------------
    
    PS > kmanage-env-path -delete $(kmanage-env-path -view | grep -i python)
    从用户环境变量 PATH 中删除所有带 python 的路径
    
    
    
    
    
    
    -------------------------- EXAMPLE 6 --------------------------
    
    PS > kmanage-env-path -delete "c:\Program Files\path\to\bin" -machine
    从系统环境变量 PATH 中删除值
    注意:修改系统环境变量 PATH 时需要以管理员权限打开 powershell 运行函数,查看
        则不需要管理员权限
    
    
    
    
    
    
    -------------------------- EXAMPLE 7 --------------------------
    
    PS > kmanage-env-path -view
    查看用户环境变量 PATH 中的值
    
    
    
    
    
    
    -------------------------- EXAMPLE 8 --------------------------
    
    PS > kmanage-env-path -view -machine
    查看系统环境变量 PATH 中的值

2 管理非 PATH 环境变量

对于系统中非 PATH 以外的环境变量,可直接利用 .net 静态方法来设置,方法如下。

官方文档

1、方法概述

SetEnvironmentVariable(String, String, EnvironmentVariableTarget)	
创建、修改或删除当前进程中或者为当前用户或本地计算机保留的 Windows 操作系统注册表项中存储的环境变量。

2、使用说明

[System.Environment]::SetEnvironmentVariable(变量名, 变量值, 变量作用范围)
变量值如果为空字符串则删除该变量,不空则创建或修改该变量,作用范围为 “user” 或 “machine”,
分别对应用户环境变量和系统环境变量

# 创建
PS > [Environment]::SetEnvironmentVariable("A_SAMPLE_VAR", "$home\desktop", "user")
# [Environment]::SetEnvironmentVariable("A_SAMPLE_VAR", "$home\desktop", "machine")

# 修改
PS > [Environment]::SetEnvironmentVariable("A_SAMPLE_VAR", "$home\desktop\test", "user")

# 删除
PS > [Environment]::SetEnvironmentVariable("A_SAMPLE_VAR", "", "user")

若设置用户环境变量,则需注销并重新登陆才能生效;系统环境变量则需重启才能生效。

3、示例

GitHub 加速计划 / po / PowerShell
16
2
下载
PowerShell/PowerShell: PowerShell 是由微软开发的命令行外壳程序和脚本环境,支持任务自动化和配置管理。它包含了丰富的.NET框架功能,适用于Windows和多个非Windows平台,提供了一种强大而灵活的方式来控制和自动执行系统管理任务。
最近提交(Master分支:4 个月前 )
a1774fd9 4 个月前
5ad1f1d2 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐