2013-12-14 6 views
1

Я работаю над следующим примером из одной из книг 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 

ответ

4

Значок равенства в Powershell используется как операция назначения. -eq используется для проверки равенства. Таким образом, ваш оператор if присваивает $ true $ all_ok, который затем проверяет true.

+0

Ницца, спасибо! Оказывается, в этом случае я тоже могу оставить оператор присваивания, так как он является логическим значением. Знал, было бы что-то простое ... –

Смежные вопросы