none
Write-Host вывести в лог. RRS feed

  • Вопрос

  •  Добрый день Уважамые господа!

    Есть вот скрипт один, который я немного тут подправил. 

    Хотелось бы сделать следующее:
    Вся так информация, которая выводится при помощи Write-host, хотелось бы что бы она так же в цвете записывалось бы в лог и отправлялась бы по почте. А то получается, что только сбойный хост мониторится и оповещается, а мне необходимо в почту получать весь процесс проверки доступности серверов и в цветовой схеме.

    Что-то не пойму куда поставить команду Out-File для вывода в лог.

    Буду благодарен за помощь! Оригинал скрипта тут http://gallery.technet.microsoft.com/scriptcenter/2d537e5c-b5d4-42ca-a23e-2cbce636f58d/

    $ComputerName = Get-Content e:\servers.txt
    function Global:Convert-HString { 
    #Requires -Version 2.0  
                
    [CmdletBinding()]             
     Param   
               
       ( 
        [Parameter(Mandatory=$false, 
                   ValueFromPipeline=$true, 
                   ValueFromPipelineByPropertyName=$true)] 
        [String]$HString 
        
       )#End Param 
       
      
    Begin  
    { 
        Write-Verbose "Converting Here-String to Array" 
    }#Begin 
    Process  
    { 
        $HString -split "`n" | ForEach-Object { 
         
            $ComputerName = $_.trim() 
            if ($ComputerName -notmatch "#") 
                { 
                    $ComputerName 
                }     
             
             
            } 
    }#Process 
    End  
    { 
        # Nothing to do here. 
    }#End 
     
    }#Convert-HString 
    
    function Start-Monitor {
    
    #Requires -Version 2.0            
    [CmdletBinding()]            
     Param             
       (                       
        [Parameter(Mandatory=$false,
                   Position=0,                         
                   ValueFromPipeline=$true,            
                   ValueFromPipelineByPropertyName=$true)]
        [String[]]$ComputerName = $env:COMPUTERNAME,        
        # reset the lists of hosts prior to looping
        $OutageHosts = @(),
        # specify the time you want email notifications resent for hosts that are down
        $EmailTimeOut = 30,
        # specify the time you want to cycle through your host lists.
        $SleepTimeOut = 5,
        # specify the maximum hosts that can be down before the script is aborted
        $MaxOutageCount = 100,
        # specify who gets notified 
        $notificationto = "sukhikh@prlib.ru", 
        # specify where the notifications come from 
        $notificationfrom = "netwrixadmin@prlib.ru", 
        # specify the SMTP server 
        $smtpserver = "simsg01.main.prlib.ru" 
       )#End Param
    
    # start looping here
    Do{
    $available = @()
    $notavailable = @()
    Write-Host (Get-Date)
    
    # Read the File with the Hosts every cycle, this way to can add/remove hosts
    # from the list without touching the script/scheduled task, 
    # also hash/comment (#) out any hosts that are going for maintenance or are down.
    $ComputerName | Where-Object {!($_ -match "#")} | 
    #"test1","test2" | Where-Object {!($_ -match "#")} |
    ForEach-Object {
    if(Test-Connection -ComputerName $_ -Count 1 -ea silentlycontinue)
        {
         # if the Host is available then write it to the screen
         write-host "Available host ---> "$_ -BackgroundColor Green -ForegroundColor White
         [Array]$available += $_ 
         
         
         # if the Host was out and is now backonline, remove it from the OutageHosts list
         if ($OutageHosts -ne $Null)
            {
             if ($OutageHosts.ContainsKey($_))
              {
                 $OutageHosts.Remove($_)         
              }
            }  
        }
    else
        {
         # If the host is unavailable, give a warning to screen
         
           write-host "Unavailable host ------------> "$_ -BackgroundColor Magenta -ForegroundColor White 
              if(!(Test-Connection -ComputerName $_ -Count 2 -ea silentlycontinue))
              
           {
            # If the host is still unavailable for 4 full pings, write error and send email
           write-host "Unavailable host ------------> "$_ -BackgroundColor Magenta -ForegroundColor White
            [Array]$notavailable += $_ 
            
    
            if ($OutageHosts -ne $Null)
                {
                    if (!$OutageHosts.ContainsKey($_))
                    {
                     # First time down add to the list and send email
                     Write-Host "$_ Is not in the OutageHosts list, first time down"
                     $OutageHosts.Add($_,(get-date))
                     $Now = Get-date
                     # $Body = "$_ has not responded for 5 pings at $Now"
                     Send-MailMessage -BackgroundColor Magenta -ForegroundColor White -Body "$body" -to $notificationto -from $notificationfrom `
                      -Subject "Host $_ is down" -SmtpServer $smtpserver
                    }
                    else
                    {
                        # If the host is in the list do nothing for 1 hour and then remove from the list.
                        Write-Host "$_ Is in the OutageHosts list"
                        if (((Get-Date) - $OutageHosts.Item($_)).TotalMinutes -gt $EmailTimeOut)
                        {$OutageHosts.Remove($_)}
                    }
                }
            else
                {
                    # First time down create the list and send email
                    Write-Host "Adding $_ to OutageHosts."
                    $OutageHosts = @{$_=(get-date)}
                    $Body = "$_ has not responded for 5 pings at $Now" 
                    Send-MailMessage -Body "$body" -to $notificationto  -from $notificationfrom `
                     -Subject "Host $_ is down" -SmtpServer $smtpserver
                } 
           }
        }
    }
    # Report to screen the details
    Write-Host "Available count:"$available.count 
    Write-Host "Not available count:"$notavailable.count
    Write-Host "Not available hosts:"
    $OutageHosts
    Write-Host ""
    Write-Host "Sleeping $SleepTimeOut seconds" 
    
    sleep $SleepTimeOut
    if ($OutageHosts.Count -gt $MaxOutageCount) 
    {
        # If there are more than a certain number of host down in an hour abort the script.
        $Exit = $True
        $body = $OutageHosts | Out-String
        Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
         -Subject "More than $MaxOutageCount Hosts down, monitoring aborted" -BackgroundColor Magenta -ForegroundColor White -SmtpServer $smtpServer
    }
    }
    while ($Exit -ne $True) 
     
    }
    
    Start-Monitor $ComputerName


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    14 февраля 2013 г. 5:33

Ответы

  • 2) Заменить $body на,тогда будет проство вывод имен хостов в тексте письма: 

    $body = "NotAvailable:`r`n$($notavailable | Out-String)Available:`r`n$($available | Out-String)"

    • Помечено в качестве ответа rеstless 14 февраля 2013 г. 9:30
    14 февраля 2013 г. 8:23
    Отвечающий

