¿Cómo puedo desinstalar software si el número de versión es inferior a un valor determinado en Windows 7?

¿Cómo puedo desinstalar software si el número de versión es inferior a un valor determinado en Windows 7?

Me gustaría eliminar todo el software 7-zip anterior a la versión 16.00 e instalar la última versión. Si existe una versión superior a 16, no haga nada.

Intenté hacer esto usando Objetos de política de grupo en la opción de instalación de software para la configuración del software en la configuración de la computadora. El objeto de política de grupo aparece en el RSoP de la máquina, pero hay una exclamación amarilla junto al elemento en la configuración de gpedit.msc en la máquina de prueba.

Según la sugerencia de Rabbid10, probé lo siguiente:

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

Y mi salida se ve así:

ingrese la descripción de la imagen aquí

Respuesta1

Para hacer esto, efectivamente debe buscar en el registro las claves de desinstalación del producto que desea eliminar, por nombre y versión. Puede usar PowerShell para hacer esto tomando primero todas las aplicaciones instaladas 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}

Una vez que tenga todas las entradas, puede filtrarlas segúnNombre para mostraryVersión de visualización. Para hacer esto, puedes hacer algo como esto:

$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)
        }
    }
}

Una vez que tenga todas las aplicaciones que coincidan con sus criterios de búsqueda, necesitará obtener los GUID de esas aplicaciones. Puedes obtener esto delDesinstalar cadenadel elemento registral. Una vez que tenga GUID, debería poder desinstalar el producto.Proceso de inicioy pasando el GUID amsiexeccon parámetros de desinstalación:

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 esto ayude.

ACTUALIZACIÓN: Código modificado para buscar la aplicación antes de intentar obtener la versión, etc.

información relacionada