Для большинства моих программ скрипты в этом посте сделали свою работу.
Но мне пришлось столкнуться с устаревшей программой, которую я не мог удалить с помощью msiexec.exe или класса Win32_Product. (по какой-то причине я получил выход 0, но программа все еще была там)
Мое решение было использовать класс Win32_Process:
с помощью nickdnk эта команда для получения пути удаления файла exe:
64bit:
[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString
32bit:
[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString
вам придется очистить строку результата:
$uninstallPath = $unInstallPathReg[0].UninstallString
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstallPath = $uninstallPath .Trim()
теперь, когда у вас есть программа удаления файла exe, путь к файлу вы можете использовать эту команду:
$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {$_.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath")
$ uninstallResult - будет иметь код выхода. 0 - успех
вышеприведенные команды также могут выполняться удаленно - я сделал это с помощью команды invoke, но я считаю, что добавление аргумента -computername может работать