批处理文件以卸载所有Sun Java版本?


11

我正在建立一个系统,以使Java在我们的办公室中保持最新状态。每个人都有所有不同版本的Java,其中许多版本过时且不安全,有些可以追溯到1.4。我有一个System Center Essentials服务器,它可以推出并以静默方式运行.msi文件,并且我已经测试过它可以安装最新的Java。但是安装程序不会删除旧版本(例如1.4),因此我需要将其卸载。每个人都在运行Windows XP。

巧合的是,Sun刚刚被Oracle收购,Oracle现在已将Java中所有“ Sun”实例更改为“ Oracle”。因此,我可以方便地不必担心卸载最新的Java,因为我可以搜索并卸载所有Sun Java程序。

我在一个看起来很有希望的论坛帖子上找到了以下批处理脚本:

@echo off & cls
Rem List all Installation subkeys from uninstall key.
echo Searching Registry for Java Installs
for /f %%I in ('reg query HKLM\SOFTWARE\microsoft\windows\currentversion\uninstall') do echo %%I | find "{" > nul && call :All-Installations %%I
echo Search Complete..
goto :EOF
:All-Installations
Rem Filter out all but the Sun Installations
for /f "tokens=2*" %%T in ('reg query %1 /v Publisher 2^> nul') do echo %%U | find "Sun" > nul && call :Sun-Installations %1
goto :EOF
:Sun-Installations
Rem Filter out all but the Sun-Java Installations. Note the tilda + n, which drops all the subkeys from the path
for /f "tokens=2*" %%T in ('reg query %1 /v DisplayName 2^> nul') do echo . Uninstalling - %%U: | find "Java" && call :Sun-Java-Installs %~n1
goto :EOF
:Sun-Java-Installs
Rem Run Uninstaller for the installation
MsiExec.exe /x%1 /qb
echo . Uninstall Complete, Resuming Search..
goto :EOF

但是,当我运行脚本时,得到以下输出:

Searching Registry for Java Installs
'DEV_24x6' is not recognized as an internal or external command,
operable program or batch file.
'SUBSYS_542214F1' is not recognized as an internal or external command,
operable program or batch file.

然后它似乎挂起了,我按ctrl-c停止了它。

通读脚本,我不了解所有内容,但不知道为什么它试图将注册表项作为程序运行。批处理脚本有什么问题?我该如何修复它,以便我可以继续以某种方式将其转变为MSI,然后将其部署给所有人以清理该办公室?

或者,您可以建议一个更好的解决方案或现有的MSI文件来满足我的需要吗?我只想确保从每个人的计算机上删除所有旧版本的Java,因为我听说过一些利用旧版Java加载网页的漏洞,所以我想避免使用这些漏洞。


出于好奇,您为什么要这样做。Java版本不兼容使我无尽痛苦(惠普,我在看着你)。如果有的话,我很想写一个脚本来安装Java的多个版本
Jim B

3
安全将是主要问题。在最近的攻击中,过时的JVM版本已被广泛使用。甚至Windows 7计算机也受到影响。
约书亚

1
绝对为了安全。在过去的几个小时中,我已经成功地在办公室中部署了最新的Java,但是那些旧版本仍然存在。我听说过一些漏洞利用能够使用已安装但在计算机中处于休眠状态的Java的较早版本来安装间谍软件,并且我想通过仅在计算机上安装最新的Java来避免任何此类漏洞。
莉吉特

这是我刚刚发现的另一种方法:ivan.dretvic.com/2011/02/…–
Craig Ringer

Answers:


6

以下是我们使用的代码,可以很好地用作启动脚本:

on error resume next

dim WshShell
dim RegKey
dim ScriptVerKey

Set WshShell = CreateObject("WScript.Shell")

'checks to see if registry key exists, if it does, the cleanup runs.
RegKey = "HKLM\SOFTWARE\EDU\Cleanup\"
ScriptVerKey = WshShell.RegRead(RegKey & "JAVAOldVer")

