Para fazer isso, você efetivamente precisa procurar no registro as chaves de Desinstalação do produto que deseja remover, por nome e versão. Você pode usar o PowerShell para fazer isso primeiro pegando todos os aplicativos instalados usando Get-ChildItem :
$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}
Depois de ter todas as entradas, você pode filtrá-las com base em DisplayName e DisplayVersion . Para fazer isso, você pode fazer algo assim:
$FilteredApps = New-Object System.Collections.ArrayList
foreach ($App in $AllRegAppEntries) {
if ($App.DisplayName -ilike "*7-Zip*") {
try {
$DisplayVersionAsVersion = New-Object System.Version $App.DisplayVersion
} catch {
$DisplayVersionAsVersion = New-Object System.Version
}
$VersionToCheck = New-Object System.Version "16.0.0.0"
if ($DisplayVersionAsVersion -lt $VersionToCheck) {
[void]$FilteredApps.Add($App)
}
}
}
Depois de ter todos os aplicativos que correspondem aos seus critérios de pesquisa, você precisará obter os GUIDs desses aplicativos. Você pode obter isso do UninstallString do item de registro. Depois de ter o GUID, você poderá desinstalar o produto Iniciar -Processe e passando o GUID para msiexec com os parâmetros de desinstalação:
foreach ($App in $FilteredApps) {
# Make sure uninstall string uses MSIEXEC
if ($App.UninstallString -ilike "msiexec*") {
$GUID = $App.UninstallString.Substring($App.UninstallString.IndexOf("{"))
$GUID = $GUID.Substring(0, $GUID.IndexOf("}") + 1)
Write-Host "Running the following command: msiexec.exe /x $GUID /qn /norestart"
Start-Process "msiexec.exe" "/x $GUID /qn /norestart" -Wait
}
}
Espero que isso ajude.
ATUALIZAÇÃO: código ajustado para procurar aplicativo antes de tentar obter a versão, etc.