web-dev-qa-db-ja.com

Powershellを介してシステム変数PathにJava_HOMEを追加する

Powershellスクリプトを介して%Java_HOME%\binPath環境変数に追加しようとしています。

Java_HOME変数自体がC:\Program Files\Java\jdk1.8.0_172を指しています。

[環境変数]ウィンドウから手動で%Java_HOME%\binを追加したとき

Environment Variable

次に、Powershellからこのコード行を呼び出して、Path変数の値を取得します

[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;

しかし、私は以下のコードでPowershellスクリプトを介して%Java_HOME%\binを追加したとき

[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つの場所に配置されるようにしたいと考えています。

7
muhihsan

インストールした後Java設定したOracle Webサイトから

 [System.Environment]::SetEnvironmentVariable("Java_HOME", "C:\Program Files\Java\jdk-13.0.1")

Javaをパスに設定するには、

 [System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine) + ";$($env:Java_HOME)\bin")

魅力のように働いた!

実行できるPowerShellを開いたときに自動的に読み込ませる場合は、

New-Item $profile -Type File -Force

のようにメモ帳で開きます

notepad.exe $profile

そして貼り付けます

 [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")

これでメモ帳を閉じることができます!次に、Powershellがpsスクリプトを実行できるようにするため、ロード時にプロファイルスクリプトを実行するための無制限のアクセス権を付与することを忘れないでください。

 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser

Powershellを再度開いた後、Javaがロードされます。それでおしまい!

1
dark_src

最初に、次の構文を使用してPowerShellのenvironememnt変数に到達できます。

$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は、システムパスユーザーパスのマージです。このコマンドを実行するユーザーに応じて、結果の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 
1
JPBlanc