2015-04-08 2 views
1

Я написал сценарий командной оболочки, который используется для контроля состояния пулов приложений IIS. При текущем методе всякий раз, когда какой-либо пул идет вниз, он бросает мне предупреждение о том, что пул остановлен, и после этого он запускает пул, снова отправляя электронное сообщение о том, что этот пул. Поскольку у меня около 50 серверов, количество писем поступает навалом, что иногда вызывает спам. Может ли кто-нибудь помочь мне здесь, чтобы скрипт сканировал каталог пула и поместил результат в текстовый/html-файл и отправил мне список, в котором эти пулы опущены по почте. Вы можете найти сценарий ниже: -App_Pool_Alert Powershell Script

###################################Declear Servers in text file############################################## 

$Servers = Get-Content C:\Users\Desktop\server.txt 

################ Scans each server and import IIS web-administration module################################## 

$Servers | ForEach-Object { 
      Invoke-Command -ComputerName $_ -ScriptBlock { 
      Import-Module WebAdministration 
      cd IIS:/AppPools 
      $CompName = (Get-WmiObject -Class Win32_ComputerSystem).Name 
      $ApplicationPools = dir 
foreach ($item in $ApplicationPools) 
{ 
    $ApplicationPoolName = $item.Name 
    $ApplicationPoolStatus = Get-WebAppPoolState $ApplicationPoolName 
    If($ApplicationPoolStatus.value -eq "Stopped") 

     { 
      send-mailmessage -to "[email protected]" -from "[email protected]" -subject "Application Pool:- $ApplicationPoolName is Down on $CompName " -Body "$ApplicationPoolName is down. Please check IIS/Event logs for RCA." -SmtpServer ###########   

      Start-WebAppPool -Name $ApplicationPoolName 

      send-mailmessage -to "[email protected]" -from "[email protected]" -subject "Application Pool:- $ApplicationPoolName is Up on $CompName " -Body "$ApplicationPoolName is Up and running fine." -SmtpServer #############   

      } 

} 

}} 

##################################### End of Script ########################################################## 
+0

Почему бы просто не написать строковый массив в вашем операторе IF, а затем в конце, если он не пуст, напишите, что в теле письма? –

ответ

1

Это, как я хотел бы переписать сценарий:

###################################Declear Servers in text file############################################## 

$Servers = Get-Content C:\server.txt 

################ Scans each server and import IIS web-administration module################################## 

$SMPTServer = "mail.server.com" 
$result = "The following application pools were restarted:`n`n" # default output 

$Servers | ForEach-Object { 
    $result += Invoke-Command -ComputerName $_ -ScriptBlock { # add output of scriptblock to $result 
     Import-Module WebAdministration 
     cd IIS:/AppPools 
     $CompName = (Get-WmiObject -Class Win32_ComputerSystem).Name 
     $ApplicationPools = dir 
     foreach ($item in $ApplicationPools) 
     { 
      $ApplicationPoolName = $item.Name 
      $ApplicationPoolStatus = Get-WebAppPoolState $ApplicationPoolName 
      If($ApplicationPoolStatus.value -eq "Stopped") 
       {  
        Write-Output "Server $CompName - Application pool $ApplicationPoolName is Down - Restarting`n" # any action is added to otput 
        Start-WebAppPool -Name $ApplicationPoolName 
       } 
     } 

    } 
} 
if ($result -ne "The following application pools were restarted:`n`n") { # If any action was taken send mail with $result 
    send-mailmessage -to "[email protected]" -from "[email protected]" -subject "Application Pool Maitenance" -Body $result -SmtpServer $SMPTServer 
} 
##################################### End of Script ########################################################## 

Сначала определите переменную $ результата, в этом случае просто строки.

С помощью вашего скриптового блока вы можете написать что угодно, чтобы передать поток через Write-Output. Этот вывод возвращается из Ivoke-Command и добавляется к переменной $ result.

В конце вашего скрипта проверьте, изменилась ли переменная $ result и отправила ее как тело письма, если требуется.

+0

Спасибо за сообщение ответа. Я протестировал вышеприведенную логику и ее работу, но проблема заключается в том, что результат приходит по почте, т. Е. Если 100 веб-сайтов идут вниз, это отправляет один список сообщений со всеми 100. Когда я попытался написать вывод в текстовом файле, скрипт не пишет результаты удаленных компьютеров. Любая идея, связанная с этим, как я могу написать вывод в текстовом файле, чтобы с помощью команды вложения я отправил это письмо. – Abhishek

+0

Я использую команду Out-File -FilePath «C: \ server \» для записи вывода после выполнения функции foreach ($ item in $ ApplicationPools). – Abhishek