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を使用してこれを行うには、まずインストールされているすべてのアプリケーションを取得します。取得-子アイテム:

$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を渡すmsieexec のアンインストールパラメータ付き:

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

これが役に立つことを願っています。

更新: バージョンなどを取得する前にアプリを検索するようにコードを調整しました。

関連情報