Powershell 脚本 - 如何一次删除多个包?

Powershell Script - How do I remove multiple packages at once?

我正在尝试用更好的代码扩展我现有的脚本。所以我想让脚本证明软件是否真的被卸载了。我试着用 foreach 来做到这一点。这是我的代码:

function deletesoftware2 () {
$ErrorActionPreference = 'SilentlyContinue'
$appname = @(
    #"*HP Support Assistant*",
    #"*HP Support Solutions Framework*",
    #"*Dell SupportAssist*",
    #"*Dell Command | Update*",
    "*NuGet*"
)
ForEach($app in $appname){
    Write-Host "Removing $app from System"
    Get-Package -Name $app | Uninstall-Package -ErrorAction SilentlyContinue | Out-Null
        Start-Sleep -Seconds 20
    Get-Package | Where-Object{$_.Name -like $app} | Format-Table name | Out-String -OutVariable software | Out-Null
    if ($software -match $app) {
        Write-Host "$app wasnt found or could not removed"

    }
    else {
        Write-Host "$app was removed"   
    }        
}
Start-Sleep -Seconds 10

}

编辑: 如果我 运行 显示的脚本,它会直接跳转到 else,即使没有删除软件。我尝试将 if 中的“$app”直接替换为 NuGet 并且成功了。但是如果我写主机 $app 变量,它说的正是 Nuget,这就是我想要的。问题是,还是不行。

好吧,这并不像我想要的那样有效,如果有人能帮助我,我会很高兴! 提前致谢!

此行为的原因是 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

等等,什么?类型根本不一样。这是因为格式化为 table 将创建一个字符串数组。这永远不会匹配包的简单字符串名称。

至于修复,只需再次使用 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"
}