muh*_*san 5 windows powershell environment-variables
我正在尝试通过Powershell脚本添加%JAVA_HOME%\bin到Path环境变量。
在JAVA_HOME本身指向变量C:\Program Files\Java\jdk1.8.0_172。
当我%JAVA_HOME%\bin从“环境变量”窗口手动添加时
Then call this line of code from Powershell to get value of Path variable
[Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine)
Run Code Online (Sandbox Code Playgroud)
It seems like the result from executing line above converts %JAVA_HOME%\bin to the actual path that I've defined which is C:\Program Files\Java\jdk1.8.0_172.
The output look like this
...;C:\Program Files\nodejs;C:\Program Files\Java\jdk1.8.0_172\bin;
Run Code Online (Sandbox Code Playgroud)
But when I added %JAVA_HOME%\bin via Powershell script with the code below
[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + "%JAVA_HOME%\bin", [EnvironmentVariableTarget]::Machine)
Run Code Online (Sandbox Code Playgroud)
Then run GetEnvironmentVariable function again, the output is different than when I added the path through the environment variable window. It doesn't convert %JAVA_HOME%\bin to the actual path.
The output looks like this
....;C:\Program Files\nodejs\;C:\Program Files\Java\jdk1.8.0_172\bin;%JAVA_HOME%\bin
Run Code Online (Sandbox Code Playgroud)
Is this expected? Or is there something that I am missing?
I can actually just append the real path to Path variable directly, but I want to make use of JAVA_HOME variable so the path will be in 1 location.
首先,您可以使用以下语法在 PowerShell 中访问环境变量:
$env:Path
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下,你可以写:
[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + "$($Env:JAVA_HOME)\bin", [EnvironmentVariableTarget]::Machine)
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
PS C:\> [Environment]::SetEnvironmentVariable("JAVA_HOME", "c:\temp")
PS C:\> $env:JAVA_HOME
c:\temp
PS C:\> [Environment]::SetEnvironmentVariable("TEST", "$($Env:JAVA_HOME);c\docs")
PS C:\> $env:TEST
c:\temp;c\docs
Run Code Online (Sandbox Code Playgroud)
这是你想要的 ?
# example of adding a path to PATH
[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";$($Env:JAVA_HOME)\bin", "User")
Run Code Online (Sandbox Code Playgroud)
注意:$Env:Path是System Path和User Path的合并。根据执行此命令的用户,生成的路径将包含不同的条目(用户配置文件和原始系统的)。如果您真的只想更改系统,则应使用:
$oldSysPath = (Get-Itemproperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path).Path
$newSysPath = $oldSysPath + ";$($Env:JAVA_HOME)\bin"
Set-ItemProperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path -Value $newSysPath
Run Code Online (Sandbox Code Playgroud)
从 oracle 网站安装 JAVA 后,我设置了
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-13.0.1")
Run Code Online (Sandbox Code Playgroud)
要在我所做的路径中设置 java,
[System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine) + ";$($env:JAVA_HOME)\bin")
Run Code Online (Sandbox Code Playgroud)
像魅力一样工作!
如果您想在打开 powershell 时自动加载它,您可以这样做,
New-Item $profile -Type File -Force
Run Code Online (Sandbox Code Playgroud)
并在记事本中打开
notepad.exe $profile
Run Code Online (Sandbox Code Playgroud)
并粘贴
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-13.0.1")
[System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine) + ";$($env:JAVA_HOME)\bin")
Run Code Online (Sandbox Code Playgroud)
您现在可以关闭记事本了!接下来,您希望允许 powershell 运行 ps 脚本,因此不要忘记授予在加载时运行配置文件脚本的不受限制的访问权限,
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
Run Code Online (Sandbox Code Playgroud)
重新打开 powershell 后,现在应该加载 Java。就是这样!