Все ответы

  • 1) Write-Host пишет напрямую в консоль,поэтому вывести в файл не получиться.

    2) Соотвественно с цветом тоже не получится

    3) Зачем в скрипт,вставлять бездумно  BackgroundColor Magenta -ForegroundColor White  для командлета Send-MailMessage?

    4) Для получения вывода Write-Host использовать Start-Transcript & Stop-Transcript

    Так что переделать скрипт,который выводил в цвете используя html и писал в отдельную переменную.

    14 февраля 2013 г. 5:42
    Отвечающий
  • Что бы это значило ?:

    Start-Transcript : This host does not support transcription.
    At E:\Скрипты\тестовые\Start-Monitor.ps1:145 char:17
    + Start-Transcript <<<<  -Path e:\export.txt
        + CategoryInfo          : NotImplemented: (:) [Start-Transcript], PSNotSup 
       portedException
        + FullyQualifiedErrorId : NotSupported,Microsoft.PowerShell.Commands.Start 
       TranscriptCommand


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    14 февраля 2013 г. 5:57
  • Что бы это значило ?:

    Start-Transcript : This host does not support transcription.
    At E:\Скрипты\тестовые\Start-Monitor.ps1:145 char:17
    + Start-Transcript <<<<  -Path e:\export.txt
        + CategoryInfo          : NotImplemented: (:) [Start-Transcript], PSNotSup 
       portedException
        + FullyQualifiedErrorId : NotSupported,Microsoft.PowerShell.Commands.Start 
       TranscriptCommand


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    Это значит,что надо запускать только в консоле PowerShell,а не в других хостах типа PowerShell ISE.
    14 февраля 2013 г. 5:59
    Отвечающий
  •  в общем пока что не получается однозначно, ставлю Start-Transcript а в итоге все подряд в файл пишется, не говоря уже о цвете


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 14 февраля 2013 г. 6:31
    14 февраля 2013 г. 6:28
  •  в общем пока что не получается однозначно, ставлю Start-Transcript а в итоге все подряд в файл пишется, не говоря уже о цвете


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!



    Так и должно быть.Еще раз не будет цвета,пока явно не обернуть в Html.Научитесь читать,что пишут.
    14 февраля 2013 г. 6:33
    Отвечающий
  • А не подскажите как сделать так, что при записи в текстовый файл коммандой:

      Start-Transcript e:\test.txt

           write-host "Unavailable host ------------>" $_ -BackgroundColor Magenta -ForegroundColor White 
                  if(!(Test-Connection -ComputerName $_ -Count 2 -ea silentlycontinue))

    Был бы перевод строки в текстовом файле, а то все подряд пишет слитно:

    Transcript started, output file is e:\test.txt
    Unavailable host ------------> compUnavailable host ------------>  comp
    **********************
    Windows PowerShell Transcript End
    End time: 20130214111632
    **********************

      Спасибо!     

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!



    • Изменено rеstless 14 февраля 2013 г. 7:21
    14 февраля 2013 г. 7:20
  • Используйте нормальный текстовый редактор,типа Notepad++,который понимает разные переводы строки или смотрите в PowerShell(Get-Content),с этим тоже проблем нет. Или привести к формату notepad:

    [IO.File]::ReadAllText("D:\result.txt") -replace "`n","`r`n" | out-file D:\result.txt

    14 февраля 2013 г. 7:36
    Отвечающий
  •  Ну в принципе я уже и в CSV сохранил, в этом формате все как надо в столбец!

    Осталось только применить стиль для конвертирования в HTML, то есть надо теперь вывод сделать не в CSV а в HTML со стилем, либо со стандартными тэгами цвета ?

     Тогда еще вопросик, а как мне по почте отправить не только то что "not has respond", но и все что "available host" ? В смысле без файла логов , а просто тупо почтовое сообщение о том что все хосты доступны и не доступны ?

    Cпасибо!


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 14 февраля 2013 г. 7:51
    14 февраля 2013 г. 7:49
  • 2) Заменить $body на,тогда будет проство вывод имен хостов в тексте письма: 

    $body = "NotAvailable:`r`n$($notavailable | Out-String)Available:`r`n$($available | Out-String)"

    • Помечено в качестве ответа rеstless 14 февраля 2013 г. 9:30
    14 февраля 2013 г. 8:23
    Отвечающий
  •  СпасибО!

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    14 февраля 2013 г. 9:29
  •  Да последняя проблема осталась, на несколько адресов отправить, либо в группу рассылки-не получается. нужно до указать некий параметр ?

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    14 февраля 2013 г. 10:19
  • Укажите параметр -notificationto "my@mail.com",mt2@ccc.com . Если правка идет в скрипте,то изменить параметр:

    $notificationto = @("my@mail.com","mt2@ccc.com")

    Или можно задать параметр CC у командлета Send-MailMessage.

    14 февраля 2013 г. 10:46
    Отвечающий
  •  Да все работает, замечательно! Спасибо! Я так понимаю программа циклом выполняет одно и то же действие с тайм аутом, который я выставляю, а можно вообще только один проход делать и программа заканчивает действие ? Я пробую закомментировать коммандлеты, но прога все равно делает цикл. Можно конечно SLEEPENTIMEOUT поставить по больше, но а если его совсме отключить. так можно ?

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    14 февраля 2013 г. 11:23
  • Она останавливает только в том случае,когда не отвечает количество хостов в $MaxOutageCount = 100,если не отвечает 101 хост,то получаем письмо.

    Для одного прохода,указать -MaxOutageCount -1:

    Start-Monitor test1,test -MaxOutageCount -1 -SleepTimeOut 0

    14 февраля 2013 г. 11:31
    Отвечающий