Powershellスクリプトを介して%Java_HOME%\bin
をPath
環境変数に追加しようとしています。
Java_HOME
変数自体がC:\Program Files\Java\jdk1.8.0_172
を指しています。
[環境変数]ウィンドウから手動で%Java_HOME%\bin
を追加したとき
次に、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つの場所に配置されるようにしたいと考えています。
インストールした後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がロードされます。それでおしまい!
最初に、次の構文を使用して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