2011-12-14 38 views
0
(Get-WmiObject -Class Win32_Product -ComputerName $PCNumber -ErrorAction SilentlyContinue | Where-Object { $_.Name -match "$softwareName" }).Uninstall() | Out-Null 

我有下面的代碼,它完美的作品。唯一的問題是,我不知道該軟件是否被刪除或不。這不告訴我,但下面的代碼。powershell從PC中刪除軟件

這種方式適用於我。

$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

您必須檢查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)" 
    } 
} 
+0

我有幾個程序,我需要刪除,我需要等待一個完成第一次這就是爲什麼我使用out-null。 out-null等待第一個程序完成。 – hello

+0

這就是爲什麼我需要確保腳本在排除第二個程序之前等待第一個程序運行。 – hello

+0

您可以嘗試將輸出分配給變量,而不是使用Out-Null。 –