2017-01-05 135 views
0

我有一个简单的脚本,在远程服务器上检查磁盘空间,它有一个简单的输出格式是如下颜色编码细胞基于标准

enter image description here

我想什么要做的是根据各自的价值对单个单元格进行颜色编码。具体来说,如果任何驱动器上的可用空间小于300,我希望单元格的阴影为RED。根据PowerShell Send-MailMessage以HTML格式发送的结果,执行此操作的最简单方法是什么?

下面的代码我已经得到了从远程服务器收集数据:

function Set-AlternatingRows { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory,ValueFromPipeline)] 
     [string]$Line, 

     [Parameter(Mandatory)] 
     [string]$CSSEvenClass, 

     [Parameter(Mandatory)] 
     [string]$CSSOddClass 
    ) 
    Begin { 
     $ClassName = $CSSEvenClass 
    } 
    Process { 
     if ($Line.Contains("<tr><td>")) { 
      $Line = $Line.Replace("<tr>","<tr class=""$ClassName"">") 
      if ($ClassName -eq $CSSEvenClass) { 
       $ClassName = $CSSOddClass 
      } else { 
       $ClassName = $CSSEvenClass 
      } 
     } 
     return $Line 
    } 
} 

foreach ($Item in $InputCSV) { 
    Write-Host "Checking $($Item.Server) now" 
    $ShortDate = (Get-Date).ToString('MM/dd/yyyy') 

    $Ping = PingEM $Item.Server 

    ### Check if server is online before proceeding 
    if ($Ping -eq "Online") { 
     Write-Host "$($Item.Server) is Online" -ForegroundColor Green 

     $FreeSpaceAll = Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -Computer $($Item.Server) | 
         Select SystemName, DeviceID, VolumeName, 
          @{Name="Total Size (GB)";E={"{0:N1}" -f($_.Size/1gb)}}, 
          @{Name="Free Space (GB)";E={"{0:N1}" -f($_.Freespace/1gb)}} 
     $FreeSpaceC = $FreeSpaceAll | Where {$_.DeviceID -eq "C:"} | Select -expand "Free Space (GB)" 
     $FreeSpaceD = $FreeSpaceAll | Where {$_.DeviceID -eq "D:"} | Select -expand "Free Space (GB)" 
     $FreeSpaceE = $FreeSpaceAll | Where {$_.DeviceID -eq "E:"} | Select -expand "Free Space (GB)" 
    } # Ping 

    $outarray += New-Object PsObject -Property @{ 
     Server = $Item.Server 
     FreeSpaceAll = $FreeSpaceAll 
     FreeSpaceC = $FreeSpaceC 
     FreeSpaceD = $FreeSpaceD 
     FreeSpaceE = $FreeSpaceE 
     PingResults = $Ping 
    } # OutArray New-Object 
} # For 

$Head = Get-Content "$Dir\CSS.txt" 
$Pre = "This email contains info on C/D/E free space on remote servers<br> <br>" 
$Pre += "The below report data is available in Excel .CSV format $Link1.  After 7 days, the reports will be moved $Link2 <br><br>" 

$Output = $OutArray | 
      Select Server, PingResults, @{E={$_.FreeSpaceC};Label="Free Space C: (GB)"}, 
       @{E={$_.FreeSpaceD};Label="Free Space D: (GB)"}, 
       @{E={$_.FreeSpaceE};Label="Free Space E: (GB)"} | 
    ConvertTo-Html -Head $Head -PreContent $Pre -As Table | Set-AlternatingRows -CSSOddClass odd -CSSEvenClass even | 
    Out-String 

$Subject = "($ScriptVer) - file server C/D/E free space report" 
$TSBody = "" 
$TSBody += "<font face ='arial' color='black'>$Output </font><br><br>" 

Send-NailMessage $To -Subject $Subject -Body $TSbody -BodyAsHtml -From $From -SmtpServer $Mailer 
+0

你将不得不自己创建HTML表,因为内建不要小号像你所要求的那样支持条件格式。你有没有尝试过?我甚至没有试图在这里制作任何HTML输出。 – Matt

