You need to enable JavaScript to run this app. 如何在PowerShell中使用Test-Connection获取ping时间实现分层巡检
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell中使用Test-Connection获取ping时间实现分层巡检

PowerShell 分层Ping巡检脚本实现方案

核心问题修正点

  • 移除Test-Connection的-Quiet参数:该参数仅返回布尔值,移除后可获取每个ping的响应对象,通过对象的ResponseTimeMS属性直接读取实际响应时间
  • 修正重试逻辑:原逻辑一次性发送15个ping,不符合「每秒发1次、累计成功15次切回正常模式」的要求,改为逐次发送、累加成功次数
  • 新增日志记录:每次ping(含超时)完成后,将时间、状态、响应时间追加写入CSV格式日志文件,方便后续统计排查

完整可运行脚本

# 配置项
$targetIp = "xxx.xxx.xxx.xxx"
$logPath = "C:\PingCheckLog.csv"
$normalPingCount = 4
$normalTimeout = 15
$normalInterval = 15
$retryPingCount = 1
$retryTimeout = 1
$retryInterval = 1
$retrySuccessThreshold = 15

# 状态变量
$isRetryMode = $false
$retrySuccessCount = 0

# 初始化日志文件(不存在则写入表头)
if (-not (Test-Path $logPath)) {
    "TimeStamp,TargetIP,Mode,Status,ResponseTimeMS" | Out-File $logPath -Encoding UTF8
}

# 主巡检循环,如需持续运行可将foreach改为 while($true)
foreach ($i in 1..10) {
    if (-not $isRetryMode) {
        Write-Host "当前为正常巡检模式" -ForegroundColor Cyan
        # 正常模式发送4次ping,15秒超时
        $pingResults = Test-Connection -Ping -IPV4 -Count $normalPingCount -TimeoutSeconds $normalTimeout -TargetName $targetIp -ErrorAction SilentlyContinue
        $successCount = ($pingResults | Measure-Object).Count

        # 记录成功的ping日志
        foreach ($res in $pingResults) {
            [PSCustomObject]@{
                TimeStamp     = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                TargetIP      = $targetIp
                Mode          = "Normal"
                Status        = "Success"
                ResponseTimeMS = $res.ResponseTimeMS
            } | Export-Csv $logPath -Append -NoTypeInformation -Encoding UTF8
        }

        # 记录超时的ping日志
        for ($j = 0; $j -lt ($normalPingCount - $successCount); $j++) {
            [PSCustomObject]@{
                TimeStamp     = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                TargetIP      = $targetIp
                Mode          = "Normal"
                Status        = "Timeout"
                ResponseTimeMS = $null
            } | Export-Csv $logPath -Append -NoTypeInformation -Encoding UTF8
        }

        # 切换模式判断
        if ($successCount -lt $normalPingCount) {
            Write-Host "正常巡检未全部成功,切换为重试模式" -ForegroundColor Yellow
            $isRetryMode = $true
            $retrySuccessCount = 0
        } else {
            Write-Host "正常巡检全部成功" -ForegroundColor Green
            Start-Sleep -Seconds $normalInterval
        }
    } else {
        Write-Host "当前为重试巡检模式,已累计成功 $retrySuccessCount 次" -ForegroundColor Blue
        # 重试模式每秒发1次ping,1秒超时
        $pingRes = Test-Connection -Ping -IPV4 -Count $retryPingCount -TimeoutSeconds $retryTimeout -TargetName $targetIp -ErrorAction SilentlyContinue
        
        if ($pingRes) {
            # 记录成功日志,累计成功次数
            [PSCustomObject]@{
                TimeStamp     = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                TargetIP      = $targetIp
                Mode          = "Retry"
                Status        = "Success"
                ResponseTimeMS = $pingRes.ResponseTimeMS
            } | Export-Csv $logPath -Append -NoTypeInformation -Encoding UTF8
            $retrySuccessCount++

            # 累计成功达阈值,切回正常模式
            if ($retrySuccessCount -ge $retrySuccessThreshold) {
                Write-Host "重试模式累计成功15次,切回正常巡检模式" -ForegroundColor Green
                $isRetryMode = $false
                $retrySuccessCount = 0
                Start-Sleep -Seconds $normalInterval
            }
        } else {
            # 记录超时日志,清空累计成功次数
            [PSCustomObject]@{
                TimeStamp     = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                TargetIP      = $targetIp
                Mode          = "Retry"
                Status        = "Timeout"
                ResponseTimeMS = $null
            } | Export-Csv $logPath -Append -NoTypeInformation -Encoding UTF8
            $retrySuccessCount = 0
        }
        Start-Sleep -Seconds $retryInterval
    }
}

说明事项

  • 日志默认存在C:\PingCheckLog.csv,可根据实际需求修改$logPath变量
  • 如需24小时持续巡检,把主循环的foreach ($i in 1..10)替换为while ($true)即可
  • 日志同时记录正常、重试模式下的所有ping结果,超时项会标注Timeout状态,响应时间为空
  • 重试模式下如果中途出现ping失败,会直接清空累计成功次数,重新计数直到连续15次成功才切回正常模式,如需累计不重置可删除对应清零逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 18:54:04