Я работаю над следующим примером из одной из книг PowerShell от Don Jones как часть моего личного развития, и у меня есть некоторые серьезные проблемы с тем, чтобы заставить конструкцию try/catch работать так, как она должен. Как вы можете видеть, когда выполняется блок catch
, он устанавливает переменную с именем $everything_ok
в $false
- которая должна запускать блок else
в следующем коде. Что он делает - файл журнала добавляется в соответствии с моими ожиданиями.Проблема с обработкой ошибок с помощью Try/Catch в Powershell
Однако это не останавливает скрипт от ТАКЖЕ выполнения кода в if
блоке и извергает «Сервер RPC недоступен» ошибки при попытке запросить выдуманный машину «NOTONLINE» (тип Исключение System.Runtime.InteropServices.COMException
) ,
Что делает этот еще незнакомец в том, что я прошел через скрипт с точками останова, проверяя содержимое переменной $everything_ok
на этом пути и никогда не содержал неправильное значение в любой момент. Итак, почему на самом деле блок if
все еще выполняется для «NOTONLINE», когда указанное мной условие (if ($everything_ok = $true)
) не было выполнено?
Я делаю что-то неправильно здесь?
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
Ницца, спасибо! Оказывается, в этом случае я тоже могу оставить оператор присваивания, так как он является логическим значением. Знал, было бы что-то простое ... –