You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将Azure服务器磁盘空间PowerShell脚本输出转为HTML格式

问题需求

现有一段PowerShell脚本,可从Azure指定服务器列表中拉取磁盘空间数据并导出为CSV格式,但即使设置了逗号分隔符,CSV格式仍不够整洁。希望修改脚本将输出转为更清晰的HTML格式,原脚本及CSV显示效果如下:

原PowerShell脚本

Import-Module ActiveDirectory

# 删除60天前的旧报告
$OldReports = (Get-Date).AddDays(-60)

# 磁盘报告存储位置
Get-ChildItem "C:\Temp\DiskSpaceReport\*.*" |
Where-Object { $_.LastWriteTime -le $OldReports } |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# 生成日志日期变量
$LogDate = get-date -f yyyyMMdd

############
# 导入服务器列表CSV
$Servers = Import-Csv C:\Temp\ADComputers.csv

# 遍历每台服务器
$DiskReport = ForEach ($Server in $Servers) {

# 获取启用状态的AD计算机对象
$System = Get-ADComputer $Server.Hostname | Where-Object { $_.Enabled -eq $true } | 
Select-Object Name, DNSHostName | Sort-Object Name
Get-WmiObject win32_logicaldisk `
    -ComputerName $System.DNSHostName -Filter "Drivetype=3" `
    -ErrorAction SilentlyContinue
}

# 生成磁盘报告
$DiskReport | Select-Object `
@{Label = "主机名"; Expression = { $_.SystemName } },
@{Label = "盘符"; Expression = { $_.DeviceID } },
#@{Label = "卷名"; Expression = { $_.VolumeName } },
#@{Label = "总容量(GB)"; Expression = { "{0:N1}" -f ( $_.Size / 1gb) } },
#@{Label = "可用空间(GB)"; Expression = { "{0:N1}" -f ( $_.Freespace / 1gb ) } },
@{Label = '可用空间占比'; Expression = { "{0:P0}" -f ($_.Freespace /$_.Size) } } |

# 导出为CSV文件
Export-csv -Path "C:\Temp\DiskSpaceReport\DiskReport_$logDate.txt" -NoTypeInformation -Delimiter ","

##### 发送报告邮件  

# 定义变量#

$fromaddress = “Myemail@email.com”
$toaddress = “sendersemail@email.com”
#$ccaddress = "notneeded@mail.com"
$Subject = “英国服务器磁盘报告”
#$body = get-content “C:\users\desktop\content.html”
$attachment = “C:\temp\DiskSpaceReport\DiskReport_$logDate.txt"
$smtpserver = “relay.mail.com”

###

$message = new-object System.Net.Mail.MailMessage
$message.From = $fromaddress
$message.To.Add($toaddress)
#$message.CC.Add($ccaddress)
$message.IsBodyHtml = $True
$message.Subject = $Subject
#$attach = new-object Net.Mail.Attachment($attachment)
$message.Attachments.Add($file)
#$message.body = $body
$smtp = new-object Net.Mail.SmtpClient($smtpserver)
$smtp.Send($message)

###################################################

CSV显示效果

CSV格式显示效果

修改后的PowerShell脚本(生成HTML报告)
Import-Module ActiveDirectory

# 删除60天前的旧报告
$OldReports = (Get-Date).AddDays(-60)
Get-ChildItem "C:\Temp\DiskSpaceReport\*.*" |
Where-Object { $_.LastWriteTime -le $OldReports } |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# 生成日志日期变量
$LogDate = Get-Date -f yyyyMMdd

# 导入服务器列表CSV
$Servers = Import-Csv C:\Temp\ADComputers.csv

# 遍历每台服务器获取磁盘数据
$DiskReport = ForEach ($Server in $Servers) {
    $System = Get-ADComputer $Server.Hostname | Where-Object { $_.Enabled -eq $true } | 
              Select-Object Name, DNSHostName | Sort-Object Name
    if ($System) {
        Get-WmiObject win32_logicaldisk `
            -ComputerName $System.DNSHostName -Filter "Drivetype=3" `
            -ErrorAction SilentlyContinue |
        Select-Object `
            @{Label = "主机名"; Expression = { $_.SystemName } },
            @{Label = "盘符"; Expression = { $_.DeviceID } },
            @{Label = "卷名"; Expression = { $_.VolumeName } },
            @{Label = "总容量(GB)"; Expression = { if ($_.Size) { "{0:N1}" -f ($_.Size / 1gb) } else { "N/A" } } },
            @{Label = "可用空间(GB)"; Expression = { if ($_.Freespace) { "{0:N1}" -f ($_.Freespace / 1gb) } else { "N/A" } } },
            @{Label = '可用空间占比'; Expression = { if ($_.Size -gt 0) { "{0:P0}" -f ($_.Freespace / $_.Size) } else { "N/A" } } }
    }
}

# 定义HTML样式,让报告更美观
$htmlStyle = @"
<style>
    body { font-family: Arial, sans-serif; margin: 20px; }
    table { border-collapse: collapse; width: 100%; margin-top: 20px; }
    th { background-color: #4CAF50; color: white; padding: 12px; text-align: left; }
    td { padding: 10px; border-bottom: 1px solid #ddd; }
    tr:hover { background-color: #f5f5f5; }
    .low-space { background-color: #ffcccc; }
</style>
"@

# 生成HTML报告并添加样式
$htmlReport = $DiskReport | ConvertTo-Html -Head $htmlStyle -Title "服务器磁盘空间报告"

# 导出HTML文件
$htmlPath = "C:\Temp\DiskSpaceReport\DiskReport_$logDate.html"
$htmlReport | Out-File -Path $htmlPath -Encoding UTF8

##### 发送报告邮件  

# 定义邮件变量
$fromaddress = "Myemail@email.com"
$toaddress = "sendersemail@email.com"
$Subject = "英国服务器磁盘报告"
$smtpserver = "relay.mail.com"

# 读取HTML内容作为邮件正文
$body = Get-Content $htmlPath -Raw

# 创建邮件对象并发送
$message = New-Object System.Net.Mail.MailMessage
$message.From = $fromaddress
$message.To.Add($toaddress)
$message.IsBodyHtml = $True
$message.Subject = $Subject
$message.Body = $body
# 可选:添加HTML附件
$attachment = New-Object Net.Mail.Attachment($htmlPath)
$message.Attachments.Add($attachment)

$smtp = New-Object Net.Mail.SmtpClient($smtpserver)
$smtp.Send($message)
修改说明
  • 替换Export-Csv为ConvertTo-Html,并添加自定义CSS样式,让HTML报告更易读
  • 恢复原脚本中注释掉的卷名、总容量、可用空间字段,补充完整报告信息
  • 增加空值判断,避免磁盘数据异常时出现计算错误
  • 修复原脚本中$message.Attachments.Add($file)的变量未定义错误
  • 将HTML报告内容直接作为邮件正文发送,同时保留附件选项
  • 优化代码缩进,提升可读性

内容的提问来源于stack exchange,提问作者bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:52:19