
Я хотел бы удалить все 7-zip-программы ниже версии 16.00 и установить последнюю версию. Если существует версия выше 16, то ничего не делайте.
Я попытался сделать это с помощью объектов групповой политики в опции установки программного обеспечения для параметров программного обеспечения в конфигурации компьютера. Объект групповой политики отображается в RSoP машины, но в настройках gpedit.msc на тестовой машине рядом с элементом стоит желтый восклицательный знак.
По совету Rabbid10 я попробовал следующее:
$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
}
}
И мой вывод выглядит так:
решение1
Чтобы сделать это, вам фактически нужно искать ключи Uninstall реестра для продукта, который вы хотите удалить, по имени и версии. Вы можете использовать PowerShell, чтобы сделать это, сначала захватив все установленные приложения с помощьюПолучить-ChildItem:
$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}
После того, как у вас есть все записи, вы можете отфильтровать их на основеОтображаемое имяиDisplayVersion. Для этого можно сделать что-то вроде этого:
$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)
}
}
}
После того, как у вас будут все приложения, соответствующие вашим критериям поиска, вам нужно будет получить GUID этих приложений. Вы можете получить это изУдалитьСтрокуэлемента реестра. После того, как у вас есть GUID, вы сможете удалить продуктНачало процессаи передача GUIDmsiexecс параметрами удаления:
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
}
}
Надеюсь, это поможет.
ОБНОВЛЕНИЕ: Изменен код для поиска приложения перед попыткой получить версию и т. д.