
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:
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.