PowerShell实现Win11环境变量追加及备份

发布时间 2023-07-24 22:26:44作者: Mkdir-p

最近重装了系统,之前配置的环境又得重新配置,感觉很繁琐所以查阅资料实现了用脚本配置环境变量,这样只要保留原先的JDK等环境文件夹就可以一键配置了。

一开始我准备采用比较熟悉的bat脚本来实现

setx PATH "%PATH%;%myPath%"  /m

setx会覆盖原有path!!,故最后使用PowerShell实现,脚本如下

# 追加环境变量path 。文件夹下执行打开PowerShell输入& '.\新建.ps1'回车即可
$envPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
$newPaths = @(
    "C:\Users\zbz12\Desktop",
    "C:\Users\zbz12\Desktop\RapidEEx64\HHH",
"C:\Users\zbz12\Desktop\RapidEEx64"
    # 添加更多新路径如JavaPath之类的...
)

foreach ($newPath in $newPaths) {
    if ($envPath -notlike "*$newPath*") {
        $envPath += ";$newPath"
    }
}

[Environment]::SetEnvironmentVariable("Path", $envPath, "Machine")

Write-Host "新路径已添加至系统环境变量Path。"`

这段代码是用于将指定的文件夹路径添加到系统环境变量Path中,并输出提示信息。

首先,代码通过使用[Environment]::GetEnvironmentVariable("Path", "Machine")获取了当前系统环境变量Path的值,并将其存储在变量$envPath中。

接下来,定义了一个新数组$newPaths,其中包含了要添加到环境变量Path中的文件夹路径。

然后,通过foreach循环遍历每个新路径$newPath

  • 使用条件判断$envPath -notlike "*$newPath*"来检查新路径是否已经存在于环境变量Path中。如果不存在,则执行下面的代码。
  • 将新路径$newPath追加到$envPath后面,并在路径之间添加分号。
  • 最后,使用[Environment]::SetEnvironmentVariable("Path", $envPath, "Machine")将更新后的$envPath值设置为系统环境变量Path。

最后,使用Write-Host输出提示信息"新路径已添加至系统环境变量Path。"。

请注意,此脚本需要以管理员权限运行才能成功修改系统环境变量。

脚本改进

本来到这里就结束了但经过测试,发现脚本会把Path 中引用的变量会被自动替换为变量的值,如 %JAVA_HOME% 会被替换为 JAVA_HOME所在位置如D:\008_Soft\Java\JDK1.8。又是一番查阅我找到了[Environment]::ExpandEnvironmentVariables()方法

[Environment]::ExpandEnvironmentVariables()是一个静态方法,它属于System.Environment类,用于扩展或展开环境变量的引用。

环境变量是在操作系统中定义的一些特定值,用于存储有关系统配置、用户配置和其他信息的数据。在Windows系统中,环境变量通常使用%变量名%的形式表示,例如%windir%表示Windows系统目录的路径。

[Environment]::ExpandEnvironmentVariables()方法接受一个字符串参数,该参数包含环境变量引用。它会将引用的环境变量替换为实际的值,并返回替换后的字符串。

例如,假设$newPath的值为%windir%\System32,即Windows系统目录下的System32文件夹。使用[Environment]::ExpandEnvironmentVariables($newPath)会将%windir%替换为实际的Windows系统目录路径,返回C:\WINDOWS\System32

在脚本中,我们使用[Environment]::ExpandEnvironmentVariables($newPath)来获取新路径中环境变量的实际值,并将其存储在变量$expandedPath中。这样,无论新路径中是否包含环境变量引用,我们都可以确保将实际的路径添加到环境变量Path中。

最终脚本如下

$envPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
$newPaths = @(
    "C:\Users\zbz12\Desktop",
    "C:\Users\zbz12\Desktop\RapidEEx64\HHH",
    "C:\Users\zbz12\Desktop\RapidEEx64"
    # 添加更多新路径...
)

foreach ($newPath in $newPaths) {
    $expandedPath = [Environment]::ExpandEnvironmentVariables($newPath)
    if ($envPath -notlike "*$expandedPath*") {
        $envPath += ";$expandedPath"
    }
}

[Environment]::SetEnvironmentVariable("Path", $envPath, "Machine")

Write-Host "新路径已添加至系统环境变量Path。"

将以上代码保存为add_path.ps1文件,运行PowerShell,导航到脚本所在的目录,执行以下命令来运行脚本:

& '.\add_path.ps1'
脚本将读取系统中的Path环境变量,然后,脚本会检查Path环境变量是否包含以前存在的%%变量。如果包含,则不修改Path环境变量;如果不包含,则将新的文件夹路径追加到Path环境变量中。

执行完毕后,可以在PowerShell中输入$env:Path来验证Path环境变量是否成功追加了新的文件夹路径,且不展开以前存在的%%变量。