如何用Windows PowerShell按30秒间隔提取LISTEN/ESTABLISHED数据并导出Excel
按30秒间隔统计LISTEN/ESTABLISHED连接数并导出Excel
一、最优解决方案:结构化统计并导出
直接用PowerShell循环抓取统计,记录时间戳和两种状态的数量,导出的CSV可直接用Excel打开,步骤如下:
- 运行以下PowerShell脚本(按需修改循环次数,比如把
10改成你需要的统计次数,或者换成while($true)实现无限统计):
$results = @() # 这里设置统计10次,每30秒一次 for ($i=1; $i -le 10; $i++) { $currentTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 抓取所有连接并过滤目标状态 $connList = netstat -na | Select-String 'LISTENING|ESTABLISHED' # 分别统计数量 $listenNum = ($connList | Where-Object { $_ -match 'LISTENING' }).Count $estabNum = ($connList | Where-Object { $_ -match 'ESTABLISHED' }).Count # 组装成结构化数据 $statObj = [PSCustomObject]@{ 时间戳 = $currentTime LISTENING连接数 = $listenNum ESTABLISHED连接数 = $estabNum } $results += $statObj # 最后一次循环不用等 if ($i -lt 10) { Start-Sleep -Seconds 30 } } # 导出到CSV,路径自己改 $results | Export-Csv -Path "C:\你的路径\ConnectionStats.csv" -Encoding UTF8 -NoTypeInformation
- 用Excel打开生成的CSV文件,直接就能用来做图表。如果需要原生xlsx格式,先安装
ImportExcel模块(运行Install-Module -Name ImportExcel,需要管理员权限),然后把最后一行导出命令换成:
$results | Export-Excel -Path "C:\你的路径\ConnectionStats.xlsx" -AutoSize -BoldTopRow
二、针对你原有命令的优化
如果非要用netstat -na 30的持续输出,想过滤掉无关内容并实时统计数量,用这个命令:
netstat -na 30 | Select-String 'LISTENING|ESTABLISHED' | ForEach-Object { # 拆分行内容,提取最后一列的状态 $status = ($_ -split '\s+')[-1] $status } | Group-Object | ForEach-Object { Write-Host "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $($_.Name): $($_.Count)" }
不过这种方式只是实时打印统计结果,要导出成可用于图表的结构化数据,还是推荐第一种脚本方案。
三、为什么不用原来的start-transcript?
start-transcript会记录PowerShell的所有输出内容,包括命令执行的提示信息,导致日志里有大量无关内容,不如直接抓取并结构化数据高效。
内容的提问来源于stack exchange,提问作者user19822539
相关产品推荐
相关产品推荐