if ScriptVerKey <> "1" Then 
  Cleanup()
 Else 
  WScript.Quit
End If

Sub Cleanup()

' Uninstall Java 1.4.1.01
WshShell.Run "msiexec /x {1666FA7C-CB5F-11D6-A78C-00B0D079AF64} /q",1,True
' Uninstall Java 1.4.2.04
WshShell.Run "msiexec /x {7148F0A8-6813-11D6-A77B-00B0D0142040} /q",1,True
' Uninstall Java 5.0.2
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150020} /q",1,True
' Uninstall Java 5.0.4
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150040} /q",1,True
' Uninstall Java 5.0.5
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150050} /q",1,True
' Uninstall Java 5.0.6
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150060} /q",1,True
' Uninstall Java 5.0.7
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150070} /q",1,True
' Uninstall Java 5.0.10
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150100} /q",1,True
' Uninstall Java 5.0.11
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150110} /q",1,True
' Uninstall Java 5.0.12
'WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150120} /q",1,True
' Uninstall Java 6.0.0
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160000} /q",1,True
' Uninstall Java 6.0.1
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160010} /q",1,True
' Uninstall Java 6.0.2
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160020} /q",1,True
' Uninstall Java 6.0.5
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160050} /q",1,True
' Uninstall Java 6.0.30 (020608)
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160030} /q",1,True


'regkey below stops the script from running again
WshShell.RegWrite "HKLM\Software\EDU\", "Default"
WshShell.RegWrite "HKLM\Software\EDU\Cleanup\", "Default"
WshShell.RegWrite "HKLM\Software\EDU\Cleanup\JAVAOldVer", 1, "REG_SZ"

End Sub

那很棒!我尚未清理旧的Java版本,因此我想将其集成到我们的启动脚本中。感谢分享!
Ricket 2010年

8

此行将卸载所有版本的JAVA:

Wmic产品,其中“名称类似'Java %% %%'”调用卸载/ nointeractive


谢谢。这在我的系统上运行良好。通过此命令,它同时删除了Java 7和Java 8版本。
Michael S.

谢谢!这是删除所有旧Java版本的最佳cmd。只需确保它具有“管理员”权限即可运行。
PatricK

1

摘录自:http : //www.java.com/en/download/faq/remove_olderversions.xml

随着时间的流逝,您可能已经安装了多个Java版本来运行可用的Java内容。过去,每个Java更新都安装在系统上的单独目录中。 但是,Java更新现在安装在单个目录中。

我应该删除旧版本的Java吗?我们强烈建议用户从您的系统中删除所有较旧的Java版本。在系统上保留Java的旧版本和不受支持的版本会带来严重的安全风险。从系统中删除较旧版本的Java可以确保Java应用程序在系统上以最新安全性和性能改进的方式运行。

我发现以下VBScript在理论上可以正确删除Java的早期版本。最好从下至上阅读,因为其他人已经对其进行了完善:

http://www.appdeploy.com/messageboards/tm.asp?m=29809


“最好的自下而上的阅读方法” –在这种情况下,您应该将最佳的脚本复制到此处
jcollum 2014年

1

检查以下简单但非常有用的命令:

wmic product where "name like 'Java(TM) 6%%'" call uninstall /nointeractive

这里被偷



0

票数最高的经过验证的答案与此有关。根据我的测试,6.0系列CLSID不正确。

这是我发现适用于每个JRE系列的CLSID。将xx替换为您要删除的所需版本。请与/server//a/187552/172014一起使用

4.2_xx
{7148F0A8-6813-11D6-A77B-00B0D0142xx0}

5.0_xx
{3248F0A8-6813-11D6-A77B-00B0D0150xx0}

6.0_xx
{26A24AE4-039D-4CA4-87B4-2F832160xxF0}

7.0_xx
{26A24AE4-039D-4CA4-87B4-2F832170xxF0}

我建议也将/ norestart添加到/ q之后,以防万一1.4.2系列JRE MSI希望重新引导。

msiexec /x <insert_CLSID_here> /q /norestart

