PowerShellでJAVA_HOME切替


使用するjavaの切替をコマンドかバッチで切り替えたいと思い作成。

SetEnvironmentVariableで設定した後、環境変数の変更を反映するためにpowershellを起動しなおして`java -version`としていたのですが
GetEnvironmentVariableで再読み込みすれば変更を反映できるようなのでスクリプトにしました。

なお、PowerShell ISEで実行するとエラーになります…。（[未解決の事象](#未解決の事象) 参照）

# 環境
Window 10
PSVersion : 5.1.19041.1682

# ソース

javaへのPathは、%JAVA_HOME%/bin で通している前提です。

```powershell:setJAVAHOME.ps1
param(
    [Parameter(Mandatory=$true)]
    [String]$javaVersion
)

# user's setting
$javaPath = @{
    '8'  = 'C:\jdk\openjdk-8'
    '11' = 'C:\jdk\openjdk-11'
}

# check and set
if ($javaVersion -in $javaPath.Keys) {

    echo ''
    echo "set version : $javaVersion"

    # set JAVA_HOME
    [System.Environment]::SetEnvironmentVariable("JAVA_HOME", $javaPath[$javaVersion], "User")

    # reload JAVA_HOME, Path
    $env:JAVA_HOME = [System.Environment]::GetEnvironmentVariable("JAVA_HOME", "User")
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" `
              + [System.Environment]::GetEnvironmentVariable("Path","User")
} else {
    echo ''
    echo "input version is invalid!!"
}

# display version
echo ''
echo '---------- java version ----------'
java -version

echo ''

```


# 使い方

1. 変数 `$javaPath` にバージョン（key）とJAVA＿HOMEに設定するパスを設定する。
2. 引数にバージョンを指定して実行する。

## 実行例
通常パターン
```:実行例１
PS > ./setJAVAHOME.ps1 11

set version : 11

---------- java version ----------
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

PS >
```

引数が間違っている
```:実行例２
PS > ./setJAVAHOME.ps1 1

input version is invalid!!

---------- java version ----------
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

PS >
```

引数忘れた
```:実行例３
PS > ./setJAVAHOME.ps1

コマンド パイプライン位置 1 のコマンドレット setJAVAHOME.ps1
次のパラメーターに値を指定してください:
javaVersion: 11

set version : 11

---------- java version ----------
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

PS >
```


## 未解決の事象
Powershellからこのスクリプトを実行した場合は問題なく動いているが、
PowerShell ISEで実行するとエラーになる。



<details><summary>エラー時出力内容</summary>

```
PS C:\nablarch> ./setJAVAHOME.ps1 11

set version : 11

---------- java version ----------
java : openjdk version "11" 2018-09-25
発生場所 C:\nablarch\setJAVAHOME.ps1:33 文字:1
+ java -version
+ ~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (openjdk version "11" 2018-09-25:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

PS C:\nablarch> 
PS C:\nablarch> ./setJAVAHOME.ps1 8

set version : 8

---------- java version ----------
java : openjdk version "1.8.0_42"
発生場所 C:\nablarch\setJAVAHOME.ps1:33 文字:1
+ java -version
+ ~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (openjdk version "1.8.0_42":String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
OpenJDK Runtime Environment (build 1.8.0_42-b03)
OpenJDK Client VM (build 25.40-b25, mixed mode)

PS C:\nablarch>
```
</details>

こちらの記事　[PowerShellからのPATH設定がなんかうまくいかない話。](https://qiita.com/Chiffon-Pudding/items/e98d2466a3f1a8b02c16)　で、
環境変数Pathに環境変数を含むパスを含めるとうまくいかない事象（実験）が書かれているが、
どうやら環境変数Pathに含まれる環境変数の設定値を変更するのもだめらしい。

javaコマンドが認識されていないようで、
スクリプトの実行に限らず、SetEnvironmentVariableで設定した後に
`java -version` と直接コマンド入力した場合もエラーとなる。

# 参考
スクリプトを書くときに参考にしたQiitaの記事
* [PowerShellで環境変数を再読込する](https://qiita.com/yuta0801/items/adb58591c3d9432bd868)
* [PowerShellでもっといい条件文の書き方５選](https://qiita.com/nimzo6689/items/6c6443a7494674e44949)