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"
}
我正在尝试用更好的代码扩展我现有的脚本。所以我想让脚本证明软件是否真的被卸载了。我试着用 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"
}