企業内で放置されると、Javaランタイム環境は野火のように広がる可能性があります。環境内のJavaの状況を調べるためにレポートを実行したところ、62の異なるバージョンのJavaが見つかりました!制御を取り戻し、古いJavaバージョンを削除するためのPowerShellスクリプトを作成する時が来ました。
このチュートリアルでは、PowerShellで古いJavaを削除するためのJava削除ツールの作成方法を学びます。
さあ、始めましょう!
スクリプトの作成
まず、Visual Studio Codeなどのお気に入りのコードエディタを開き、ファイルをRemove-Java.ps1として保存します。このPowerShellスクリプトには、以前のJavaバージョンをクリーンアップするために必要なすべてのものが含まれます。
レジストリのパスを定義する
Javaインスタンスはレジストリの2つの場所に隠れる可能性があるため、最初に各親レジストリキーを定義します。以下のコードスニペットは、32ビットと64ビットのレジストリパスを提供します。
保持するバージョンを定義する
おそらくいくつかの古いバージョンのJavaを保持したいと思うので、保持するバージョンごとに配列を作成します。
正確なテキストは、コントロールパネルの「プログラムと機能」を参照することで見つけることができます。
実行中のプロセスを検索して停止する
次に、実行中のすべてのJavaプロセスを検索します。以下のコードスニペットは、WMIを使用して、パスが“Program Files\Java”と一致するファイルで実行されているすべてのプロセスを列挙します。
JavaはInternet Explorerに埋め込まれることがあり、削除できないため、Internet Explorerのプロセスも停止してください。
レジストリでJavaを検索し、アンインストールを強制します。
次に、上記で定義されたレジストリキーのすべての値を列挙するために使用するフィルタを作成します。このフィルタは、すべてのJavaインスタンスを見つけ、保持しておきたいバージョンを除外します。
次に、レジストリを検索してすべてのJavaインスタンスを見つけ、見つかった場合はmsiexec.exe /X
を実行して各インスタンスを削除します。
古いJavaの残り物を削除します。
Javaアンインストーラーが自動的に削除しない残り物をクリーンアップします。
終了です。
このPowerShellスクリプトを各コンピュータで実行して、Javaのクリーンアッププロセスをできるだけスムーズに行います。
以下から一括でスクリプト全体をダウンロードしてください。
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 | |
} |
このコードのバグを修正するために、Sam Turnerさんに感謝します。