Flighty
Flighty

Reputation: 13

Matching two lists and find uninstall string with Powershell

I have a problem with my Script. I wanted to make a Script which makes a list of software which is found in a specific registry path and see if this software equals installed software. and if so it should output me the uninstall string. but right now it does not work as wanted. it never show me the output I wanted even if its similar. As Example i have the Program Git as Branding and in the software I got Git version 2.26.2 but it wont output the uninstall string when I selected git.

My code is:

$branding = Get-ChildItem "HKLM:\Software\DLR\Branding" | Get-ItemProperty | Select-Object -expandProperty ProgramName
$software = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Select-Object -ExpandProperty DisplayName

ForEach ($brandinglist in $branding) {
    $objCombobox.Items.Add("$brandinglist")
}

$objComboBox_SelectedIndexChanged=
{
    $selectme = $objCombobox.SelectedItem
    Write-Host $selectme
    if ("$selectme" -like "*$software*") {
        $uninstall = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,     HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object {$_.DisplayName -match "$electme" } | Select-Object -Property UninstallString
        Write-Host "$uninstall"
    }
}

Upvotes: 1

Views: 284

Answers (1)

Theo
Theo

Reputation: 61148

You are trying the -like comparison wrong, in which you compare the selected item to an array of displaynames which doesn't work that way.

Also, there is no reason to get the Uninstall strings and Displaynames using an almost identical code twice.

Try

# get a string array of program names
$branding = Get-ChildItem -Path 'HKLM:\Software\DLR\Branding' | Get-ItemProperty | Select-Object -ExpandProperty ProgramName

$regPaths = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
# get an object array of DisplayName and UninstallStrings
$software = Get-ChildItem -Path $regPaths | Get-ItemProperty | Select-Object DisplayName, UninstallString

# fill the combobox with the (string array) $branding
$objCombobox.Items.AddRange($branding)

$objComboBox.Add_SelectedIndexChanged ({
    $selectme = $objCombobox.SelectedItem
    Write-Host $selectme
    # get the objects that have a displayname like the selected item and write out the matching Uninstall strings
    $software | Where-Object {$_.DisplayName -like "*$selectme*" } | ForEach-Object {
        Write-Host $_.UninstallString
    }
})

Upvotes: 1

Related Questions