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