cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Kinetic
Engaged Sweeper II

This package checks for both 32-bit and 64-bit installed versions of Java, and silently uninstalls any old versions leaving behind only the newest.

Keeping old versions of Java on your system presents a serious security risk.
Uninstalling older versions of Java from your system ensures that Java applications will run with the latest security and performance improvements on your system.

Either download the attached script, or copy the code below and save it as Remove_old_java_versions.ps1 at the {PackageShare}\Scripts folder

Notes:
- As this is just a simple Powershell script, it can also be run on its own.
- The script is a little slow as enumerating the WMI class Win32_Product takes a long time.

Update: Version 1.1 @ 2015-05-20
- Now also detects and uninstalls old Java non-update base versions (i.e. Java versions without Update #)
- Now also removes Java 6 and below, plus added ability to manually change this behaviour.
- Added uninstall default behaviour to never reboot (now uses msiexec.exe for uninstall)
Update: Version 1.2 @ 2015-07-28
- Bug fixes: null array and op_addition errors.

#This script is used to remove any old Java versions, and leave only the newest.
#Original author: mmcpherson
#Version 1.0 - created 2015-04-24
#Version 1.1 - updated 2015-05-20
# - Now also detects and removes old Java non-update base versions (i.e. Java versions without Update #)
# - Now also removes Java 6 and below, plus added ability to manually change this behaviour.
# - Added uninstall default behaviour to never reboot (now uses msiexec.exe for uninstall)
#Version 1.2 - updated 2015-07-28
# - Bug fixes: null array and op_addition errors.
#
#
# IMPORTANT NOTE: If you would like Java versions 6 and below to remain, please edit the next line and replace $true with $false
$UninstallJava6andBelow = $true

#Declare version arrays
$32bitJava = @()
$64bitJava = @()
$32bitVersions = @()
$64bitVersions = @()

#Perform WMI query to find installed Java Updates
if ($UninstallJava6andBelow) {
$32bitJava += Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "(?i)Java(\(TM\))*\s\d+(\sUpdate\s\d+)*$"
}
#Also find Java version 5, but handled slightly different as CPU bit is only distinguishable by the GUID
$32bitJava += Get-WmiObject -Class Win32_Product | Where-Object {
($_.Name -match "(?i)J2SE\sRuntime\sEnvironment\s\d[.]\d(\sUpdate\s\d+)*$") -and ($_.IdentifyingNumber -match "^\{32")
}
} else {
$32bitJava += Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "(?i)Java((\(TM\) 7)|(\s\d+))(\sUpdate\s\d+)*$"
}
}

#Perform WMI query to find installed Java Updates (64-bit)
if ($UninstallJava6andBelow) {
$64bitJava += Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "(?i)Java(\(TM\))*\s\d+(\sUpdate\s\d+)*\s[(]64-bit[)]$"
}
#Also find Java version 5, but handled slightly different as CPU bit is only distinguishable by the GUID
$64bitJava += Get-WmiObject -Class Win32_Product | Where-Object {
($_.Name -match "(?i)J2SE\sRuntime\sEnvironment\s\d[.]\d(\sUpdate\s\d+)*$") -and ($_.IdentifyingNumber -match "^\{64")
}
} else {
$64bitJava += Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "(?i)Java((\(TM\) 7)|(\s\d+))(\sUpdate\s\d+)*\s[(]64-bit[)]$"
}
}

#Enumerate and populate array of versions
Foreach ($app in $32bitJava) {
if ($app -ne $null) { $32bitVersions += $app.Version }
}

#Enumerate and populate array of versions
Foreach ($app in $64bitJava) {
if ($app -ne $null) { $64bitVersions += $app.Version }
}

