Глава 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