ITお絵かき修行

3歩歩いても忘れないために

PowerShellを使ってOracleJDKサイレントインストール

OracleJDKをサイレントインストールする。

【概要】
・OTNサイト(US)から取得したJDK8u45(64bit)のインストーラを使用しサイレントインストールする。*1
・ダウンロードしたインストーラは「C:\\tmp」に置く。
環境変数も設定する。
→ユーザ環境変数の「JAVA_HOME」と「PATH」にJDK実行に必要なパスを設定する。
インストーラが出力するログは「C:\tmp\JDKsetup.log」に格納する。

【実行環境】
Windows7 Home Premium 64bit
PowerShell 4.0 (※新しい関数は使っていないので、おそらくPowerShell2.0以降であれば動作する)

スクリプト

Function Download{
    $serverSourceURL = "http://download.oracle.com/otn/java/jdk/8u45-b15/jdk-8u45-windows-x64.exe"
    $localSourceURL = "C:\\tmp\\jdk-8u45-windows-x64.exe"
    Write-Host ("■インストーラ取得先URL : " + $remoteFileLocation)
    Write-Host ("■インストーラ保存先パス : " + $downloadToPath)
    
    $client = new-object System.Net.WebClient
    # ライセンスに同意する
    $cookie = "oraclelicense=accept-securebackup-cookie"
    $client.Headers.Add([System.Net.HttpRequestHeader]::Cookie, $cookie)

    Write-Host "★ダウンロード開始(しばらくお待ちください…)"
    $client.downloadFile($serverSourceURL, $localSourceURL)
    Write-Host "★ダウンロード終了"
    return
}

Function Install{
    Write-Host "★インストール開始(しばらくお待ちください…)"
    # インストーラ実行(※同期実行)
    cmd /c "start C:\tmp\jdk-8u45-windows-x64.exe /s /lang=1041 INSTALLDIR=C:\java\jdk1.8.45\ /L C:\tmp\JDKsetup.log" 
    Write-Host "★インストール終了"

    # ユーザー環境変数設定
    # PATHは末尾に付加する
    $user_path = [Environment]::GetEnvironmentVariable('PATH', 'User')
    $user_path += ';' + "C:\java\jdk1.8.45\bin\"
    [Environment]::SetEnvironmentVariable('PATH', $user_path, 'User')

    # JAVA_HOMEは更新する
    #$user_java_home = [Environment]::GetEnvironmentVariable('JAVE_HOME', 'User')
    $user_java_home = "C:\java\jdk1.8.45\"
    [Environment]::SetEnvironmentVariable('JAVA_HOME', $user_java_home, 'User')

    Write-Host ("■現在のユーザー環境変数 PATH : " + $user_path)
    Write-Host ("■現在のユーザー環境変数 JAVA_HOME : " + $user_java_home)
    return
}

# 処理開始
Write-Host "★★★Oracle JDKのダウンロード・インストール開始"

Download
Install

Write-Host "★★★Oracle JDKのダウンロード・インストール終了"
# 処理終了

■実行結果

PS C:\Windows\system32> (ファイルパス).ps1
★★★Oracle JDKのダウンロード・インストール開始
■インストーラ取得先URL : http://download.oracle.com/otn/java/jdk/8u45-b15/jdk-8u45-windows-x64.exe
■インストーラ保存先パス : C:\tmp\jdk-8u45-windows-x64.exe
★ダウンロード開始(しばらくお待ちください…)
★ダウンロード終了
★インストール開始(しばらくお待ちください…)
★インストール終了
■現在のユーザー環境変数 PATH : (既存のPATH設定値);C:\java\jdk1.8.45\bin\
■現在のユーザー環境変数 JAVA_HOME : C:\java\jdk1.8.45\
★★★Oracle JDKのダウンロード・インストール終了

■結果確認

C:\>java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

C:\>

【備考】
インストーラを毎回取りに行くので、インストーラの有無チェックが必要。
・インストールを毎回実行するので、プログラム一覧をなめてOracle Javaの存在チェックする処理が必要。*2

【参考】
java - Downloading jdk using powershell - Stack Overflow
Microsoft WindowsのJDKのインストール

【改訂新版】 Windows PowerShell ポケットリファレンス

【改訂新版】 Windows PowerShell ポケットリファレンス

*1:PowerShellの関数のみで実行したかったが、リクエストに載せるCookieの設定方法がわからなかったので、.NETのクラスを使った。

*2:要は冪等性を作りこむ必要がある。現状のコードのまま2回実行すると、インストーラを再ダウンロードし、再インストールを実行する。