Добавление JAVA_HOME в системную переменную Path через Powershell - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь добавить %JAVA_HOME%\bin к Path переменным среды с помощью скрипта Powershell.

Сама переменная JAVA_HOME указывает на C:\Program Files\Java\jdk1.8.0_172.

Когда я добавил%JAVA_HOME%\bin вручную из окна Переменная среды

Environment Variable

Затем вызовите эту строку кода из Powershell, чтобы получить значение Path variable

[Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine)

Похоже, что результат выполнения строки выше преобразует %JAVA_HOME%\bin в фактический определенный мной путь C:\Program Files\Java\jdk1.8.0_172.

Выходные данные выглядят следующим образом

...;C:\Program Files\nodejs;C:\Program Files\Java\jdk1.8.0_172\bin;

Но когда я добавил %JAVA_HOME%\bin через скрипт Powershell с кодом ниже

[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + "%JAVA_HOME%\bin", [EnvironmentVariableTarget]::Machine)

Затем снова запустите функцию GetEnvironmentVariable, вывод отличается от того, когда я добавил путь через окно переменной среды.Он не преобразует %JAVA_HOME%\bin в фактический путь.

Вывод выглядит следующим образом

....;C:\Program Files\nodejs\;C:\Program Files\Java\jdk1.8.0_172\bin;%JAVA_HOME%\bin

Ожидается ли это?Или я что-то упускаю?

Я могу просто добавить реальный путь к переменной Path напрямую, но я хочу использовать переменную JAVA_HOME, чтобы путь был в 1 месте.

1 Ответ

0 голосов
/ 30 мая 2018

Сначала вы можете использовать следующий синтаксис для доступа к переменной environememnt в PowerShell:

$env:Path

Так что в вашем случае вы можете написать:

[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + "$($Env:JAVA_HOME)\bin", [EnvironmentVariableTarget]::Machine)

Вот пример:

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

Это то, что вы ищете?

# example of adding a path to PATH
[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";$($Env:JAVA_HOME)\bin", "User")

Будьте осторожны : $Env: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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...