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