两个用来刷新Windows环境变量让会话即时生效的刷新脚本分享

环境变量刷新脚本:RefreshEnv.bat 和 RefreshEnv.ps1

在Windows系统中,环境变量对于程序的正常运行至关重要。当安装新软件或修改系统设置后,环境变量可能会发生变化,但这些变化通常需要重启命令提示符或PowerShell会话才能生效。为了解决这个问题,我们提供了两个脚本: RefreshEnv.bat (用于命令提示符和PowerShell会话) 和 RefreshEnv.ps1 (用于PowerShell),它们可以快速刷新当前会话的环境变量。

RefreshEnv.bat

这是一个批处理脚本,用于在命令提示符(cmd.exe)中刷新环境变量。

batch 复制代码
@echo off
::
:: RefreshEnv.cmd
::
:: Batch file to read environment variables from registry and
:: set session variables to these values.
::
:: With this batch file, there should be no need to reload command
:: environment every time you want environment changes to propagate

::echo "RefreshEnv.cmd only works from cmd.exe, please install the Chocolatey Profile to take advantage of refreshenv from PowerShell"
echo | set /p dummy="Refreshing environment variables from registry for cmd.exe. Please wait..."

goto main

:: Set one environment variable from registry key
:SetFromReg
    "%WinDir%\System32\Reg" QUERY "%~1" /v "%~2" > "%TEMP%\_envset.tmp" 2>NUL
    for /f "usebackq skip=2 tokens=2,*" %%A IN ("%TEMP%\_envset.tmp") do (
        echo/set "%~3=%%B"
    )
    goto :EOF

:: Get a list of environment variables from registry
:GetRegEnv
    "%WinDir%\System32\Reg" QUERY "%~1" > "%TEMP%\_envget.tmp"
    for /f "usebackq skip=2" %%A IN ("%TEMP%\_envget.tmp") do (
        if /I not "%%~A"=="Path" (
            call :SetFromReg "%~1" "%%~A" "%%~A"
        )
    )
    goto :EOF

:main
    echo/@echo off >"%TEMP%\_env.cmd"

    :: Slowly generating final file
    call :GetRegEnv "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" >> "%TEMP%\_env.cmd"
    call :GetRegEnv "HKCU\Environment">>"%TEMP%\_env.cmd" >> "%TEMP%\_env.cmd"

    :: Special handling for PATH - mix both User and System
    call :SetFromReg "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" Path Path_HKLM >> "%TEMP%\_env.cmd"
    call :SetFromReg "HKCU\Environment" Path Path_HKCU >> "%TEMP%\_env.cmd"

    :: Caution: do not insert space-chars before >> redirection sign
    echo/set "Path=%%Path_HKLM%%;%%Path_HKCU%%" >> "%TEMP%\_env.cmd"

    :: Cleanup
    del /f /q "%TEMP%\_envset.tmp" 2>nul
    del /f /q "%TEMP%\_envget.tmp" 2>nul

    :: capture user / architecture
    SET "OriginalUserName=%USERNAME%"
    SET "OriginalArchitecture=%PROCESSOR_ARCHITECTURE%"

    :: Set these variables
    call "%TEMP%\_env.cmd"

    :: Cleanup
    del /f /q "%TEMP%\_env.cmd" 2>nul

    :: reset user / architecture
    SET "USERNAME=%OriginalUserName%"
    SET "PROCESSOR_ARCHITECTURE=%OriginalArchitecture%"

    echo | set /p dummy="Finished."
    echo .

RefreshEnv.ps1

这是一个PowerShell脚本,用于在PowerShell会话中刷新环境变量。

powershell 复制代码
# RefreshEnv.ps1
#
# PowerShell脚本用于从注册表读取环境变量并设置会话变量

Write-Host "正在从注册表刷新cmd.exe的环境变量。请稍候..." -NoNewline

function Set-FromReg {
    param (
        [string]$regPath,
        [string]$name,
        [string]$varName
    )
    $value = Get-ItemProperty -Path $regPath -Name $name -ErrorAction SilentlyContinue
    if ($value) {
        Set-Item -Path Env:$varName -Value $value.$name
    }
}

function Get-RegEnv {
    param (
        [string]$regPath
    )
    $vars = Get-Item -Path $regPath
    foreach ($var in $vars.Property) {
        if ($var -ne "Path") {
            Set-FromReg $regPath $var $var
        }
    }
}

# 获取系统和用户环境变量
Get-RegEnv "HKLM:\System\CurrentControlSet\Control\Session Manager\Environment"
Get-RegEnv "HKCU:\Environment"

# 特殊处理PATH - 混合用户和系统路径
$path_HKLM = (Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Session Manager\Environment").Path
$path_HKCU = (Get-ItemProperty -Path "HKCU:\Environment").Path
$env:Path = "$path_HKLM;$path_HKCU"

# 保存原始用户名和架构
$OriginalUserName = $env:USERNAME
$OriginalArchitecture = $env:PROCESSOR_ARCHITECTURE

# 重置用户名和架构
$env:USERNAME = $OriginalUserName
$env:PROCESSOR_ARCHITECTURE = $OriginalArchitecture

Write-Host "完成。"

使用方法

  1. RefreshEnv.bat:

    • 将脚本保存为RefreshEnv.bat
    • 在命令提示符中,切换到脚本所在目录
    • 运行命令: RefreshEnv.bat
  2. RefreshEnv.ps1:

    • 将脚本保存为RefreshEnv.ps1
    • 在PowerShell中,切换到脚本所在目录
    • 运行命令: .\RefreshEnv.ps1

主要功用和意义

  1. 即时更新: 这两个脚本允许用户在不重启命令行或PowerShell会话的情况下,立即更新环境变量。

  2. 提高效率: 避免了频繁重启命令行工具的需要,特别是在安装新软件或修改系统设置后。

  3. 跨平台兼容: 提供了针对cmd和PowerShell两种常用命令行环境的解决方案。

  4. 保持一致性: 确保命令行环境与系统设置保持同步,减少因环境变量不一致导致的问题。

  5. 自动化友好: 这些脚本可以轻松集成到其他自动化流程中,确保环境变量始终是最新的。

通过使用这些脚本,用户可以更加高效地管理他们的开发和系统管理工作,减少因环境变量不一致导致的问题,提高工作效率。

相关推荐
Rverdoser1 小时前
Spring Boot整合EasyExcel
windows
天赐细莲1 小时前
(C语言) 8大翻译阶段
c语言·开发语言·c++·windows·微软·编辑器
南棱笑笑生1 小时前
20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件
服务器·网络·windows
微扬嘴角2 小时前
Java的LinkedList、HashSet与TreeSet
java·开发语言·windows
sanqima2 小时前
解决“磁盘已插上,但Windows系统无法识别“问题
windows·硬盘无法识别
幽兰的天空4 小时前
Java 基础之 List 深度探秘
java·linux·开发语言·windows
心如活水4 小时前
txt地图格式处理
windows
大驾C17 小时前
windows安装itop
windows·itop
百事牛19 小时前
精准打印指南:如何设置Excel打印范围?
windows·excel