Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于条件的HTML邮件中的颜色代码单元格_Html_Email_Powershell - Fatal编程技术网

基于条件的HTML邮件中的颜色代码单元格

基于条件的HTML邮件中的颜色代码单元格,html,email,powershell,Html,Email,Powershell,我有一个检查远程服务器磁盘空间的简单脚本,它有一个简单的输出格式,如下所示 我想做的是,根据单个单元格的值对其进行颜色编码。具体地说,如果任意驱动器上的可用空间小于300,我希望单元格以红色阴影显示。根据PowerShell以HTML格式发送的结果,最简单的方法是什么 下面是我从远程服务器收集数据的代码: function Set-AlternatingRows { [CmdletBinding()] Param( [Parameter(Mandatory,Va

我有一个检查远程服务器磁盘空间的简单脚本,它有一个简单的输出格式,如下所示

我想做的是,根据单个单元格的值对其进行颜色编码。具体地说,如果任意驱动器上的可用空间小于300,我希望单元格以红色阴影显示。根据PowerShell以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
函数集交替行{
[CmdletBinding()]
Param(
[参数(必需,ValueFromPipeline)]
[字符串]$Line,
[参数(强制性)]
[string]$CSSEvenClass,
[参数(强制性)]
[字符串]$CSSOddClass
)
开始{
$ClassName=$CSSEvenClass
}
过程{
如果($Line.Contains(“”)){
$Line=$Line.Replace(“,”)
if($ClassName-eq$CSSEvenClass){
$ClassName=$CSSOddClass
}否则{
$ClassName=$CSSEvenClass
}
}
返回$行
}
}
foreach($InputCSV中的项目){
写入主机“立即检查$($Item.Server)”
$ShortDate=(获取日期).ToString('MM/dd/yyyyy'))
$Ping=PingEM$Item.Server
###继续之前,请检查服务器是否联机
如果($Ping-eq“在线”){
写入主机“$($Item.Server)处于联机状态”-ForegroundColor绿色
$FreeSpaceAll=获取WmiObject Win32_LogicalDisk-筛选器“DriveType=3”-计算机$($Item.Server)|
选择SystemName、DeviceID、VolumeName、,
@{Name=“总大小(GB)”;E={{0:N1}”-f($\大小/1gb)},
@{Name=“空闲空间(GB)”;E={{0:N1}“-f($\ Freespace/1gb)}
$FreeSpaceC=$FreeSpaceAll |其中{$\设备ID-eq“C:”}|选择-扩展“可用空间(GB)”
$FreeSpaceD=$FreeSpaceAll |其中{$\设备ID-eq“D:”}|选择-扩展“可用空间(GB)”
$FreeSpaceE=$FreeSpaceAll |其中{$\设备ID-eq“E:”}|选择-扩展“可用空间(GB)”
}#平
$outarray+=新对象PsObject-属性@{
服务器=$Item.Server
FreeSpaceAll=$FreeSpaceAll
FreeSpaceC=$FreeSpaceC
FreeSpaceD=$FreeSpaceD
freespace=$freespace
PingResults=$Ping
}#超出阵列新对象
}#为了
$Head=获取内容“$Dir\CSS.txt”
$Pre=“此电子邮件包含有关远程服务器上C/D/E可用空间的信息

” $Pre+=“以下报告数据以Excel.CSV格式$Link1提供。7天后,报告将移动到$Link2

” $Output=$OutArray| 选择服务器,PingResults,@{E={$\.FreeSpaceC};Label=“空闲空间C:(GB)”, @{E={$\ FreeSpaceD};Label=“空闲空间D:(GB)”}, @{E={$\ freespace};Label=“自由空间E:(GB)”}| 转换为Html-Head$Head-PreContent$Pre-As表|设置交替行-CSSOddClass奇数-CSSEvenClass偶数| 外线 $Subject=“($ScriptVer)-文件服务器C/D/E可用空间报告” $TSBody=“” $TSBody+=“$Output

” 发送邮件$To-Subject$Subject-Body$TSbody-BodyAsHtml-From$From-SmtpServer$Mailer
我写这篇文章的目的是让它通常能满足您的需求。它已经设置为与HTML表和免费中继服务器电子邮件提供商一起使用。此脚本接受一个文本输入文件,您可以在顶部指定该文件。此文本文件将包含您要检查的所有服务器名称,位于它们自己的行中。下面的例子。如果您想使用自己的电子邮件提供商,只需替换所有smtp信息即可。否则,它确实需要管理员权限才能成功运行。可以在脚本顶部输入这些凭据,其中指定了
$cred
。您还需要更改
$servers
变量,以指向要检查的服务器名称列表。它目前只选择C驱动器,但您可以轻松编辑该驱动器,并为ping结果添加一列

C:\temp\servers.txt的示例

hqdc01
hqdc02
hqdc03
hqfile01
hqfile02
hqmail01
hqservices01
hqsql01
hqsql02
.ps1脚本:

    $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 = "from@from.com"
    $smtpTo = "myself@myself.com"
    $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
$cred=获取凭据-凭据“域\域管理员用户”
$ServerName=获取内容“C:\temp\servers.txt”
$CONVERTOGB=(1024*1024*1024)
$enter1=“`r”
$enter2=“`r`n”
#Smtp deets
$smtpServer=“relay.appriver.com”
$smtpPort=“2525”
$smtpFrom=”from@from.com"
$smtpTo=”myself@myself.com"
$messageSubject=“每日服务器报告”
#设置SmtpClient
$smtpClient=新对象Net.Mail.smtpClient
$smtpClient.Host=$smtpServer
$smtpClient.Port=$smtpPort
#创建邮件消息
$mailMessage=新对象Net.Mail.mailMessage
$mailMessage.From=$smtpFrom
$mailMessage.To.Add($smtpTo)
$mailMessage.Subject=$messageSubject
$mailMessage.IsBodyHtml=$true
#风格
$htmlReport+=“”
$htmlReport+=“正文{背景色:白色;}”
$htmlReport+=“表{边框宽度:1px;边框样式:实心;边框颜色:黑色;边框折叠:折叠;}”
$htmlReport+=“TH{边框宽度:1px;填充:0px;边框样式:纯色;边框颜色:黑色;}”
$htmlReport+=“TD{边框宽度:1px;填充:0px;边框样式:纯色;边框颜色:黑色;}”
$htmlReport+=“”
#桌子
$htmlReport+=“”
$htmlReport+=“`n”
$htmlReport+=“”
$htmlReport+=“服务器名”
$htmlReport+=“总计C:”
$htmlReport+=“免费C:”
$htmlReport+=%C免费:
$htmlReport+=“总计D:”
$htmlReport+=“免费D:”
$htmlReport+=%D免费:
$htmlReport+=“总计E:”
$htmlReport+=“免费电子邮件:”
$htmlReport+=%E免费:
$htmlReport+=“”
foreach($ServerName中的服务器)
{
#获取所有C:驱动器的信息
$diskC=Get WmiObject-Credential$cred Win32_LogicalDisk-ComputerName$Server-Filter“DeviceID='C:'”|选择对象大小,释放空间
$htmlReport+=“”
$htmlReport+=“$($Server)”
尝试
{
$htmlReport