Глава 7. Отчёты об ошибках

для успешного составления сценариев обработка ошибок это то, что необходимо иметь. Когда имеется некая ошибка, вы желаете получить по ней отчёт для своего администратора или владельца соответствующими процессом/ автоматизацией. PowerShell обладает различными способами выполнения отчётов об ошибках. Наиболее распространённым выступает переменная $error, поскольку она содержит все те ошибки, которые произошли в вашем сеансе. Давайте рассмотрим некие образцы шпаргалок кода, которыми вы можете воспользоваться. Вы можете заносить ошибки в журнал, либо отправлять их электронной почтой.

Отчёты об ошибках по электронной почте

Ниже приводится тот код, который можно применять для отправки электронных сообщений об ошибках. Вы можете вставлять этот код в свой сценарий с тем, чтобы когда ваш сценарий приводит к ошибке, она бы отправлялась электронным письмом.

$error это переменная по умолчанию в PowerShell, которая содержит имеющуюся ошибку в случае её возникновения при исполнении вашего кода. В Листинге 7-1 вы проверяете что $error не равняется нулю и затем отправляете свою ошибку электронным письмом.

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

 

Листинг 7-1. Отправка ошибок электронным письмом


$from = "donotreply@lab.com"
$to="vikas@lab.com"
$subject = "Error has occured"
$smtpServer="smtp.lab.com"

if ($error)
      {
Send-MailMessage -SmtpServer $smtpserver -From $from -To $to -Subject $subject -Body $error[0].ToString()
$error.clear()
       }
 	   

Листинг 7-1 упускает один важный момент. Он просто отправляет самую последнюю ошибку, однако что если вы хотите отправить всю ошибку целиком, которая на самом деле это некий массив и send-mailmessage не способен отправить её действенным образом? Вы можете воспользоваться функцией Send-Email из Листинга 7-2, которая также является частью модуля vsadmin, которым мы поделились в своей главе о модулях.

 

Листинг 7-2. Функция Send-Email для отправки массива $error


function Send-Email
{
  [CmdletBinding()]
  param
  (
    [Parameter(Mandatory = $true)]
    $From,
    [Parameter(Mandatory = $true)]
    [array]$To,
    [array]$bcc,
    [array]$cc,
    $body,
    $subject,
    $attachment,
    [Parameter(Mandatory = $true)]
    $smtpserver
  )
  $message = New-Object System.Net.Mail.MailMessage
  $message.From = $From
  if ($To -ne $null)
  {
    $To | ForEach-Object{
      $to1 = $_
      $to1
      $message.To.Add($to1)
    }
  }
  if ($cc -ne $null)
  {
    $cc | ForEach-Object{
      $cc1 = $_
      $cc1
      $message.CC.Add($cc1)
    }
  }
  if ($bcc -ne $null)
  {
    $bcc | ForEach-Object{
      $bcc1 = $_
      $bcc1
      $message.bcc.Add($bcc1)
    }
  }
  $message.IsBodyHtml = $true
  if ($subject -ne $null)
  {$message.Subject = $subject}
  if ($attachment -ne $null)
  {
    $attach = New-Object Net.Mail.Attachment($attachment)
    $message.Attachments.Add($attach)
  }
  if ($body -ne $null)
  {$message.body = $body}
  $smtp = New-Object Net.Mail.SmtpClient($smtpserver)
  $smtp.Send($message)
 	   

После того как вы импортировали необходимую функцию из Листинга 7-2, вы можете воспользоваться кодом из Листинга 7-3, который аналогичен коду в Листинге 7-1. Единственным изменением является применение Send-Email вместо встроенного Send-MailMessage.

 

Листинг 7-3. Отправка массива $error электронным письмом


$from = "donotreply@lab.com"
$to="vikas@lab.com"
$subject = "Error has occured"
$smtpServer="smtp.lab.com"

if ($error)
      {
  Send-Email -smtpserver $smtpServer -From $from -To $to -subject $subject -body $error
  $error.clear()
       }
 	   

Регистрация всего содержащего ошибки

Существует некий встроенный командлет PowerShell, которым вы можете воспользоваться в самом начале своего сценария и остановить его в самом конце этого сценария. Это часто носит название журналирования интерпретации (transcript).


Start-transcript # в самом начале вашего сценария
Stop-transcript # в самом конце вашего сценария
		

Данный журнал будет по умолчанию сохраняться в папке My Documents учётной записи исполнения. Для сохранения этой интерпретации в ином месте вы можете определить значение пути, как это показано на Рисунке 7-1.


$log = "c:\data\log.txt"
Start-transcript -path $log # в самом начале вашего сценария
Stop-transcript # в самом конце вашего сценария
		
 

Рисунок 7-1


Отображение журнала интерпретации в PowerShell

Регистрация ошибок в текстовый файл

Вы также можете регистрировать ошибки в неких текстовых файлах. Это шпаргалочное руководство описывает функцию Write-Log; то же самое можно применять для регистрации ошибок в текстовых файлах. Получаемые результаты отображаются на Рисунке 7-2.


$log = Write-Log -Name "Errorlog" -folder "logs" -Ext "log"
write-log -message "error is $error" -path $log -Severity error
		
 

Рисунок 7-2


Отображение регистрируемых в текстовом файле ошибок

Выводы

В этой главе мы изучили как выдавать отчёт об ошибках при их возникновении, как их записывать в файлы регистрации, как их отправлять при помощи электронных писем и как перехватывать весь сеанс PowerShell целиком при помощи командлета start-transcript.