Глава 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.
Существует некий встроенный командлет PowerShell, которым вы можете воспользоваться в самом начале своего сценария и остановить его в самом конце этого сценария. Это часто носит название журналирования интерпретации (transcript).
Start-transcript # в самом начале вашего сценария
Stop-transcript # в самом конце вашего сценария
		
   Данный журнал будет по умолчанию сохраняться в папке My Documents учётной записи 
   исполнения. Для сохранения этой интерпретации в ином месте вы можете определить значение пути, как это показано на 
   Рисунке 7-1.
$log = "c:\data\log.txt"
Start-transcript -path $log # в самом начале вашего сценария
Stop-transcript # в самом конце вашего сценария
		
	Вы также можете регистрировать ошибки в неких текстовых файлах. Это шпаргалочное руководство описывает функцию 
   Write-Log; то же самое можно применять для регистрации ошибок в текстовых файлах. 
   Получаемые результаты отображаются на 
   Рисунке 7-2.
$log = Write-Log -Name "Errorlog" -folder "logs" -Ext "log"
write-log -message "error is $error" -path $log -Severity error
		
	
