Problem scenario
You need to install Java version 8 on a Windows 64 bit server. How do you do this with PowerShell?
Solution
1. Open PowerShell ISE as Administrator.
2. Run this script:
# This is a modified version of PowerShell code taken from this site:
# https://skarlso.github.io/2015/06/30/powershell-can-also-be-nice-or-installing-java-silently-and-waiting/
$JDK_VER="1u151"
$JDK_FULL_VER="8u151-b12"
$JDK_PATH="1.8.0_151"
$source86 = "http://download.oracle.com/otn-pub/java/jdk/$JDK_FULL_VER/jdk-$JDK_VER-windows-i586.exe"
$source64 = "http://javadl.oracle.com/webapps/download/AutoDL?BundleId=230542_2f38c3b165be4555a1fa6e98c45e0808"
$destination86 = "C:\Program Files (x86)\$JDK_VER-x86.exe"
$destination64 = "C:\Program Files (x86)\$JDK_VER-x64.exe"
$client = new-object System.Net.WebClient
$cookie = "oraclelicense=accept-securebackup-cookie"
$client.Headers.Add([System.Net.HttpRequestHeader]::Cookie, $cookie)
Write-Host 'Checking if Java is already installed'
if ((Test-Path "c:\Program Files (x86)\Java") -Or (Test-Path "c:\Program Files\Java")) {
Write-Host 'No need to Install Java'
Exit
}
Write-Host 'Downloading x86 to $destination86'
$client.downloadFile($source64, $destination64)
if (!(Test-Path $destination64)) {
Write-Host "Downloading $destination64 failed"
Exit
}
try {
Write-Host 'Installing JDK-x64'
$proc1 = Start-Process -FilePath "$destination64" -ArgumentList "/s REBOOT=ReallySuppress" -Wait -PassThru
$proc1.waitForExit()
Write-Host 'Installation Done.'
} catch [exception] {
write-host '$_ is' $_
write-host '$_.GetType().FullName is' $_.GetType().FullName
write-host '$_.Exception is' $_.Exception
write-host '$_.Exception.GetType().FullName is' $_.Exception.GetType().FullName
write-host '$_.Exception.Message is' $_.Exception.Message
}
if ((Test-Path "c:\Program Files (x86)\Java") -Or (Test-Path "c:\Program Files\Java")) {
Write-Host 'Java installed successfully.'
}
Write-Host 'Setting up Path variables.'
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "c:\Program Files (x86)\Java\jdk$JDK_PATH", "Machine")
[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";c:\Program Files (x86)\Java\jdk$JDK_PATH\bin", "Machine")
Write-Host 'Done. Goodbye.'
In the future we want to re-write these directions to use write-verbose instead of write-host. We want to warn people that write-verbose is recommended instead of write-host (according to this posting).