我想删除所有低于 16.00 版本的 7-zip 软件并安装最新版本。如果存在高于 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
为此,您必须按名称和版本搜索要删除的产品的注册表卸载项。您可以使用 PowerShell 执行此操作,方法是首先使用以下命令抓取所有已安装的应用程序获取子项:
$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"
if ($DisplayVersionAsVersion -lt $VersionToCheck) {
[void]$FilteredApps.Add($App)
}
}
}
获得符合搜索条件的所有应用后,您需要获取这些应用的 GUID。您可以从卸载字符串注册表项。获得 GUID 后,您应该能够卸载该产品开始进程并将 GUID 传递给执行命令使用卸载参数:
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
}
}
我希望这有帮助。
更新:调整代码以在尝试获取版本等之前查找应用程序。