Windows 注册表

注册表是Windows操作系统中的一个重要数据库,用于存储系统和应用程序的设置和配置。

注册表项介绍

  • HKEY_CLASSES_ROOT 存储了文件类型和关联的应用程序信息,一般用于双击时打开何种程序。
  • HKEY_CURRENT_USER 存储当前用户的个人设置和信息,包括桌面背景、文件夹选项等。
  • HKEY_LOCAL_MACHINE 存储了计算机的硬件信息和软件配置信息,包括设备驱动程序、系统服务等。
  • HKEY_USERS 存储了系统中所有用户的设置和配置,包括HKEY_CURRENT_USER的用户信息。
  • HKEY_CURRENT_CONFIG 存储了当前系统的硬件配置信息,包括处理器、内存、显示器等。
  • HKEY_DYN_DATA 存储了系统的动态硬件信息,包括正在使用的硬件设备的信息。例如内存、处理器等。
  • HKEY_PERFORMANCE_DATA 存储了系统性能相关信息,例如CPU使用率、磁盘IO等。
  • HKEY_PERFORMANCE_DATA:存储系统性能数据,包括系统启动时间、CPU利用率、内存使用情况等。
  • HKEY_USERS.DEFAULT:存储新用户的默认配置信息。

常见注册表项

  • HKEY_CLASSES_ROOT\Directory 存储了Windows资源管理器中文件夹的默认视图和行为。
  • HKEY_CURRENT_USER\Control Panel\Desktop 存储了桌面相关的配置信息,例如屏幕保护程序、背景图片等。
  • HKEY_LOCAL_MACHINE\Software 存储了安装在系统中的应用程序的配置信息。
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet 存储了系统的当前配置信息,包括驱动程序、系统服务等。
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum 存储硬件设备的配置信息。
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 存储了Windows系统服务的配置信息。
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 存储系统环境变量的配置信息。
  • HKEY_LOCAL_MACHINE\Software\Classes 存储文件类型关联信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main 存储Internet Explorer浏览器的主要配置信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion 存储系统的版本信息和用户配置信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon 存储Windows登录界面的配置信息,例如自动登录、欢迎动画等。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32 存储了Windows系统的音频驱动程序相关的配置信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies 存储系统策略的配置信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 存储Windows启动时需要自动运行的程序信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 存储已安装程序的卸载信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders:存储Windows资源管理器中各个文件夹的路径信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders:存储当前用户的Windows资源管理器中各个文件夹的路径信息。
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings:存储Internet Explorer浏览器的Internet设置信息。

以上是一些常见的注册表键,它们的作用和用途非常广泛。虽然修改注册表可能会对系统造成一定的影响,但了解注册表的基本知识还是很有必要的,因为在某些情况下,更改注册表是解决系统问题的有效方法。

为方便整理数据实现了一套Powershell脚本,代码如下:

# Env-Helper.ps1
# 定义JSON数据的地址
# JSON: [{"name":"JAVA_HOME","value":"E:/tmp/jdk","default":true,"type":"Machine"},...]
# name:环境变量名;value:环境变量值;type:环境变量类型<Machine|User>;default:是否为默认变量
$jsonUrl = "https://example.com/env.json"

$currentDirectory = $PWD.Path

# 导入JSON数据
function getJsonData($url) {
    return Invoke-RestMethod -Uri $url
}

