求助:将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显示效果

修改后的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
相关产品推荐
相关产品推荐

