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