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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:57:09