#Create an array that is sorted correctly by the actual Version (as a System.Version object) rather than by value.
$sorted32bitVersions = $32bitVersions | %{ New-Object System.Version ($_) } | sort
$sorted64bitVersions = $64bitVersions | %{ New-Object System.Version ($_) } | sort
#If a single result is returned, convert the result into a single value array so we don't run in to trouble calling .GetUpperBound later
if($sorted32bitVersions -isnot [system.array]) { $sorted32bitVersions = @($sorted32bitVersions)}
if($sorted64bitVersions -isnot [system.array]) { $sorted64bitVersions = @($sorted64bitVersions)}
#Grab the value of the newest version from the array, first converting
$newest32bitVersion = $sorted32bitVersions[$sorted32bitVersions.GetUpperBound(0)]
$newest64bitVersion = $sorted64bitVersions[$sorted64bitVersions.GetUpperBound(0)]

Foreach ($app in $32bitJava) {
if ($app -ne $null)
{
# Remove all versions of Java, where the version does not match the newest version.
if (($app.Version -ne $newest32bitVersion) -and ($newest32bitVersion -ne $null)) {
$appGUID = $app.Properties["IdentifyingNumber"].Value.ToString()
Start-Process -FilePath "msiexec.exe" -ArgumentList "/qn /norestart /x $($appGUID)" -Wait -Passthru
#write-host "Uninstalling 32-bit version: " $app
}
}
}

Foreach ($app in $64bitJava) {
if ($app -ne $null)
{
# Remove all versions of Java, where the version does not match the newest version.
if (($app.Version -ne $newest64bitVersion) -and ($newest64bitVersion -ne $null)) {
$appGUID = $app.Properties["IdentifyingNumber"].Value.ToString()
Start-Process -FilePath "msiexec.exe" -ArgumentList "/qn /norestart /x $($appGUID)" -Wait -Passthru
#write-host "Uninstalling 64-bit version: " $app
}
}
}
26 REPLIES 26
Kinetic
Engaged Sweeper II
Hey ryancarter,

Updated with bug fixes, now version 1.2 - can you please see if this resolved your issues.

Cheers!
ryancarter
Engaged Sweeper II
I am seeing this error when running the script as an admin locally on a workstation.

PS C:\itcu> .\Remove_old_java_versions.ps1
Cannot index into a null array.
At C:\itcu\Remove_old_java_versions.ps1:71 char:35
+ $appGUID = $app.Properties[ <<<< "IdentifyingNumber"].Value.ToString()
+ CategoryInfo : InvalidOperation: (IdentifyingNumber:String) [], RuntimeException
+ FullyQualifiedErrorId : NullArray


Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 2 324 112 3 0.00 3588 msiexec
Cannot index into a null array.
At C:\itcu\Remove_old_java_versions.ps1:80 char:35
+ $appGUID = $app.Properties[ <<<< "IdentifyingNumber"].Value.ToString()
+ CategoryInfo : InvalidOperation: (IdentifyingNumber:String) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

0 2 328 116 3 0.00 2064 msiexec
hisax
Engaged Sweeper
Thanks for the quick update.

Will report if there are any problems.

Regards!
Kinetic
Engaged Sweeper II
Hi PeterG & hisax,

Thanks for the feedback - Given this seems to be getting a few hits, I've updated to address your issues.

PeterG please note, to ensure Java version 6 and below remain, you will want to change line 11 from:

$UninstallJava6andBelow = $true
to
$UninstallJava6andBelow = $false


Cheers! I've tested and works fine on my end - hopefully still working nicely for you all!

PeterJG
Champion Sweeper II
when i run on all of my pc's they don't restart, not sure why you had it restarting, Usually java installs and upgrades doesn't require restarts.
hisax
Engaged Sweeper
Hello,

tested the script and it worked nicely.

Encountered a problem on one PC that restarted automatically after uninstalling.
Is it possible to add a "norestart" or something similar to the uninstall option?


Thanks and Regards!
PeterJG
Champion Sweeper II
love this script.. thank you..

Quick Side Note:

Oracle changed the naming conversion for its Java products after version 6 example

Java(TM) 6 Update 10 to Java 8 Update 10 so this script only will uninstall version 7+ which is OK for us because version 6 is required for 1 legacy app.