Wenn sie unbeaufsichtigt bleiben, können sich Java-Runtime-Umgebungen wie ein Lauffeuer in einem Unternehmen ausbreiten. Als ich einen Bericht durchführte, um herauszufinden, wie die Java-Landschaft in meiner Umgebung aussah, fand ich 62 verschiedene Versionen von Java! Es ist an der Zeit, die Kontrolle zurückzugewinnen und ein PowerShell-Skript zum Entfernen alter Java-Versionen zu erstellen.
In diesem Tutorial erfahren Sie, wie Sie ein Java-Entfernungsprogramm zum Entfernen alter Java-Versionen in PowerShell erstellen.
Legen wir los!
Erstellen des Skripts
Zunächst öffnen Sie Ihren bevorzugten Code-Editor wie Visual Studio Code und speichern die Datei als Remove-Java.ps1. Dieses PowerShell-Skript wird alles enthalten, was Sie benötigen, um frühere Java-Versionen zu bereinigen.
Definieren der Registrierungspfade
Weil sich Java-Instanzen in zwei Stellen in der Registrierung verstecken können, definieren Sie zunächst jeden der übergeordneten Registrierungsschlüssel. Der folgende Code-Schnipsel enthält sowohl die Pfade für die 32- als auch die 64-Bit-Registrierung.
Definieren von Versionen, die behalten werden sollen
Weil Sie wahrscheinlich einige alte Versionen von Java behalten möchten, erstellen Sie ein Array mit jeder Version, die Sie behalten möchten.
Sie können den genauen Text finden, indem Sie unter „Programme und Funktionen“ in der Systemsteuerung nachsehen.
Alle laufenden Prozesse finden und stoppen
Als nächstes finden Sie alle laufenden Java-Prozesse. Der folgende Code-Schnipsel listet alle laufenden Prozesse mit WMI auf, die mit einer Datei in einem Pfad übereinstimmen, der “Program Files\Java” entspricht.
Weil sich Java in Internet Explorer einbetten kann und nicht entfernt werden kann, halten Sie auch alle Internet Explorer-Prozesse an.
Suche im Registrierungseditor nach Java und erzwinge eine Deinstallation
Als nächstes erstellen Sie einen Filter, den Sie verwenden werden, um alle Werte unter den oben definierten Registrierungsschlüsseln aufzulisten. Dieser Filter findet alle Java-Instanzen und schließt alle Versionen aus, die Sie behalten möchten.
Durchsuchen Sie nun die Registrierung, um alle Java-Instanzen zu finden und führen Sie bei Fund msiexec.exe /X
aus, um jede Instanz zu entfernen.
Entfernen Sie alle alten Java-Rückstände
Bereinigen Sie alle Überreste, die der Java-Deinstaller nicht von selbst entfernt.
Zusammenfassung
Und das ist alles! Führen Sie dieses PowerShell-Skript auf jedem Computer aus, auf dem Sie Java aufräumen möchten, um diesen Vorgang so nahtlos wie möglich zu gestalten.
Fühlen Sie sich frei, das gesamte Skript unten auf einmal herunterzuladen.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$RegUninstallPaths = @( | |
‚HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall‚, | |
‚HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall‚ | |
) | |
$VersionsToKeep = @(‚Java 8 Update 261‚) | |
Get-CimInstance –ClassName ‚Win32_Process‚ | Where-Object {$_.ExecutablePath -like ‚*Program Files\Java*‚} | | |
Select-Object @{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 Corporation‚)) -and ($VersionsToKeep -notcontains $_.GetValue(‚DisplayName‚))} | |
# Uninstall unwanted Java versions and clean up program files | |
foreach ($Path in $RegUninstallPaths) { | |
if (Test-Path $Path) { | |
Get-ChildItem $Path | Where-Object $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:\Installer\Products„ | |
Get-ChildItem $ClassesRootPath | | |
Where-Object { ($_.GetValue(‚ProductName‚) -like ‚*Java*‚)} | Foreach { | |
Remove-Item $_.PsPath –Force –Recurse | |
} | |
$JavaSoftPath = ‚HKLM:\SOFTWARE\JavaSoft‚ | |
if (Test-Path $JavaSoftPath) { | |
Remove-Item $JavaSoftPath –Force –Recurse | |
} |
Danke an Sam Turner für die Hilfe bei der Behebung einiger Fehler in diesem Code.