none
PoSH: Отловить исключение и отправить на e-mail RRS feed

  • Вопрос

  • Коллеги, есть необходимость в скрипте, который  выполняет некоторые действия и в случае возникновения ошибки (на каком либо из этапов) отправляет сообщение на e-mail, тело сообщения должно содержать расширенную информацию об ошибке. На текущий момент имею скрипт:

    Function Send-smtpmail(
    
        $Server = $SmtpHostPreference, # SMTP Сервер
        $From = $SmtpFromPreference, # Адрес отправителя
        [string[]]$To, # Получатели
        $Body = "", # Тело сообщения
        $Subject = "", # Тема сообщения
        [System.IO.FileInfo[]]$Attachment=@() # Вложения использовать так : -attachment (dir c:\files\*.txt)
        # Для работы скрипта, должна быть разрешена анонимная отправка сообщений по SMTP. Хотя можно прикрутить и аутентификацию.
    )
    {
    Write-Verbose "Создаем объекты SmtpClient и MailMessage"
    $SmtpClient = New-Object System.Net.Mail.SmtpClient
    $Message = New-Object System.Net.Mail.MailMessage
    Write-Verbose "Устанавливаем свойства этих объектов"
    $SmtpClient.Host = $Server
    $Message.Body = $Body
    $Message.Subject = $Subject
    $Message.From = $From
    Write-Verbose "Создаем и добавляем вложения"
    $Attachment | ForEach-Object {
        $a = New-Object System.Net.Mail.Attachment($_.fullname)
        $Message.Attachments.Add($a)
    }
    Write-Verbose "Добавляем получателей"
    $To | ForEach-Object {$Message.To.Add($_)}
    Write-Verbose "Отправляем сообщение"
    $smtpclient.Send($Message)
    Write-Verbose "Удаляем объекты"
    $Message.Dispose()
    }
    
    Stop-Service -Name Spooler -force 
    Start-Sleep –s 15 #приостанавливаем выполнение на 15 сек.
    Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers" -recurse
    Remove-Item -Path c:\WINDOWS\system32\spool\PRINTERS\*.*
    Start-Service -Name Spooler
    
    If (($?)) {Send-smtpmail -to user@domain.ru -server mailserver.domain.ru -from user@domain.ru -subject "Task:Complete" -body "Задание выполнено успешно"}
    Else 
    	{Send-smtpmail -to user@domain.ru -server mailserver.domain.ru -from user@domain.ru -subject "Task:Error" -body $Error}	  
    

     Так работает, но естественно не правильно  т.к. ($?) иногда будет принимать значение то true, to false :)

    Пробовал вот так (заведомо указывая команды, приводящие к ошибке) :


    Trap {Send-smtpmail -to user@domain.ru -server mailserver.domain.ru -from user@domain.ru -subject Error -body $Error ; Break } 
    Stop-Service -Name Spooler -force
    Remove-Item -Path "HKLM1:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers" -recurse -whatif
    Remove-Item -Path c:\WINDOWS\system32\spool\PRINTERS\*.*
    Start-Service -Name Spooler 
    Но в таком случае , сообщение то приходит , то нет. Закономерность не выявил.

    Буду благодарен за помощь.







    MCP, MCDST , MCTS
    10 апреля 2009 г. 9:08

Ответы

Все ответы