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

1

Eu gostaria de remover todos os softwares 7-zip menos que a versão 16.00 e instalar a versão mais recente. Se uma versão maior que 16 existe, então não faça nada.

Eu tentei fazer isso usando Objetos de Diretiva 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á um ponto amarelo ao lado do item nas configurações do gpedit.msc na máquina de teste.

De acordo com a sugestão de 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 é assim:

    
por NotADoctor 21.03.2017 / 18:08

1 resposta

2

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.

    
por 21.03.2017 / 18:45