Попытка/выгода, кажется, не имеет эффект

Я не имею значения. Последний является самым быстрым для ввода хотя:)

68
задан Svante 17 July 2009 в 10:50
поделиться

2 ответа

Мне удалось продублировать ваш результат при попытке выполнить удаленный запрос WMI. Сгенерированное исключение не перехватывается методом Try / Catch и не перехватывается ловушкой, поскольку это не «прерывающая ошибка». В PowerShell бывают прерывающие ошибки и непрекращающиеся ошибки. Похоже, что Try / Catch / finally и Trap работают только с завершающими ошибками.

Он записывается в автоматическую переменную $ error, и вы можете проверить этот тип непрекращающихся ошибок, посмотрев на $? автоматическая переменная, которая сообщит вам, была ли последняя операция успешной ($ true) или неудачной ($ false).

Судя по появлению сгенерированной ошибки, ошибка возвращается, а не заключена в перехватываемое исключение. Ниже приведен график сгенерированной ошибки.

PS C:\scripts\PowerShell> Trace-Command -Name errorrecord  -Expression {Get-WmiObject win32_bios -ComputerName HostThatIsNotThere}  -PSHost
DEBUG: InternalCommand Information: 0 :  Constructor Enter Ctor
Microsoft.PowerShell.Commands.GetWmiObjectCommand: 25857563
DEBUG: InternalCommand Information: 0 :  Constructor Leave Ctor
Microsoft.PowerShell.Commands.GetWmiObjectCommand: 25857563
DEBUG: ErrorRecord Information: 0 :  Constructor Enter Ctor
System.Management.Automation.ErrorRecord: 19621801 exception =
System.Runtime.InteropServices.COMException (0x800706BA): The RPC
server is unavailable. (Exception from HRESULT: 0x800706BA)
   at
System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Management.ManagementScope.InitializeGuts(Object o)
   at System.Management.ManagementScope.Initialize()
   at System.Management.ManagementObjectSearcher.Initialize()
   at System.Management.ManagementObjectSearcher.Get()
   at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing()
errorId = GetWMICOMException errorCategory = InvalidOperation
targetObject =
DEBUG: ErrorRecord Information: 0 :  Constructor Leave Ctor
System.Management.Automation.ErrorRecord: 19621801

Возможный обход вашего кода:

try
{
    $colItems = get-wmiobject -class "Win32_PhysicalMemory" -namespace "root\CIMV2" -computername $strComputerName -Credential $credentials
    if ($?)
    {
      foreach ($objItem in $colItems) 
      {
          write-host "Bank Label: " $objItem.BankLabel
          write-host "Capacity: " ($objItem.Capacity / 1024 / 1024)
          write-host "Caption: " $objItem.Caption
          write-host "Creation Class Name: " $objItem.CreationClassName      
          write-host
      }
    }
    else
    {
       throw $error[0].Exception
    }
73
ответ дан 24 November 2019 в 14:10
поделиться

Изменить: Как указано в комментариях, следующее решение применимо только к PowerShell V1.

См. это сообщение в блоге на тему «Технические приключения Адама Вейгерта» для получения подробной информации о том, как это реализовать.

Пример использования (скопируйте / вставьте из блога Адама Вейгерта):

Try {
    echo " ::Do some work..."
    echo " ::Try divide by zero: $(0/0)"
} -Catch {
    echo "  ::Cannot handle the error (will rethrow): $_"
    #throw $_
} -Finally {
    echo " ::Cleanup resources..."
}

В противном случае вам придется использовать перехват исключений .

1
ответ дан 24 November 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: