Dynamic Uninstall

//Dynamic Uninstall
Dynamic Uninstall2017-10-01T18:18:57+00:00

The Toolkit Forums Deployment Scripts Dynamic Uninstall

  • Author
  • Matt
    Post count: 11

    The Scenario: App installs but may update itself or generate a random key every time (idiots).
    The Solve: If the below script comes out correctly formatted, it has the logic to detect the uninstall strings and piece together the uninstall. Keep in mind the app is 32-bit and I didn’t want to spend more time than I had to.

    <pre class=”brush: text; gutter: true; first-line: 1; highlight: []; html-script: false”>
    #Find dynamic uninstall string
    $DName = "<DisplayNameHere>"
    $Exe= "<ExpectedUninstallerName"
    $QUS = "<KeyDataName"
    $root = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    $root64 = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
    if ($is64bit) {
    $keys = gci $root64
    else {
    $keys = gci $root
    foreach ($key in $keys) {
    $Inst = (get-itemproperty $key.pspath | ? {$_.DisplayName -match $DName}).$QUS
    $Split1 = $Inst -split '/' | ? {$_.trim() -ne "" }
    $Split2 = $Split1 -split "rn"
    foreach ($Split in $Split2) {
    if ($Split -like "*$Exe*") {
    $Uninst = $Split.Replace("`"","")
    else {
    $Parameters += "/" + $Split

    #Execute gathered string
    Execute-Process -Path $Uninst -Parameters "$Parameters"

  • Jim
    Post count: 54


    I’ve seen other people on here post similar scripts to uninstall software. Out of curiosity, why not use the get-installedapplication function to get the uninstall string? That way you let the function figure out if it’s 64-bit or not…

    Something like this:

    $VC2013 = ((Get-InstalledApplication -Name 'Microsoft Visual C++ 2013 Redistributable (x64) - 12.0.30501').UninstallString -split '" ').Trim('"')
    If ($VC2013) {
    $VC2013Uninst = $VC2013[0]
    $VC2013Params = $VC2013[1]
    Execute-Process -Path $VC2013Uninst -Parameters "$VC2013Params /quiet /norestart"

    Or my post here, “http://psappdeploytoolkit.com/forums/topic/execute-process-odd-behavior/#post-2248”.

  • Matt
    Post count: 11

    Simple, that function only gets certain values:

    The function would be best served by allowing input to include (partial) display name, specific reg value (quietuninstallstring here). This method also generated the Uninstall command for me so that I didn’t need to know switches. I put this into a function which I used in both preinstall and uninstall state. Also expanded it a little more to include logging…it’s much more effective now.

  • Jim
    Post count: 54

    The get-installedapplication does support partial display names. It supports name, exact and even wildcard. You could submit a feature request to have QuietUninstall added to the list of values it finds or even just add it yourself- QuietUninstallString = $regKeyApp.QuietUninstallString. I think I’m going to do that. Thanks for the idea. My way above got the default uninstall parameters, I just manually added the /quiet /norestart since I wasn’t pulling the QuietUninstall key and didn’t have all the parameters. But it did have the /uninstall. So it looks like both of our methods get the job done, just in different ways.

You must be logged in to reply to this topic.