How to Remove Java with PowerShell

Adam Bertram

Adam Bertram

Read more posts by this author.

If left unattended, Java can spread like wildfire in an enterprise. When I ran a report to find out what the Java landscape looked like in my environment, I found 62 different versions Java! This was from years of users clicking Yes to auto-update prompts, websites forcing Java and, however, else it got spread.

I’m still in the planning stages of this massive cleanup and upgrade effort. Here’s the cleanup script I wrote with help from Kristoffer @ 3techies.com. Other than finding and uninstalling all versions of Java, I included an option to keep certain versions. We’ve got a need to keep a few old versions out there due to some old software that requires it. After it gets done doing the uninstalls, it then cleans some of the remnants from the registry that any version may have left.

This script works great. As a test, I installed dozens of different versions across a few different VMs and it uninstalled them all without fail!

$RegUninstallPaths = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
    'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall')
$VersionsToKeep = @('Java 7 Update 5')

Get-WmiObject Win32_Process | Where {$_.ExecutablePath -like '*Program FilesJava*'} | 
    Select @{n='Name';e={$_.Name.Split('.')[0]}} | Stop-Process -Force

get-process -Name *iexplore* | Stop-Process -Force -ErrorAction SilentlyContinue

$UninstallSearchFilter = { ($_.GetValue('DisplayName') -like '*Java*') -and 
    (($_.GetValue('Publisher') -eq 'Oracle') -or
    ($_.GetValue('Publisher') -eq 'Sun Microsystems, Inc.')) -and
    ($VersionsToKeep -notcontains $_.GetValue('DisplayName'))} 

foreach ($Path in $RegUninstallPaths) {
    if (Test-Path $Path) {
        Get-ChildItem $Path | Where $UninstallSearchFilter | 
        Foreach { Start-Process 'C:\Windows\System32\msiexec.exe' "/x $($_.PSChildName) /qn" -Wait}
    }
}

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null
$ClassesRootPath = "HKCR:\InstallerProducts"
Get-ChildItem $ClassesRootPath | 
    Where { ($_.GetValue('ProductName') -like '*Java*7*') -or ($_.GetValue('ProductName') -like "Java*6*")} |
    Foreach {Remove-Item $_.PsPath -Force -Recurse}


$JavaSoftPath = 'HKLM:\SOFTWARE\JavaSoft'
if (Test-Path $JavaSoftPath) {
    Remove-Item $JavaSoftPath -Force -Recurse
}

Remove-Item $env:ProgramfilesJava -Force -Recurse

Find this script on my GitHub repo.

Subscribe to Adam the Automator

Get the latest posts delivered right to your inbox

Looks like you're offline!