
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을 사용하여 먼저 설치된 모든 응용 프로그램을 가져와 이 작업을 수행할 수 있습니다.Get-ChildItem:
$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를 가져와야 합니다. 당신은 이것을 얻을 수 있습니다UninstallString레지스트리 항목의 GUID가 있으면 제품을 제거할 수 있습니다.시작 프로세스GUID를 다음으로 전달합니다.msiexec제거 매개변수 사용:
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
}
}
이게 도움이 되길 바란다.
업데이트: 버전 등을 가져오기 전에 앱을 찾도록 코드를 조정했습니다.