2013-12-14 59 views
1

我一直在從Don Jones的PowerShell書籍的一個作爲我個人開發的一部分研究以下示例,並且遇到了一些嚴重的問題,導致try/catch構造可以正常工作應該。如您所見,當catch塊執行時,它會將一個名爲$everything_ok的變量設置爲$false - 這應該在以下代碼中觸發else塊。它所做的 - 根據我的預期追加日誌文件。在PowerShell中嘗試/捕獲錯誤處理問題

然而,它並不會停止執行if區塊中代碼的腳本,並在它試圖查詢化妝機「NOTONLINE」時發現「RPC服務器不可用」錯誤(異常類型爲System.Runtime.InteropServices.COMException) 。

什麼使得這個更奇怪的是,我用斷點檢查了腳本,檢查了$everything_ok變量的內容,並且在任何時候它都沒有包含錯誤的值。那麼爲什麼在我指定的條件(if ($everything_ok = $true))沒有被滿足的情況下,if塊仍然在執行'NOTONLINE'?

我在這裏做錯了什麼?

function get-systeminfo { 
    <# 
    .SYNOPSIS 
    Retrieves Key Information on 1-10 Computers 
    #> 
    [cmdletbinding()] 
    param (
     [parameter(mandatory=$true,valuefrompipeline=$true,valuefrompipelinebypropertyname=$true,helpmessage="computer name or ip address")] 
     [validatecount(1,10)] 
     [validatenotnullorempty()] 
     [alias('hostname')] 
     [string[]]$computername, 
     [string]$errorlog = "C:\retry.txt", 
     [switch]$logerrors 
    ) 
    BEGIN { 
     write-verbose "Error log will be $errorlog" 
     } 
    PROCESS { 

     foreach ($computer in $computername) { 
      try {$everything_ok = $true 
       gwmi win32_operatingsystem -computername $computer -ea stop 
       } catch { 
       $everything_ok = $false 
       write-verbose "$computer not Contactable" 
       } 
      if ($everything_ok = $true) { 
       write-verbose "Querying $computer" 
       $os = gwmi win32_operatingsystem -computername $computer 
       $cs = gwmi win32_computersystem -computername $computer 
       $bios = gwmi win32_bios -computername $computer 
       $props = @{'ComputerName' = $cs.__SERVER; 
         'OSVersion' = $os.version; 
         'SPVersion' = $os.servicepackmajorversion; 
         'BiosSerial' = $bios.serialnumber; 
         'Manufacturer' = $cs.manufacturer; 
         'Model' = $cs.model} 
       write-verbose "WMI Queries Complete" 
       $obj = new-object -type psobject -property $props 
       write-output $obj 
      } 
      elseif ($everything_ok = $false) { 
       if ($logerrors) { 
         "$computer $_" | out-file $errorlog -append 
         } 
       } 
     } 
    } 
    END {} 
} 

get-systeminfo -host localhost, NOTONLINE -verbose -logerrors 

回答

4

Powershell中的等號被用作賦值操作。 -eq用於測試是否相等。所以你的if語句將$ true分配給$ everything_ok,然後測試true。

+0

不錯,謝謝!事實證明,在這種情況下,我也可以將賦值運算符全部排除,因爲它是一個布爾值。知道這將是簡單的事情... –