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


1

버전 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
이 작업을 수행했을 때 간단히 하위 버전을 제거하고 계속 실행했습니다. 그러나 나는 그것들을 모두 제거하고 최신이 아닌 경우 최신 버전을 설치할 준비가되었습니다.
SDsolar

답변:


2

이렇게하려면 이름과 버전으로 제거하려는 제품의 레지스트리 제거 키를 효과적으로 검색해야합니다. Get-ChildItem 을 사용하여 설치된 모든 응용 프로그램을 먼저 가져 와서 PowerShell을 사용하여이 작업을 수행 할 수 있습니다 .

$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}

모든 항목이 있으면 DisplayNameDisplayVersion을 기준으로 항목을 필터링 할 수 있습니다 . 이렇게하려면 다음과 같이하면됩니다.

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

이게 도움이 되길 바란다.

업데이트 : 버전 등을 얻으려고 시도하기 전에 앱을 찾도록 코드를 수정했습니다.


답변 주셔서 감사합니다. 답변의 전반부에서 줄을 실행하면 다음과 같은 오류 메시지가 나타납니다. New-Object : "1"인수로 ".ctor"호출 예외 : "버전 문자열 부분이 너무 짧거나 너무 깁니다. " 제거 목록의 각 프로그램에 대해이 작업을 수행합니다.
NotADoctor

미안합니다. 위에 코드를 입력하기 전에 실제로 코드를 실행 했어야합니다. 업데이트를 참조하십시오. 이상적으로는 이러한 서로 다른 프로세스를 매개 변수가 지정된 함수로 처리하지만 그렇지 않은 경우 요청한 내용에 적합합니다.
Rabbid10

업데이트 해주셔서 감사합니다. 디버깅으로 스크립트를 다시 시도했습니다. 스크립트가 첫 번째 foreach 루프를 통과하는 것처럼 보이지만 두 번째 부분에는 들어 가지 않습니다. 'foreach ($ Apped $ FilteredApps) {'뒤에 에코를 넣었는데 보이지 않습니다. 테스트 할 때 장치에 설치 한 7-Zip 버전은 7-zip 9.20
NotADoctor

1
아 ... 알다시피, 오타가 하나 더 발견되었습니다. 위의 "foreach ($ AllRegAppEntries의 $ App)"섹션에서 버전을 확인하고 있습니다. 내 컴퓨터에 16.4가 있으므로 16.0.0.0 이상의 버전을 찾고있었습니다. 아래 버전을 찾도록 변경했습니다.
Rabbid10

안녕 래 비드 당신의 응답을 주셔서 감사합니다. 이것은 완벽하게 작동했습니다. Powershell을 배우도록 영감을 주셨습니다. :)
NotADoctor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.