Jump to content

Recommended Posts

Posted (edited)

So I need to update Java on a lot of devices along with an application.

I started to work on the uninstall part and have one small issue.  Installing 3 versions of Java on my computer for testing it seems to get 2 out of 3 and requires me to run the script again to get the 3rd.  So it is removing it, but question is why do I have to run it again.  I added a Sleep() incase it was a issue with running too fast (Like I ran into the other day with renaming files in a loop) but still the same.

I'll post the source code I have so far and maybe somebody can see my error or offer up a better solution.

 

#RequireAdmin
;Uninstall Strings - HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall

For $i = 1 to 300
    $sKey1 = RegEnumKey("HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\", $i)
        If @Error Then ExitLoop
    $sKey2 = RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\" & $sKey1, "DisplayName")
        If @Error Then ContinueLoop
    ;If StringInStr($sKey2, "Java") Then    MsgBox(0, "", $sKey2 & " Uninstall String Is" & @CRLF & @CRLF & $sKey1)
    If StringInStr($sKey2, "Java") Then
        Sleep(1000)
        RunWait(@ComSpec & " /c MsiExec /X " & $sKey1 & " /qn", "C:", @SW_HIDE)
    EndIf
Next

For $i = 1 to 300
    $sKey1 = RegEnumKey("HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall\", $i)
        If @Error Then ExitLoop
    $sKey2 = RegRead("HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall\" & $sKey1, "DisplayName")
        If @Error Then ContinueLoop
    ;If StringInStr($sKey2, "Java") Then    MsgBox(0, "", $sKey2 & " Uninstall String Is" & @CRLF & @CRLF & $sKey1)
    If StringInStr($sKey2, "Java") Then
        Sleep(1000)
        RunWait(@ComSpec & " /c MsiExec /X " & $sKey1 & " /qn", "C:", @SW_HIDE)
    EndIf
Next

MsgBox(0, "", "Uninstall of All Java Versions Completed")

Edit: Hmm I have an idea of what it might be... Need to test.  If I have two java uninstall strings right next to another and say I was in loop 100/300 and it gets uninstalled.  The second instance of java may then fall into spot #100 in RegEnumKey() and get skipped as the next iteration of the loop would be 101/300

I think I can just add an $i = $i -1 or something in my If Statement so that I repeat that iteration if an uninstall is done.

Edit2: Fixed :)  that was the issue it seems.

Edited by ViciousXUSMC
  • Moderators
Posted

What about going the WMI route?:

$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @ComputerName & "\root\cimv2")
$aProducts = $oWMI.ExecQuery("Select * from Win32_Product Where Name LIKE '%Java%'")

For $app in $aProducts
    $app.Uninstall()
Next

 

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Posted (edited)

Thats a good idea, I know powershell some but not too familiar with how to use it in autoit.

At some point I am going to have to tweak this probably to remove all but Version X of java, I was just going to do If StringInStr() AND NOT StringInStr() kind of thing based on my code above, how would you pull that off in the WMI method?

I assume -LIke '%Java%" -And -NotLIke '%Java 7 Update 55% sort of deal would work?

Edit: More accurately I should say I know WMI with PowerShell since WMI is not Powershell Exclusive.

With PS it would be an easy for me, but the autoit version you posted has a bunch of other stuff I am not familiar with like winmgmtns, impersonationlevel etc.  Do we have a help file for all that somewhere?

Edited by ViciousXUSMC
  • Moderators
Posted

The winmgmts piece is just grabbing the WMI object. I am sure you can find plenty of docs through Google.

As for further filtering, it is a bit unintuitive. One of my installed Java versions ends in Update 3 and this filter works for me:

$aProducts = $oWMI.ExecQuery("Select * from Win32_Product Where Name LIKE '%Java%' and NOT Name LIKE '%Update 3%'")

 

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Posted
  On 10/7/2015 at 7:29 PM, JLogan3o13 said:

What about going the WMI route?:

$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @ComputerName & "\root\cimv2")
$aProducts = $oWMI.ExecQuery("Select * from Win32_Product Where Name LIKE '%Java%'")

For $app in $aProducts
    $app.Uninstall()
Next

 

What is the purpose of the 

%Java%

Is it a wildcard at either end?, ive seen things on the web like this

%%CoolWebSearch%%

Is that the same?

Posted (edited)

WMI Queries use the same wildcards than SQL. %Java% is equivalent to *Java*.

This article can be interesting : http://blogs.technet.com/b/heyscriptingguy/archive/2012/07/13/use-the-like-operator-to-simplify-your-wql-queries.aspx

%Java% filters returns all products with a name containing "java". In my case : JavaScript Tooling, Java(TM) 6 Update 31, Visual Studio Extensions for Windows Library for JavaScript, Java Auto Updater.

So you can improve the filter, using %Java%Update% or something like %Java%[0-9]%update%[0-9]

 

Edit : to familiarize yourself with WMI, you can use some tools like WMIExplorer 2, WMIExplorer, ScriptOMatic... and of course, MSDN

 

Edited by jguinch
Posted

Yeah the SQL like queries are nice but that is another place the PowerShell is different I have to use "*Java*" instead of "%java%"

Get-WmiObject Win32_Product | Where Name -LIke "*Java*"

The search is a bit slow and I have not figure out how to do a single line powershell command to uninstall but I am sure its possible. 

Posted

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

  • Moderators
Posted

@mLipok, your first two links are simply a rehash of what the OP is already trying to do, loop through the registry and uninstall for every instance of Java found.

The second one specifically has to do with using configuration manager. I don't see where the OP states he is using SCCM; unless he is, this link gives him nothing. 

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...