磁盘空间报告创建HTML并将服务器列表添加到电子邮件

时间:2016-12-14 19:57:23

标签: html powershell foreach diskspace

我正在使用一个非常长的脚本,而且那个不起作用的部分让我感到有些困惑。

简而言之,脚本会查找所有服务器操作系统,检查所有磁盘空间,如果符合条件,则将某些磁盘空间的颜色编码,输出到HTML(我无法通过电子邮件发送HTML文件,因为它们已被阻止,所以以这种方式)然后它添加符合电子邮件正文标准的服务器列表并发送电子邮件。

除了&#34之外,一切正常;然后它会添加符合条件的服务器列表到电子邮件正文并发送电子邮件"它只会将列表中的最后一台服务器添加到电子邮件中。

以下是我遇到问题的脚本片段。

第一部分是数学和数字百分比是什么,并且工作正常,并添加到HTML报告就好了。

第二部分是没有正确添加到电子邮件的部分。我只从列表中获得满足可用空间小于5%标准的最后一台服务器。我相信我只是在寻找一些东西。有任何想法吗?

Get-ADComputer -Filter 'OperatingSystem -Like "*Server*"' | Sort DNSHostName | ForEach-Object { 
    ### Get the hostname of the machine
    #$hostname = Get-WmiObject -Impersonation Impersonate -ComputerName $_ -Query "SELECT Name From Win32_ComputerSystem"
    #$name = $hostname.Name.ToUpper()
    $name = $_.DNSHostName.ToUpper()
    Add-Content $html_file ('<Table id="dataTable"><tr><td colspan="3" class="serverName">' + $name + '</td></tr>
    <tr><td class="headings">Drive Letter</td><td class="headings">Total Size</td><td class="headings">Free Space</td><td class="headings">Percent Free</td></tr>')

    ### Get the drives of the machine
    $drives = Get-WmiObject Win32_LogicalDisk -Filter "drivetype=3" -ComputerName $name -Impersonation Impersonate

    ####loop through and add to html report
#####Edited portion of script below#########
 ForEach ($drive in $drives) {
        $space_color = ""
        $free_space = $drive.FreeSpace
        $percent = ($drive.FreeSpace/$drive.size*100)
        $percent = [Math]::Round($percent, 2)
        If ($percent -le 1) {
            $space_color = $Critical_space
            }
            elseif ($percent -le 5) {
            $space_color = $very_low_space
            }
            elseif ($percent -le 10) {
            $space_color = $low_space
                            }
            elseif ($percent -le 15) {
            $space_color = $medium_space
            }

        If ($percent -lt 5) {$addtobody += $name,$drive.deviceid,$Percent,"%"}

2 个答案:

答案 0 :(得分:1)

我在最初的帖子中失败了,指出$ addtobody应该在你的外循环之上定义:

$addtobody = @()

在最后一行,尝试将$ addtobody更改为 + =

if ($percent -le 5) {
       $addtobody += $name,$drive.deviceid,$Percent,"%"
}

这会将值添加到存在的值,而不是设置值。循环的每次迭代(如当前所写),您将重新分配给$ addtobody。

在考虑了您的HTML电子邮件限制后,您还可以尝试尝试发送基于文本的表格。下面的代码片段会出现在你的循环之外。

$emailBody = $addtobody | Format-Table -AutoSize | Out-String

答案 1 :(得分:1)

我认为$addtobody会在代码中的某个位置添加到电子邮件中吗?如果是这样,那么你只需要将其转换为数组并向其添加元素,而不是将其设置为等于元素。 (还假设两个丢失的}只是被删除了你复制的东西,我已经添加了它们但是一定不要在你的脚本中加倍它们)

$addtobody = @()
ForEach ($drive in $drives) {
    $space_color = ""
    $free_space = $drive.FreeSpace
    $percent = ($drive.FreeSpace/$drive.size*100)
    $percent = [Math]::Round($percent, 2)
    If ($percent -le 1) {
        $space_color = $Critical_space
        }
        elseif ($percent -le 5) {
        $space_color = $very_low_space
        }
        elseif ($percent -le 10) {
        $space_color = $low_space
                        }
        elseif ($percent -le 15) {
        $space_color = $medium_space
        }


   ForEach ($drive in $drives) {
    $free_space = $drive.FreeSpace
    $percent = ($drive.FreeSpace/$drive.size*100)
    $percent = [Math]::Round($percent, 2)
    If ($percent -le 5) {$addtobody += $name,$drive.deviceid,$Percent,"%"}
   }
}