Como posso desinstalar o software com base no número da versão inferior a um determinado valor no Windows 7?

Como posso desinstalar o software com base no número da versão inferior a um determinado valor no Windows 7?

Gostaria de remover todos os softwares 7-zip anteriores à versão 16.00 e instalar a versão mais recente. Se existir uma versão superior a 16, não faça nada.

Tentei fazer isso usando Objetos de Política de Grupo na opção de instalação de software para configurações de software na configuração do computador. O objeto de política de grupo aparece no RSoP da máquina, mas há uma exclamação amarela ao lado do item nas configurações de gpedit.msc na máquina de teste.

De acordo com a sugestão do Rabbid10, tentei o seguinte:

$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}

$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"

    echo "versionToCheck is:"
    echo $versionToCheck

    echo "DisplayVersionAsVersion is currently: "
    echo $DisplayVersionAsVersion


        if ($DisplayVersionAsVersion -gt $VersionToCheck) {
            [void]$FilteredApps.Add($App)
        }
    }
}

Echo "last part of script"

foreach ($App in $FilteredApps) {
    echo "Hi, Im in the uninstall section"
    # 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
    }
} 

E minha saída fica assim:

insira a descrição da imagem aqui

Responder1

Para fazer isso, você deve efetivamente pesquisar as chaves de desinstalação do registro do produto que deseja remover, por nome e versão. Você pode usar o PowerShell para fazer isso, primeiro pegando todos os aplicativos instalados usandoGet-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 emNome de exibiçãoeVersão de exibição. 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 doDesinstalarStringdo item de registro. Depois de ter o GUID, você poderá desinstalar o produtoProcesso iniciale passando o GUID paramsiexeccom 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
    }
} 

Eu espero que isso ajude.

ATUALIZAÇÃO: código ajustado para procurar o aplicativo antes de tentar obter a versão, etc.

informação relacionada