【问题标题】:Disk space report create HTML and add server list to email磁盘空间报告创建 HTML 并将服务器列表添加到电子邮件
【发布时间】:2016-12-14 19:57:22
【问题描述】:

我正在处理一个很长的脚本,其中不工作的部分让我有点困惑。

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

一切正常,除了“然后它将满足标准的服务器列表添加到电子邮件正文并发送电子邮件”它只将列表中的最后一个服务器添加到电子邮件中。

这是我遇到问题的脚本的 sn-p。

第一部分是数学和数字百分比,它工作得很好,添加到 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,"%"}

【问题讨论】:

  • 不知道 Powershell 的语法,但我假设您的函数会在 foreach 的每次迭代中覆盖 $addtobody(保留最后一个),而不是通过 .= 或 + 添加到 $addtobody = 或类似的东西。

标签: html powershell foreach diskspace


【解决方案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,"%"}
   }
}

【讨论】:

  • 您在很大程度上是对的。 $addtobody = @() 脚本中较高的部分完成了该部分的技巧,但它开始复制 HTML 输出文件中的所有结果我在下面进行了编辑,现在它按照我想要的方式在电子邮件中列出它们 -我在上面的脚本中添加了新代码
【解决方案2】:

我在最初的帖子中未能指出 $addtobody 应该定义在你的外循环之上:

$addtobody = @()

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

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

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

在考虑您的 HTML 电子邮件限制后,您还可以尝试发送基于文本的表格。下面的 sn-p 将出现在您的循环之外。

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

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多