
Ich möchte alle 7-Zip-Software unter Version 16.00 entfernen und die neueste Version installieren. Wenn eine Version höher als 16 vorhanden ist, tun Sie nichts.
Ich habe versucht, dies mithilfe von Gruppenrichtlinienobjekten in der Softwareinstallationsoption für Softwareeinstellungen in der Computerkonfiguration zu tun. Das Gruppenrichtlinienobjekt wird im RSoP des Computers angezeigt, aber neben dem Element in den gpedit.msc-Einstellungen auf dem Testcomputer befindet sich ein gelbes Ausrufezeichen.
Gemäß dem Vorschlag von Rabbid10 habe ich Folgendes versucht:
$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
}
}
Und meine Ausgabe sieht folgendermaßen aus:
Antwort1
Dazu müssen Sie die Registrierungsschlüssel für die Deinstallation des Produkts, das Sie entfernen möchten, nach Name und Version durchsuchen. Sie können PowerShell dazu verwenden, indem Sie zunächst alle installierten Anwendungen mitUntergeordnetes Element abrufen:
$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}
Sobald Sie alle Einträge haben, können Sie sie filtern nachAnzeigenameUndAnzeigeversionDazu können Sie etwa Folgendes tun:
$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)
}
}
}
Nachdem Sie alle Apps gefunden haben, die Ihren Suchkriterien entsprechen, müssen Sie die GUIDs dieser Apps abrufen. Diese erhalten Sie überDeinstallationsstringdes Registrierungselements. Sobald Sie die GUID haben, sollten Sie das Produkt deinstallieren könnenStart-Prozessund Übergabe der GUID anmsiexecmit Deinstallationsparametern:
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
}
}
Ich hoffe das hilft.
UPDATE: Code optimiert, um nach der App zu suchen, bevor versucht wird, die Version usw. abzurufen.