无法使用powershell设置多个路径变量
Not able to set multiple path variable using powershell
我正在尝试使用 PowerShell 设置多个路径变量,但只附加了最后一个。
[Environment]::SetEnvironmentVariable('JAVA_HOME', 'C:\Program Files\Java\jdk-13.0.2', 'User')
[Environment]::SetEnvironmentVariable('JAVA_HOME', 'C:\Program Files\Java\jdk-13.0.2', 'Machine')
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Java\jdk-13.0.2\bin", "User")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Java\jdk-13.0.2\bin", "Machine")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Windows\System32", "User")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Windows\System32", "Machine")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\apache-jmeter-5.2.1\bin", "User")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\apache-jmeter-5.2.1\bin", "Machine")
'JAVA_HOME' 创建成功。
但是在路径中只有最后一个被附加,即 'C:\apache-jmeter-5.2.1\bin'
这个脚本存在三个问题:
- 当您将
[Environment]::SetEnvironmentVariable
与 Process
以外的任何范围一起使用时,它不会更新当前进程的环境
如果要永久设置并且影响当前进程,需要调用两次
- 您正在使用相同的值更新用户 和 机器范围
在 Windows,默认进程环境变量是通过在默认机器环境之上分层默认用户环境构建的。因此,一方面,在两个范围内将相同的 JAVA_HOME 设置为相同的值是 reduntant。
- 您正在根据进程
中的组合值更新默认 PATH 值
路径变量比较特殊。过程值是用户和机器环境的组合。因此,其他环境变量中仅仅是多余的东西可能会导致 PATH 变量出现真正的问题,因为向这两个值添加一个文件夹会导致它在您的进程环境路径中有两个副本。
正因为如此,您永远不应将用户范围 或机器范围 设置为进程中的值,但尤其不要同时设置它们。
例如:
- 如果用户值只是 "C:\Users\Jaykul\Documents\PowerShell\Scripts"
- 而机器值只是 "C:\Windows\System32"
- 进程会得到"C:\Windows\System32;C:\Users\Jaykul\Documents\PowerShell\Scripts"
如果你接受它,并向它附加一些东西,然后将它设置回 both,你将得到 two of everything 在你开始一个新进程时在你的新路径中。
正确的做法是:
- 只修改一个范围(机器范围,或用户范围)。
- 根据您正在更新的内容进行更新。
- 同时更新进程作用域,这样您就可以知道发生了什么。
我有一个 "Environment" 模块,它位于 PowerShell 库 and github that has a Add-Path 函数中,可以执行所有这些操作,但基础知识是:
function Add-Path {
param($Path, [ValidateSet("User","Machine")]$Scope)
# Update what we were asked to update
[Environment]::SetEnvironmentVariable("Path",
([Environment]::GetEnvironmentVariable("Path", $Scope) + [IO.Path]::PathSeparator + $Path),
$Scope)
# Also update the process scope
[Environment]::SetEnvironmentVariable("Path",
([Environment]::GetEnvironmentVariable("Path", "Process") + [IO.Path]::PathSeparator + $Path),
"Process")
}
当然,我链接到的模块中的功能不止于此,确保没有重复,并确保将新路径插入到正确位置的进程中(即机器范围在用户范围之前), 但这是基础...
我正在尝试使用 PowerShell 设置多个路径变量,但只附加了最后一个。
[Environment]::SetEnvironmentVariable('JAVA_HOME', 'C:\Program Files\Java\jdk-13.0.2', 'User')
[Environment]::SetEnvironmentVariable('JAVA_HOME', 'C:\Program Files\Java\jdk-13.0.2', 'Machine')
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Java\jdk-13.0.2\bin", "User")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Java\jdk-13.0.2\bin", "Machine")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Windows\System32", "User")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Windows\System32", "Machine")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\apache-jmeter-5.2.1\bin", "User")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\apache-jmeter-5.2.1\bin", "Machine")
'JAVA_HOME' 创建成功。 但是在路径中只有最后一个被附加,即 'C:\apache-jmeter-5.2.1\bin'
这个脚本存在三个问题:
- 当您将
[Environment]::SetEnvironmentVariable
与Process
以外的任何范围一起使用时,它不会更新当前进程的环境
如果要永久设置并且影响当前进程,需要调用两次
- 您正在使用相同的值更新用户 和 机器范围
在 Windows,默认进程环境变量是通过在默认机器环境之上分层默认用户环境构建的。因此,一方面,在两个范围内将相同的 JAVA_HOME 设置为相同的值是 reduntant。
- 您正在根据进程 中的组合值更新默认 PATH 值
路径变量比较特殊。过程值是用户和机器环境的组合。因此,其他环境变量中仅仅是多余的东西可能会导致 PATH 变量出现真正的问题,因为向这两个值添加一个文件夹会导致它在您的进程环境路径中有两个副本。
正因为如此,您永远不应将用户范围 或机器范围 设置为进程中的值,但尤其不要同时设置它们。
例如:
- 如果用户值只是 "C:\Users\Jaykul\Documents\PowerShell\Scripts"
- 而机器值只是 "C:\Windows\System32"
- 进程会得到"C:\Windows\System32;C:\Users\Jaykul\Documents\PowerShell\Scripts"
如果你接受它,并向它附加一些东西,然后将它设置回 both,你将得到 two of everything 在你开始一个新进程时在你的新路径中。
正确的做法是:
- 只修改一个范围(机器范围,或用户范围)。
- 根据您正在更新的内容进行更新。
- 同时更新进程作用域,这样您就可以知道发生了什么。
我有一个 "Environment" 模块,它位于 PowerShell 库 and github that has a Add-Path 函数中,可以执行所有这些操作,但基础知识是:
function Add-Path {
param($Path, [ValidateSet("User","Machine")]$Scope)
# Update what we were asked to update
[Environment]::SetEnvironmentVariable("Path",
([Environment]::GetEnvironmentVariable("Path", $Scope) + [IO.Path]::PathSeparator + $Path),
$Scope)
# Also update the process scope
[Environment]::SetEnvironmentVariable("Path",
([Environment]::GetEnvironmentVariable("Path", "Process") + [IO.Path]::PathSeparator + $Path),
"Process")
}
当然,我链接到的模块中的功能不止于此,确保没有重复,并确保将新路径插入到正确位置的进程中(即机器范围在用户范围之前), 但这是基础...