使用PSPing监测自定义RDP端口,如何输出带时间戳的完整日志
问题根源说明
你原有代码的问题出在这几个地方:
Write-Host的输出仅会打印到控制台,不会进入管道被Out-File捕获,所以时间戳不会写入日志- 你每次调用
Out-File用的是默认覆盖模式,每次循环都会清空之前的日志内容,导致只有最后一次测试结果 - PSPing的输出是多行文本,直接写入没有结构化,后续排查高延迟/丢包会很麻烦
修正后可用代码
# 基础配置 $Server = "SERVER01" $PSPingPath = "C:\TEMP\PSTools\psping64.exe" $LogPath = "C:\TEMP\Logs\$Server.csv" $TestPort = 1234 $TestDurationHours = 7 $TestIntervalSeconds = 5 # 预创建日志目录(不存在的话) $LogDir = Split-Path $LogPath -Parent if (-not (Test-Path $LogDir)) { New-Item -ItemType Directory -Path $LogDir -Force | Out-Null } # 写入CSV表头(第一次运行时加,已存在就跳过) if (-not (Test-Path $LogPath)) { "测试时间,目标地址,端口,连通状态,延迟(ms)" | Out-File -FilePath $LogPath -Encoding UTF8 } Function Test-PortPing { param( [string]$Target, [int]$Port ) $TestTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 调用psping,-n 1表示只测1次,-q表示静默输出只给结果 $pspingResult = & $PSPingPath -n 1 -q "$Target`:$Port" 2>&1 # 解析结果,判断连通性和延迟 if ($pspingResult -match "Connect to.*failed") { $Status = "不通" $Latency = "0" } elseif ($pspingResult -match "Reply from.*time=(\d+\.?\d*)ms") { $Status = "连通" $Latency = $matches[1] } else { $Status = "异常" $Latency = "0" } # 控制台输出方便实时看 Write-Host "$TestTime | $Target`:$Port | $Status | $Latency ms" -ForegroundColor $(if($Status -eq "连通"){"Green"}else{"Red"}) # 返回结构化结果用于写日志 return "$TestTime,$Target,$Port,$Status,$Latency" } # 启动7小时循环测试 $TimeEnd = (Get-Date).AddHours($TestDurationHours) Do { $resultLine = Test-PortPing -Target $Server -Port $TestPort # 追加写入日志,注意加-Append参数 $resultLine | Out-File -FilePath $LogPath -Encoding UTF8 -Append Start-Sleep -Seconds $TestIntervalSeconds } Until ((Get-Date) -ge $TimeEnd) Write-Host "7小时端口监测已完成,日志已保存至 $LogPath" -ForegroundColor Green
方案说明
- 新增
-n 1 -q参数调用PSPing,仅输出单次测试的核心结果,避免多余的 banner、统计信息干扰解析 - 直接解析PSPing的输出结果,结构化写入CSV,后续可以直接用Excel打开筛选不通、高延迟的记录
- 每次写入日志用
-Append参数,不会覆盖之前的内容 - 时间戳统一按
yyyy-MM-dd HH:mm:ss格式记录,排查问题时可以直接对应时间点 - 新增日志目录自动创建逻辑,避免因为目录不存在导致的写日志失败
内容的提问来源于stack exchange,提问作者Deland01
相关产品推荐
相关产品推荐

