Причина такого поведения в том, что Format-Table name | Out-String -OutVariable software
даст несколько неожиданные результаты.
Давайте в качестве примера рассмотрим пакет Microsoft Teams, так как он доступен в моей системе.
$q = Get-Package | ? { $_.name -eq "Microsoft Teams" }
$q.Name
Microsoft Teams
$q.Name.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Пока все выглядит хорошо. Теперь давайте добавим в игру Format-Table
вот так:
$q | Format-Table name | Out-String -OutVariable software | Out-Null
$software
Name
----
Microsoft Teams
$software.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ArrayList System.Object
Подождите, что? Тип совсем не такой. Это потому, что форматирование в виде таблицы создаст массив строк. Это никогда не будет соответствовать простому строковому имени пакета.
Что касается исправления, просто снова используйте Get-Package
и присвойте его результат в переменной. Если такого пакета нет, результат будет равен $null
. Вот так
Get-Package -Name $app | Uninstall-Package...
$q= Get-Package | Where-Object{$_.Name -like $app}
if($q -eq $null) {
Write-Host "$app was removed"
}
else {
Write-Host "$q is still present"
}