Ваш код выглядит слишком сложным.
Возможно, проще использовать это, чтобы получить список установленного программного обеспечения на компьютере:
$Software = Invoke-Command -Computer $Computer -ScriptBlock {Get-CimInstance -ClassName Win32_Product}
Оттуда вы можете просмотреть идентифицирующие номера и т. Д. Он также показывает, куда сохранен локальный файл MSI.
$Software | Select-Object Name,IdentifyingNumber,LocalPackage
Таким образом, примером функции может быть
param(
[Parameter(Mandatory=$true)]
[string[]]$Name
)
ForEach ($x in $Name) {
[array]$RemoveIDs += Get-CimInstance -ClassName Win32_Product |
Where-Object {$_.Name -match $x}
}
$RemoveIDs | ForEach-Object {
Sleep 10
$msi=$_.LocalPackage
#$msi=$_.IdentifyingNumber
& msiexec /x $msi /qn
}