【问题标题】:Powershell Script - How do I remove multiple packages at once?Powershell 脚本 - 如何一次删除多个包?
【发布时间】:2020-07-27 00:10:18
【问题描述】:

我正在尝试用更好的代码扩展我现有的脚本。所以我想让脚本证明软件是否真的被卸载了。我试图用 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,这就是我想要的。问题是,它仍然无法正常工作。

好吧,这不符合我的要求,如果有人可以帮助我,我会很高兴! 提前致谢!

【问题讨论】:

  • 请编辑问题并解释实际结果。没有包被删除?删除了错误的软件包?还有什么?
  • @vonPryz 我编辑了它,对不起我的英语,我希望你能明白我的意思。

标签: windows powershell cmd scripting ps


【解决方案1】:

这种行为的原因是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"
}

【讨论】:

  • 太棒了,感谢您的帮助。顺便说一句,当我读到你的文字时,我真的不得不微笑^^。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多