当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 删除旧的 Java 版本

作者:精品下载站 日期:2024-12-14 12:41:12 浏览:16 分类:玩电脑

使用 PowerShell 删除旧的 Java 版本


如果无人看管,Java 运行时环境可能会像野火一样在企业中蔓延。当我运行一份报告来了解我的环境中的 Java 情况时,我发现了 62 个不同版本的 Java!是时候收回控制权并构建一个 PowerShell 脚本来删除旧的 Java 版本了。

在本教程中,您将学习如何创建 Java 删除工具来删除 PowerShell 中的旧 Java。

让我们开始吧!

创建脚本

首先,打开您最喜欢的代码编辑器(例如 Visual Studio Code)并将文件另存为 Remove-Java.ps1。此 PowerShell 脚本将包含清理以前的 Java 版本所需的所有内容。

定义注册表路径

由于 Java 实例可以隐藏在注册表中的两个位置,因此首先定义每个父注册表项。下面的代码片段提供了 32 位和 64 位注册表路径。

$RegUninstallPaths = @(
   'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
    'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
)

定义要保留的版本

因为您可能想要保留一些旧版本的 Java,所以请使用您想要保留的每个版本创建一个数组。

您可以通过查看控制面板中的程序和功能找到要使用的确切文本。

$VersionsToKeep = @('Java 8 Update 261')

查找并停止所有正在运行的进程

接下来,找到所有正在运行的 Java 进程。下面的代码片段枚举了所有使用 WMI 运行的进程,这些进程正在使用与“Program Files\Java”匹配的路径中的文件运行。

由于 Java 可以将自身嵌入到 Internet Explorer 中并且无法删除,因此也可以停止所有 Internet Explorer 进程。

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

在注册表中搜索 Java 并强制卸载

接下来,构建一个过滤器,用于枚举上面定义的注册表项下的所有值。此过滤器查找所有 Java 实例并排除您想要保留的所有版本。

$UninstallSearchFilter = {($_.GetValue('DisplayName') -like '*Java*') -and (($_.GetValue('Publisher') -eq 'Oracle Corporation')) -and ($VersionsToKeep -notcontains $_.GetValue('DisplayName'))}

现在搜索注册表以查找所有 Java 实例,如果找到,请运行 msiexec.exe /X 以删除每个实例。

# 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
    
        }
    }
}

删除所有旧的 Java 残余

清理 Java 卸载程序无法自行删除的所有残留物。

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
}

包起来

就是这样!在您想要清理 Java 的每台计算机上运行此 PowerShell 脚本,以使此过程尽可能无缝。

请随时在下面立即下载整个脚本。

感谢 Sam Turner 帮助我修复了此代码中的一些错误。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