如何在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
相关产品推荐
相关产品推荐

