PowerShell检测TCPv4连接数并终止进程脚本故障排查
看起来你遇到的核心问题是性能计数器路径不匹配或者依赖计数器的方式不够可靠,导致无法正确获取TCPv4已建立连接数,进而让脚本逻辑失效。我帮你拆解问题并给出两种可靠的解决方案:
一、最推荐的方案:用Get-NetTCPConnection直接获取连接数
这个PowerShell cmdlet是专门为网络连接管理设计的,不需要依赖性能计数器,兼容性更强,也不会因为系统语言差异出问题(比如中文系统里计数器名称是中文的,这很可能是你之前用Get-Counter返回空的原因)。
完整脚本如下:
# 获取本地所有已建立状态的TCPv4连接数量 $establishedCount = (Get-NetTCPConnection -State Established -AddressFamily IPv4).Count # 判断是否超过阈值 if ($establishedCount -gt 100) { # 终止Notepad进程,加上-ErrorAction避免进程不存在时报错 Stop-Process -Name Notepad -ErrorAction SilentlyContinue Write-Host "✅ Notepad进程已终止!当前TCPv4已建立连接数:$establishedCount" } else { Write-Host "✅ 当前TCPv4已建立连接数:$establishedCount,未超过100的阈值,无需操作。" }
为什么这个方案更好?
- 不需要纠结性能计数器的语言差异(中文系统里计数器名称是中文,英文系统是英文,
Get-NetTCPConnection不受影响) - 直接返回连接对象,统计数量更直观
- PowerShell 5.1及以上版本(Windows 8/Server 2012及以上)都支持,兼容性强
二、修复Get-Counter的用法(如果你一定要用性能计数器)
如果坚持用性能计数器,首先要确认你的系统里计数器的正确名称:
- 打开PowerShell(建议管理员身份),运行以下命令查看TCPv4相关的计数器名称:
Get-Counter -ListSet TCPv4 | Select-Object -ExpandProperty CounterNames
- 你会看到类似的输出,比如中文系统里是
已建立的连接数,英文系统里是Connections Established。
根据系统语言修改计数器路径,比如中文系统的脚本:
# 中文系统下的TCPv4已建立连接数计数器路径 $counterData = Get-Counter -Counter "\TCPv4\已建立的连接数" $connectionCount = $counterData.CounterSamples.CookedValue if ($connectionCount -gt 100) { Stop-Process -Name Notepad -ErrorAction SilentlyContinue Write-Host "✅ Notepad进程已终止!当前TCPv4已建立连接数:$connectionCount" } else { Write-Host "✅ 当前TCPv4已建立连接数:$connectionCount,未超过阈值。" }
你之前脚本失效的原因:
- 中文系统里用了英文的计数器路径
\TCPv4\Connections Established,导致Get-Counter找不到对应的计数器,返回空值,所以脚本进入了else分支 - 第一段脚本里用
Measure-Object来统计长度是错误的,Get-Counter返回的是计数器对象,不是数组,Measure-Object.Length没有意义
额外注意事项
- 运行脚本时建议以管理员身份启动PowerShell,否则可能没有权限终止进程或读取全部网络连接信息
- 如果Notepad进程不存在,
Stop-Process会报错,加上-ErrorAction SilentlyContinue可以避免这种情况
内容的提问来源于stack exchange,提问作者Pavel