+2

http://stackoverflow.com/questions/37662940/convertto-html-highlight-the-cells-with-special-values? – Matt

+0

发布更新失踪代码。我看着下面的StackOverflow [链接](http://stackoverflow.com/questions/4559233/technique-for-selectively-formatting-data-in-a-powershell-pipeline-and-output-as)职位,但无法使用它处理我的代码,例如使用.XML,而不是HTML,而且我不熟悉如何将XML转换为HTML以便与Powershell发送消息功能一起使用。 – Kenny

回答

2

我写了这个,以便它通常你想要做什么。它已经被设置为使用HTML表格和免费的中继服务器电子邮件提供商。该脚本接受一个您可以在顶部指定的文本输入文件。这个文本文件将包含您想要检查的所有服务器名称。下面的例子。如果你想使用自己的电子邮件提供商,你可以取代所有的smtp信息。否则,它会要求管理员权限才能成功运行。这些凭据可以在指定$cred的脚本顶部输入。您还需要更改$servers变量以指向要检查的服务器名称列表。它目前只选择C盘,但您可以轻松编辑并添加一列用于ping结果。实例的C

:\ TEMP \ servers.txt

hqdc01 
hqdc02 
hqdc03 
hqfile01 
hqfile02 
hqmail01 
hqservices01 
hqsql01 
hqsql02 

的脚本名为.psl:

$cred = Get-Credential -Credential 'domain\domainadminuser' 
    $ServerName = Get-Content "C:\temp\servers.txt" 
    $ConvertToGB = (1024 * 1024 * 1024) 
    $enter1 = "`r" 
    $enter2 = "`r`n" 

    # Smtp deets 
    $smtpServer = "relay.appriver.com" 
    $smtpPort = "2525" 
    $smtpFrom = "[email protected]" 
    $smtpTo = "[email protected]" 
    $messageSubject = "Daily Server Report" 

    # Set up an SmtpClient 
    $smtpClient = New-Object Net.Mail.SmtpClient 
    $smtpClient.Host = $smtpServer 
    $smtpClient.Port = $smtpPort 

    # Create the MailMessage 
    $mailMessage = New-Object Net.Mail.MailMessage 
    $mailMessage.From = $smtpFrom 
    $mailMessage.To.Add($smtpTo) 
    $mailMessage.Subject = $messageSubject 
    $mailMessage.IsBodyHtml = $true 

    # style 
    $htmlReport += "<style>" 
    $htmlReport += "BODY{background-color:white;}" 
    $htmlReport += "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}" 
    $htmlReport += "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;}" 
    $htmlReport += "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;}" 
    $htmlReport += "</style>" 


    # table 
$htmlReport += "<table>" 
$htmlReport += "`n" 
$htmlReport += "<tr>" 
$htmlReport += "<th>ServerName</th>" 
$htmlReport += "<th>Total C:</th>" 
$htmlReport += "<th>Free C:</th>" 
$htmlReport += "<th>% Free C:</th>" 
$htmlReport += "<th>Total D:</th>" 
$htmlReport += "<th>Free D:</th>" 
$htmlReport += "<th>% Free D:</th>" 
$htmlReport += "<th>Total E:</th>" 
$htmlReport += "<th>Free E:</th>" 
$htmlReport += "<th>% Free E:</th>" 
$htmlReport += "</tr>" 
foreach($Server in $ServerName) 
{ 
    #Get info on all C: drives 
    $diskC = Get-WmiObject -Credential $cred Win32_LogicalDisk -ComputerName $Server -Filter "DeviceID='C:'" | Select-Object Size,FreeSpace 
    $htmlReport += "<tr>" 
    $htmlReport += "<td>$($Server)</td>" 
    try 
    { 
     $htmlReport += "<td>$([Math]::Truncate($diskC.Size/$ConvertToGB)) GB </td>" 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    try 
    { 
     $htmlReport += "<td>$([Math]::Truncate($diskC.FreeSpace/$ConvertToGB)) GB </td>" 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    try 
    { 
     if([Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100) -le 10) 
     { 
      $htmlReport += "<td><font color=red> $([Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100)) % </font></td>" 
     } 
     if([Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100) -gt 10 -and [Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100) -le 20) 
     { 
      $htmlReport += "<td><font color=orange> $([Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100)) % </font></td>" 
     } 
     if([Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100) -gt 20) 
     { 
      $htmlReport += "<td><font color=green> $([Math]::Truncate(($diskC.FreeSpace/$diskC.size) * 100)) % </font></td>" 
     } 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 

    #Get info on all D: drives 
    $diskD = Get-WmiObject -Credential $cred Win32_LogicalDisk -ComputerName $Server -Filter "DeviceID='D:'" | Select-Object Size,FreeSpace 
    try 
    { 
     $htmlReport += "<td>$([Math]::Truncate($diskD.Size/$ConvertToGB)) GB </td>" 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    try 
    { 
     $htmlReport += "<td>$([Math]::Truncate($diskD.FreeSpace/$ConvertToGB)) GB </td>" 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    try 
    { 
     if([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -le 10) 
     { 
      $htmlReport += "<td><font color=red> $([Math]::Truncate(($diskD.FreeSpace/$diskD.size) * 100)) % </font></td>" 
     } 
     if([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -gt 10 -and [Math]::Truncate(($diskD.FreeSpace/$diskD.size) * 100) -le 20) 
     { 
      $htmlReport += "<td><font color=orange> $([Math]::Truncate(($diskD.FreeSpace/$diskD.size) * 100)) % </font></td>" 
     } 
     if([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -gt 20) 
     { 
      $htmlReport += "<td><font color=green> $([Math]::Truncate(($diskD.FreeSpace/$diskD.size) * 100)) % </font></td>" 
     } 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 

    #Get info on all E: drives 
    $diskE = Get-WmiObject -Credential $cred Win32_LogicalDisk -ComputerName $Server -Filter "DeviceID='E:'" | Select-Object Size,FreeSpace 
    try 
    { 
     $htmlReport += "<td>$([Math]::Truncate($diskE.Size/$ConvertToGB)) GB </td>" 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    try 
    { 
     $htmlReport += "<td>$([Math]::Truncate($diskE.FreeSpace/$ConvertToGB)) GB </td>" 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    try 
    { 
     if([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -le 10) 
     { 
      $htmlReport += "<td><font color=red> $([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100)) % </font></td>" 
     } 
     if([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -gt 10 -and [Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -le 20) 
     { 
      $htmlReport += "<td><font color=orange> $([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100)) % </font></td>" 
     } 
     if([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100) -gt 20) 
     { 
      $htmlReport += "<td><font color=green> $([Math]::Truncate(($diskE.FreeSpace/$diskE.size) * 100)) % </font></td>" 
     } 
    } 
    catch 
    { 
     $htmlReport += "<td>NA</td>" 
    } 
    $htmlReport += "</tr>" 
} 

$htmlReport += "</table>" 



# Now create an AlternateView from the HTML contents 
$messageBody = [Net.Mail.AlternateView]::CreateAlternateViewFromString($htmlReport, 'text/html') 

# Add the HTML view to the MailMessage 
$mailMessage.AlternateViews.Add($messageBody) 

# And finally send the message 
$smtpClient.Send($mailMessage) 
pause 

最后但并非最不重要的,这里是样本的电子邮件的照片是你会得到这个嵌入表: htmltable

+0

感谢您对于这一点,但这似乎是少了很多的代码比我所目前得到的,但是,它不使用发送消息,因为我需要。我应该能够使用你的大部分内容,我会在今天/明天尝试,然后选择其中一个答案作为答案。 – Kenny

+0

啊,是的。将system.net.mail换成send-mailmessage应该非常简单。如果我解决它,我会编辑我的代码来支持这两个。 – Narzard

+0

@Kenny我添加了try/catch块,所以它不能失败,如果你的服务器没有特定的驱动器号以及添加D:和E:驱动器。 – Narzard