PS Сценарий для удаления Firefox из нескольких мест

Я работаю над созданием сценария для удаления Firefox из нескольких мест. У меня есть сценарий, который я создал, и он работает до некоторой степени. Я внес изменения в свой исходный сценарий на основе приведенного ниже ответа, а также некоторые другие изменения.

      $LocalUsers = (Get-ChildItem -Path "C:\Users").name

# Uninstalling from Program Files
if (Test-Path "${env:ProgramFiles(x86)}\Mozilla Firefox\uninstall\helper.exe"){
    Start-Process -FilePath "${env:ProgramFiles(x86)}\Mozilla Firefox\uninstall\helper.exe" -ArgumentList '/S' -Verbose #-ErrorAction SilentlyContinue
}
if (Test-Path "${env:ProgramFiles}\Mozilla Firefox\uninstall\helper.exe"){
    Start-Process -FilePath "${env:ProgramFiles}\Mozilla Firefox\uninstall\helper.exe" -ArgumentList '/S' -Verbose #-ErrorAction SilentlyContinue
}

# Uninstalling for each user
ForEach ($LocalUser in $LocalUsers){
    $Userpath = "C:\Users\" + $LocalUser
    if (Test-Path "$Userpath\AppData\Local\Mozilla Firefox\uninstall\helper.exe"){
        Start-Process -FilePath "$Userpath\AppData\Local\Mozilla Firefox\uninstall\helper.exe" -ArgumentList '/S' -Verbose #-ErrorAction SilentlyContinue
    }

    Start-Sleep 20

    # Remove shortcuts from appdata
    Remove-Item -Path "$userpath\AppData\Local\Mozilla" -Force -Recurse -Verbose #-ErrorAction SilentlyContinue
    Remove-Item -Path "$userpath\AppData\LocalLow\Mozilla" -Force -Recurse -Verbose #-ErrorAction SilentlyContinue
    Remove-Item -Path "$userpath\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Firefox.lnk" -Force -Verbose #-ErrorAction SilentlyContinue
    Remove-Item -Path "$userpath\desktop\firefox.lnk" -Force -Verbose #-ErrorAction SilentlyContinue
}

# Remove related registry keys
$pathToRemove = @(
    'HKLM:\Software\Mozilla'
    'HKLM:\SOFTWARE\mozilla.org'
    'HKLM:\SOFTWARE\MozillaPlugins'
    'HKLM:\SOFTWARE\WOW6432Node\Mozilla'
    'HKLM:\SOFTWARE\WOW6432Node\mozilla.org'
    'HKLM:\SOFTWARE\WOW6432Node\MozillaPlugins'
    'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Firefox.lnk'
)

foreach($path in $pathToRemove) {
    if(Test-Path $path) {
        try {
            Remove-Item $path -Recurse -Force -Verbose #-ErrorAction SilentlyContinue
        }
        catch {
            Write-Warning $_.Exception.Message
        }
    }
}

Сценарий работал на некоторых машинах, где он удаляет приложение, однако на других его следы остаются в программных файлах Windows. Он появляется как мертвая ссылка. Я знаю, что это мертвая ссылка, потому что на ней отсутствует логотип Firefox. Странно то, что он указывает на %localappdata%\Mozilla Firefox\uninstall\helper.exe за ошибку

Как должно выглядеть приложение, если оно установлено (без учета версии, просто скриншот из интернета):

3 ответа

У меня возникла та же проблема из-за неудачной установки winget, и я нашел оставленный ключ реестра. Когда его удалили из списка и разрешили к переустановке.

добавьте в массив удаления ключей реестра: «HKCU:\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL\Mozilla Firefox*»

Я думаю, чтобы «удалить» его для каждого профиля пользователя.
Вам нужно будет это сделать во времяForEach ($LocalUser in $LocalUsers) {раздел загрузите куст реестра пользователя в «Пользователь», затем найдите и удалите ключ reg из загруженного куста. Затем выгрузите куст...

Я предполагаю, что проблема в вашей цепи if\ elseif\ elseусловия, то что могло бы произойти, так это то, что если бы первое условие было $trueвы удаляете только первый раздел реестра, а затем выходите из связанных условий (это сделано по замыслу):

      # only results in 'hello if' and then exits the chained conditions

if($true) {
    'hello if'
}
elseif($true) {
    'hello elseif'
}

Что вы можете сделать в этом случае, так это сохранить все пути в массиве, а затем перебрать их, проверяя, существует ли путь, и, если он существует, удалить его:

      $pathToRemove = @(
    'HKLM:\Software\Mozilla'
    'HKLM:\SOFTWARE\mozilla.org'
    'HKLM:\SOFTWARE\MozillaPlugins'
    'HKLM:\SOFTWARE\WOW6432Node\Mozilla'
    'HKLM:\SOFTWARE\WOW6432Node\mozilla.org'
    'HKLM:\SOFTWARE\WOW6432Node\MozillaPlugins'
    'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Firefox.lnk'
)

foreach($path in $pathToRemove) {
    if(Test-Path $path) {
        try {
            Write-Verbose "Attempting to remove: $path" -Verbose
            Remove-Item $path -Recurse -Force
            Write-Verbose "Successfully removed: $path" -Verbose
        }
        catch {
            Write-Warning $_.Exception.Message
        }
    }
}
Другие вопросы по тегам