# 备份环境变量
function backupEnv($type) {
    # 定义备份文件名
    $backupFileName = $currentDirectory + "\Env-$type-$(Get-Date -Format 'yyyy-MM-dd').reg"
    # 备份环境变量
    switch ($type) {
        "Machine" { Start-Process -FilePath "reg.exe" -ArgumentList "export HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment `"$backupFileName`" /y" -Verb RunAs -Wait }
        "User" { Start-Process -FilePath "reg.exe" -ArgumentList "export HKCU\Environment `"$backupFileName`" /y" -Wait }
        "All" { backupEnv "Machine"; backupEnv "User" }
    }
	
}

# 重置环境变量
function resetEnv() {
    $json = getJsonData $jsonUrl;

    # 备份环境变量
    backupEnv "All"

    # 删除现有环境变量
    Remove-Item -Path "Env-All-$(Get-Date -Format 'yyyy-MM-dd').reg" -Force -ErrorAction Ignore
    Remove-Item -Path "Env-Machine-$(Get-Date -Format 'yyyy-MM-dd').reg" -Force -ErrorAction Ignore
    Remove-Item -Path "Env-User-$(Get-Date -Format 'yyyy-MM-dd').reg" -Force -ErrorAction Ignore

    # 添加默认环境变量
    foreach ($envVar in $json) {
        if ($envVar.default) {
            switch ($envVar.type) {
                "Machine" { [Environment]::SetEnvironmentVariable($envVar.name, $envVar.value, "Machine") }
                "User" { [Environment]::SetEnvironmentVariable($envVar.name, $envVar.value, "User") }
            }
        }
    }
}

# 整理环境变量
function trimEnv($type) {
    $json = getJsonData $jsonUrl

    # 备份环境变量
    backupEnv $type

    # 获取现有环境变量
    switch ($type) {
        "Machine" { $envVars = Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"* }
        "User" { $envVars = Get-ItemProperty -Path "Registry::HKEY_CURRENT_USER\Environment\"* }
        "All" { trimEnv "Machine"; trimEnv "User"; return }
    }
    
    # 整理环境变量
    foreach ($envVar in $envVars) {
        foreach ($jsonEnvVar in $json) {
            if ($jsonEnvVar.default -and $jsonEnvVar.type -eq $type -and $envVar.PSChildName -eq $jsonEnvVar.name) {
                [Environment]::SetEnvironmentVariable($envVar.PSChildName, $jsonEnvVar.value, $type)
                break
            }
        }
    }
}

# 列出环境变量
function listEnv($type, $name, $value) {
    # 获取现有环境变量
    switch ($type) {
        'Machine' {
            $envVars = [Environment]::GetEnvironmentVariables('Machine')
            break
        }
        'User' {
            $envVars = [Environment]::GetEnvironmentVariables('User')
            break
        }
        default {
            $envVarsMachine = [Environment]::GetEnvironmentVariables('Machine')
            $envVarsUser = [Environment]::GetEnvironmentVariables('User')
            $envVars = $envVarsMachine.Clone()
            foreach ($key in $envVarsUser.Keys) {
                if (-not $envVars.Contains($key)) {
                    $envVars.Add($key, $envVarsUser[$key])
                }
            }
        }
    }
    # 根据条件过滤 
    $envVars.GetEnumerator() | Where-Object {
        if ($name -and $value) {
            $_.Key -like "*$name*" -and $_.Value -like "*$value*"
        } elseif ($name) {
            $_.Key -like "*$name*"
        } elseif ($value) {
            $_.Value -like "*$value*"
        } else {
            $true
        }
    } | ForEach-Object {
        Write-Output "$($_.Key)=$($_.Value)"
    }
}

function addEnv($type, $keyValue) {
    $path = getEnvPath $type
    $key = $keyValue.split('=')[0]
    $value = $keyValue.split('=')[1]
    if (!$key -or !$value) {
        Write-Host "Invalid parameter. Usage: add <Machine|User> <key=value>"
        return
    }
    $existing = getEnv $type
    $existing | Where-Object { $_.name -eq $key } | ForEach-Object {
        Write-Host "Key '$key' already exists. Please use 'set' command to update its value."
        return
    }
    $env = New-Object System.Collections.Specialized.StringDictionary
    $env.Add($key, $value)
    if ($type -eq "Machine") {
        $env | Export-Clixml -Path $path -Force
        $machineEnv = [System.EnvironmentVariableTarget]::Machine
        [System.Environment]::SetEnvironmentVariable($key, $value, $machineEnv)
    } else {
        $env | Export-Clixml -Path $path -Force
        $userEnv = [System.EnvironmentVariableTarget]::User
        [System.Environment]::SetEnvironmentVariable($key, $value, $userEnv)
    }
    Write-Host "Key '$key' added successfully."
}

function delEnv($type, $keyValue) {
    # 备份环境变量
    backupEnv $type

    # 获取待删除的环境变量
    $envsToDelete = $keyValue | ForEach-Object {
        $kv = $_ -split '=', 2
        [PSCustomObject]@{
            key = $kv[0]
            value = $kv[1]
        }
    }

    # 遍历待删除的环境变量
    foreach ($envToDelete in $envsToDelete) {
        $key = $envToDelete.key
        $value = $envToDelete.value

        # 获取环境变量的名称
        $envName = if ($type -eq 'Machine') {
            "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\$key"
        } else {
            "HKCU:\Environment\$key"
        }

        # 判断环境变量是否存在
        if (Test-Path $envName) {
            # 删除环境变量
            Remove-ItemProperty $envName -Name $key -Force
            Write-Host "Deleted environment variable '$key' with value '$value'."
        } else {
            Write-Host "Environment variable '$key' with value '$value' does not exist."
        }
    }

    # 刷新环境变量
    flushEnv
}

function defaultEnv($type, $all) {
    $json = getJsonData $jsonUrl
    # 获取现有环境变量
    $envs = getEnvs $type

    # 备份现有环境变量
    backupEnvs $type

    # 根据json数据进行处理
    foreach ($env in $json) {
        # 如果是指定类型或者是全部类型
        if ($env.type -eq $type -or $all) {
            # 如果default为true或者使用-a参数
            if ($env.default -or $all) {
                # 如果当前变量已存在,则替换其值
                if ($envs.ContainsKey($env.name)) {
                    $envs[$env.name] = $env.value
                }
                # 否则,新增一个变量
                else {
                    $envs.Add($env.name, $env.value)
                }
            }
        }
    }

    # 保存修改
    setEnvs $envs
}

function switchEnv($type, $name) {
    # 获取现有环境变量
    $envs = getEnvs $type

    # 如果该变量不存在,输出错误信息
    if (!$envs.ContainsKey($name)) {
        Write-Error "The environment variable $name does not exist"
        return
    }

    # 如果该变量只有一个值,输出错误信息
    $values = $envs[$name] -split ";"
    if ($values.Length -lt 2) {
        Write-Error "The environment variable $name only has one value"
        return
    }

    # 轮询切换
    $newValue = $values[1..($values.Length - 1)] + $values[0]
    $envs[$name] = $newValue -join ";"

    # 保存修改
    setEnvs $envs
}

function flushEnv() {
    $envVars = [System.Environment]::GetEnvironmentVariables()
    foreach ($key in $envVars.Keys) {
        [System.Environment]::SetEnvironmentVariable($key, $envVars[$key], [System.EnvironmentVariableTarget]::Process)
    }
    Write-Output "Environment variables flushed successfully."
}

function Show-Help {
    Write-Host "Usage: "
    Write-Host "backup [All|Machine|User]: Backup environment variables. Default: All"
    Write-Host "reset: Reset environment variables to default values."
    Write-Host "trim [All|Machine|User]: Trim environment variables."
    Write-Host "list <-a|-m|-u> [-n <name>] [-v <value>]: List environment variables."
    Write-Host "add <Machine|User> <key=value>: Add a new environment variable."
    Write-Host "del <Machine|User> <key=value>: Delete an environment variable."
    Write-Host "default <All|Machine|User> [-a]: Update environment variables with default values."
    Write-Host "switch <Machine|User> <name>: Switch values of the specified environment variable."
    Write-Host "flush: Flush environment variables to make changes take effect in the current session."
}


# 处理命令
switch ($args[0]) {
    "backup" {
        if ($args.Length -eq 1) {
            backupEnv "All"
        } else {
            backupEnv $args[1]
        }
    }
    "reset" {
        backupEnv "All"
        resetEnv
    }
    "trim" {
        if ($args.Length -eq 1) {
            trimEnv "All"
        } else {
            trimEnv $args[1]
        }
    }
    "list" {
        if ($args.Length -eq 1) {
            listEnv "All" $null $null
        } else {
            $type = ""
            if ($args[1] -eq "-m") {
                $type = "Machine"
            } elseif ($args[1] -eq "-u") {
                $type = "User"
            } elseif ($args[1] -eq "-a") {
                $type = "All"
            }
            $name = $args | ? {$_ -match "^-n="} | %{$_ -replace "^-n=",""}
            $value = $args | ? {$_ -match "^-v="} | %{$_ -replace "^-v=",""}
            listEnv $type $name $value
        }
    }
    "add" {
        addEnv $args[1] $args[2]
    }
    "del" {
        backupEnv $args[1]
        delEnv $args[1] $args[2]
    }
    "default" {
        if ($args.Length -eq 1) {
            defaultEnv "All" $false
        } elseif ($args[1] -eq "-a") {
            defaultEnv $args[2] $true
        } else {
            defaultEnv $args[1] $false
        }
    }
    "switch" {
        switchEnv $args[1] $args[2]
    }
    "flush" {
        [Environment]::SetEnvironmentVariable("dummy", "1", "User")
        [Environment]::SetEnvironmentVariable("dummy", "1", "Machine")
        [Environment]::SetEnvironmentVariable("dummy", "1", "Process")
        [Environment]::SetEnvironmentVariable("dummy", $null, "User")
        [Environment]::SetEnvironmentVariable("dummy", $null, "Machine")
        [Environment]::SetEnvironmentVariable("dummy", $null, "Process")
    }
    default {
        Show-Help
    }
}

Windows 注册表
https://blog.cikaros.top/doc/5ef1aa76.html
作者
Cikaros
发布于
2023年3月14日
许可协议