Windows 7에서 특정 값보다 낮은 버전 번호를 기준으로 소프트웨어를 제거하려면 어떻게 해야 합니까?

Windows 7에서 특정 값보다 낮은 버전 번호를 기준으로 소프트웨어를 제거하려면 어떻게 해야 합니까?

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
    }
} 

이게 도움이 되길 바란다.

업데이트: 버전 등을 가져오기 전에 앱을 찾도록 코드를 조정했습니다.

관련 정보