powershell从PC中删除软件

时间:2011-12-14 11:39:45

标签: powershell powershell-v2.0 powershell-remoting

(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

1 个答案:

答案 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)"
     }
}
相关问题