# 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
}
}