PowerShell磁盘监控脚本遍历数组异常:仅输出最后一项
PowerShell磁盘监控脚本修复:遍历多服务器仅输出最后一台的问题
问题根源
你的脚本中,遍历服务器的foreach ($computer in $computers)循环仅做了变量初始化(如$disks、$mailbody),但磁盘检查、阈值判断、邮件发送的核心逻辑都在循环外部。每次循环会覆盖这些变量的值,循环结束后变量仅保留最后一台服务器的数据,因此只会处理最后一台服务器的磁盘信息。
修复后的完整脚本
# PowerShell脚本:多服务器磁盘空间监控告警 # 定义邮件发送函数(需补充SMTP相关配置) function SendEmail([string]$msg, [string]$subject) { $SMTPClient = New-Object System.Net.Mail.SmtpClient $SMTPClient.host = "你的SMTP服务器地址" # 补充SMTP地址 $MailMessage = New-Object System.Net.Mail.MailMessage $MailMessage.Subject = $subject $MailMessage.Body = $msg $MailMessage.From = "发件人邮箱" # 补充发件人 $MailMessage.To.Add("收件人邮箱") # 补充收件人 $SMTPClient.Send($MailMessage) } # 服务器列表 $computers = @("dsmsql2","dsmfs2","dsmgmc2") $percentWarning = 80 # 告警阈值(剩余空间占比低于此值触发) # 遍历每台服务器执行检查 foreach ($computer in $computers) { try { # 获取磁盘信息(用Get-CimInstance替代过时的Get-WmiObject) $disks = Get-CimInstance -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" -ErrorAction Stop $mailbody = "以下磁盘剩余空间低于$percentWarning%,服务器:$computer`n`n" $mailbody += "盘符`t`t总容量(GB)`t`t剩余容量(GB)`n---------------------------------------------------------------`n" $drivedata = [string]::Empty $emailsubject = "$computer - 磁盘空间不足告警!" # 遍历磁盘判断阈值 foreach($disk in $disks) { $deviceID = $disk.DeviceID [float]$size = $disk.Size [float]$freespace = $disk.FreeSpace $percentFree = [Math]::Round(($freespace / $size) * 100, 2) $sizeGB = [Math]::Round($size / 1073741824, 2) $freeSpaceGB = [Math]::Round($freespace / 1073741824, 2) if($percentFree -lt $percentWarning) { $drivedata += "$deviceID`t`t$sizeGB`t`t`t$freeSpaceGB`n" } } # 若存在符合阈值的磁盘则发送邮件 if($drivedata.Length -gt 0) { $msg = $mailbody + $drivedata SendEmail -msg $msg -subject $emailsubject } } catch { Write-Warning "服务器$computer连接失败:$_" } }
关键修改点
- 将磁盘检查、阈值判断、邮件发送逻辑全部移入服务器遍历循环内,确保每台服务器独立完成完整流程。
- 把
SendEmail函数移至脚本开头,避免调用时未定义的错误,同时增加参数传递$subject,避免依赖全局变量。 - 替换
Get-WmiObject为Get-CimInstance(官方推荐的现代替代方案,兼容性和性能更优)。 - 增加
try/catch块捕获服务器连接失败的异常,避免脚本中断。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

