Лучший отвечающий
Write-Host вывести в лог.

Вопрос
-
Добрый день Уважамые господа!
Есть вот скрипт один, который я немного тут подправил.
Хотелось бы сделать следующее:
Вся так информация, которая выводится при помощи 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Отвечающий