(Get-WmiObject -Class Win32_Product -ComputerName $PCNumber -ErrorAction SilentlyContinue | Where-Object { $_.Name -match "$softwareName" }).Uninstall() | Out-Null
我有以下代码,它完美无缺。唯一的问题是,我不知道该软件是否已被删除。这不告诉我,但下面的代码确实如此。
这种方式适合我。
$software = Get-WmiObject -Class Win32_Product -ComputerName $PCNumber -ErrorAction SilentlyContinue | Where-Object { $_.Name -match "$softwareName" }
$soft = $software.Uninstall();
$n = $software.ReturnValue;
if ( $n -eq 0 ){
SOFTWARE HAS BEEN REMOVED.
}
我的问题是如何判断软件是否已被删除。 使用此代码。
(Get-WmiObject -Class Win32_Product -ComputerName $PCNumber -ErrorAction SilentlyContinue | Where-Object { $_.Name -match "$softwareName" }).Uninstall() | Out-Null
答案 0 :(得分:1)
您必须检查ReturnValue属性。当您管道到Out-Null
时,您正在抑制操作的输出,并且无法判断发生了什么,除非您发出第二个调用以查找是否返回相关软件。
我建议使用Filter参数(而不是使用Where-Object
)来查询服务器上的软件。为了安全起见,您还应该将结果传递给Foreach-Object
cmdlet,您永远不会知道由于匹配操作而返回的软件对象数量(并且您调用Uninstall方法就好像结果只是一个对象):
Get-WmiObject -Class Win32_Product -ComputerName $PCNumber -Filter "Name LIKE '%$softwareName%'" | Foreach-Object {
Write-Host "Uninstalling: $($_.Name)"
$rv = $_.Uninstall().ReturnValue
if($rv -eq 0)
{
"$($_.Name) uninstalled successfully"
} # Changed this round bracket to a squigly one to prperly close the scriptblock for "if"
else
{
"There was an error ($rv) uninstalling $($_.Name)"
}
}