만약 방치하면, 자바 런타임 환경은 기업 내에서 확산될 수 있습니다. 내 환경에서 자바 랜드스케이프가 어떻게 보이는지 알아보기 위해 보고서를 실행했을 때, 62개의 다른 자바 버전을 발견했습니다! 제어권을 되찾고 오래된 자바 버전을 제거하기 위한 PowerShell 스크립트를 작성할 때입니다.
이 자습서에서는 PowerShell에서 오래된 자바를 제거하기 위한 자바 제거 도구를 만드는 방법을 배우게 됩니다.
시작해 봅시다!
스크립트 만들기
먼저, Visual Studio Code와 같은 즐겨 사용하는 코드 편집기를 열고 파일을 Remove-Java.ps1로 저장합니다. 이 PowerShell 스크립트에는 이전 자바 버전을 정리하는 데 필요한 모든 것이 포함될 것입니다.
레지스트리 경로 정의
자바 인스턴스는 레지스트리의 두 곳에 숨을 수 있기 때문에 먼저 각 부모 레지스트리 키를 정의합니다. 아래 코드 스니펫은 32비트 및 64비트 레지스트리 경로를 모두 제공합니다.
유지할 버전 정의
아마도 몇 가지 오래된 자바 버전을 유지하고 싶을 것입니다. 유지하려는 각 버전을 포함한 배열을 생성합니다.
제어판의 프로그램 및 기능을 확인하여 사용할 정확한 텍스트를 찾을 수 있습니다.
모든 실행 중인 프로세스 찾기 및 중지
다음으로, 모든 실행 중인 자바 프로세스를 찾습니다. 아래 코드 스니펫은 경로가 “Program Files\Java“와 일치하는 파일을 사용하여 실행 중인 모든 프로세스를 WMI로 나열합니다.
자바는 인터넷 익스플로러 내에 자체를 포함시킬 수 있으며 제거할 수 없으므로, 인터넷 익스플로러 프로세스도 중지합니다.
찾아서 레지스트리에서 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에게 감사드립니다.