удалить установленные программы с помощью powershell, используя частичное совпадение - PullRequest
0 голосов
/ 05 октября 2018

У меня установлены некоторые программы в Windows 10 и 7, которые начинаются с (в программах удаления)

"Python info.data-5.332234" "Python delta.ind-5.332234" "Модуль Python.data-15.332234 "" Python hatch.back-0.332234 "

Я пробовал различные сценарии, чтобы попытаться удалить их, используя частичное совпадение с PowerShell, но, похоже, ни один из них не удаляет программы.

Это последний использованный мной скрипт, который не работает ... он удаляет запись реестра, но фактически не удаляет папку или запись из Uninstall Programs

$remove = @('Python info.data', 'Python delta.ind', 'Python module.data', 'Python hatch.back')

foreach ($prog_name in $remove) {

Write "Uninstalling" % $prog_name
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $prog_name } | select UninstallString


if ($uninstall32) {

$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling..."
Write $uninstall32
start-process "msiexec.exe" -arg "/X $uninstall32 /qn" -Wait}

}

1 Ответ

0 голосов
/ 06 октября 2018

Проблема в том, что переменная $uninstall32 может содержать более 1 записи.Добавьте $uninstall32.GetType() перед запуском msiexec, чтобы проверить, может ли переменная содержать более одной строки.Если это так, msiexec не запустится, потому что вы передаете два идентификатора GUID одновременно.

Используйте класс WMI Win32_Product для получения идентификаторов GUID нужных приложений.

$remove = @('Python info.data', 'Python delta.ind', 'Python module.data', 'Python hatch.back')

foreach ($prog_name in $remove) {    
    $uninstall32 = @(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '$prog_name%'")
    foreach ($product in $uninstall32) {
        Write "Uninstalling...`n$($product.Name)"
        $exitCode = (Start-Process "msiexec.exe" -ArgumentList "/X $($product.IdentifyingNumber) /qn" -Wait -PassThru).ExitCode    
        Write "$($product.Name) return ExitCode: $exitCode"
    }       
}

Также добавьте -PassThrue Переключитесь на Start-Process CMDLet и перехватите / выведите ExitCode каждого процесса удаления.

Убедитесь, что ваш Powershell / ISE работает с повышенными привилегиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...