0

您仍然可以使用批处理脚本来完成。我使用以下脚本;

@ECHO OFF
REM #######################################################
REM AUTHOR: HeyVooN
REM BLOG: http://blog.teksoporte.es
REM DATE CREATED: 09/04/2015
REM Deploy Java to your Enterprise
REM This script is optimised for 32 and 64 Bit versions of Java to be installed on either 32 or 64 bit
REM operating systems. It can easily accommodate 64 bit versions of Java.
REM This script removes all previous versions of Java installed prior to (re)install any version.
REM #######################################################

REM #######################################################
REM SECTION 1 - CLEAN UP PC BEFORE INSTALLING JAVA (This section is not mandatory)
REM #######################################################
ECHO -------------------------------------------------------
ECHO STOP PROCESSES
ECHO -------------------------------------------------------
REM Assuming that processes using Java are stopped before uninstalling existing versions of Java
REM Common processes using Java: firefox.exe, iexplore.exe, chrome.exe, jusched.exe, jucheck.exe, java.exe, javacpl.exe

sc config "UI0Detect" start= disabled
sc stop UI0Detect
taskkill /F /IM jusched.exe /T
taskkill /F /IM jucheck.exe /T
taskkill /F /IM java.exe /T

ECHO -------------------------------------------------------
ECHO UNISTALL ANY PREVIOUS VERSIONS OF JAVA 32 Bit
ECHO -------------------------------------------------------
SET jver="Java 7"
SET regVar32=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
SET myCMD=REG QUERY %regVar32% /s /f %jver%
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO (
 ECHO Uninstall Key: {%%i}
 ECHO Condition: %uinstallState%
 START /WAIT MSIEXEC /x {%%i} /qn /norestart
  )

ECHO -------------------------------------------------------
ECHO UNISTALL ANY PREVIOUS VERSIONS OF JAVA 64 Bit
ECHO -------------------------------------------------------
SET jver="Java 7"
SET regVar64=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
SET myCMD=REG QUERY %regVar64% /s /f %jver%
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO (
 ECHO Uninstall Key: {%%i}
 ECHO Condition: %uinstallState%
 START /WAIT MSIEXEC /x {%%i} /qn /norestart
  )

ECHO -------------------------------------------------------
ECHO CLEANING REGISTRY
ECHO -------------------------------------------------------
REM Removing known problem registry keys. I use the below line to SET the variable of which reg.exe to use depending on OS architecture.
REM Additional registry removal strings can be added here.
@If Defined ProgramFiles(x86) (SET "Reg32Path=%SystemRoot%\SysWOW64\reg.exe") Else (SET "Reg32Path=%SystemRoot%\System32\reg.exe")
REM %Reg32Path% DELETE HKLM\SOFTWARE\JavaSoft /va /f
%Reg32Path% DELETE "HKLM\SOFTWARE\JavaSoft\Auto Update" /va /f
%Reg32Path% DELETE "HKLM\SOFTWARE\JavaSoft\Java Update" /va /f

ECHO -------------------------------------------------------
ECHO DELETE START MENU ITEMS
ECHO -------------------------------------------------------
RD /s /q "%ProgramData%\Microsoft\Windows\Start Menu\Programs\Java"
PAUSE
EXIT /B 0

您可以调整/修改想要满足自己需求的方式。;-)


如果您是系统管理员,请不要在没有警告的情况下运行它。整个Java范围内的强制杀死将使某些人不高兴-例如,我每天都使用Eclipse,而有些人则使用OpenOffice / LibreOffice。我之所以仅提及这一点,是因为我的问题(五年前)是我在寻找一种静默部署可在每个人的计算机上运行的脚本并卸载旧版本Java的方法。因此,很明显,这一点做得不好,或者至少我要删除taskkill行。
莉吉特

0

这对我有用。它会卸载最新版本(在撰写本文时为v8.0.66)之前的所有Java版本(32位和64位)。

wmic product where "name like 'Java%%' and version < '8.0.66'" call uninstall
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.