Windows 下使用 PowerShell 和 CMD 排查端口占用

文章目录

Windows 下使用 PowerShell 和 CMD 排查端口占用

一、PowerShell 端口排查速查表

目的 PowerShell 命令 说明
查看某端口是否被占用 Get-NetTCPConnection -LocalPort 9101 最直接
查看端口对应 PID `Get-NetTCPConnection -LocalPort 9101 Select LocalPort,State,OwningProcess`
根据 PID 查进程 Get-Process -Id 1234 查看进程名称
查看某进程所有监听端口 `Get-NetTCPConnection -OwningProcess 1234 ? State -eq Listen`
查看 weed.exe 所有监听端口 `Get-NetTCPConnection -OwningProcess (Get-Process weed).Id ? State -eq Listen`
查看所有 TCP 监听端口 Get-NetTCPConnection -State Listen 查看本机全部监听服务
查看所有 TCP 连接 Get-NetTCPConnection 包括 Listen、Established 等
查看某端口完整信息 `Get-NetTCPConnection -LocalPort 9101 Format-List *`
查看进程启动命令行 `Get-CimInstance Win32_Process -Filter "Name = 'weed.exe'" Select ProcessId,CommandLine`
查看指定 PID 启动参数 `Get-CimInstance Win32_Process -Filter "ProcessId = 1234" Select CommandLine`
查看 UDP 端口 Get-NetUDPEndpoint 查询 UDP 端口
查看指定 UDP 端口 Get-NetUDPEndpoint -LocalPort 9101 查询指定 UDP
查看防火墙规则 Get-NetFirewallRule Windows 防火墙排查
查看端口过滤规则 Get-NetFirewallPortFilter 查看端口过滤条件

二、Windows 中端口排查的基本思路

Windows 中排查端口问题,通常需要依次回答几个问题:

text 复制代码
这个端口是否被占用?
        ↓
谁占用了这个端口?
        ↓
对应的 PID 是什么?
        ↓
PID 对应哪个进程?
        ↓
这个进程是如何启动的?
        ↓
它还监听了哪些端口?

例如:

text 复制代码
9101
 ↓
TCP LISTEN
 ↓
PID 1234
 ↓
weed.exe
 ↓
启动参数
 ↓
确认具体服务

这套方法不仅适用于 SeaweedFS,也适用于 Web 服务、数据库、代理程序、开发环境中的各种后台服务。


三、使用 PowerShell 查看端口

1. 查看指定端口

PowerShell 推荐使用:

powershell 复制代码
Get-NetTCPConnection -LocalPort 9101

例如:

text 复制代码
LocalAddress LocalPort RemoteAddress RemotePort State  OwningProcess
------------ --------- ------------- ----------- -----  -------------
0.0.0.0      9101      0.0.0.0       0           Listen 1234

其中:

字段 含义
LocalAddress 本地监听地址
LocalPort 本地端口
RemoteAddress 对端地址
RemotePort 对端端口
State TCP 状态
OwningProcess 占用端口的 PID

四、查看端口是否正在监听

如果只关心某个端口有没有处于监听状态:

powershell 复制代码
Get-NetTCPConnection -LocalPort 9101 -State Listen

如果没有任何输出,一般表示当前没有 TCP 服务监听该端口。

也可以使用:

powershell 复制代码
Get-NetTCPConnection -State Listen |
    Where-Object LocalPort -eq 9101

五、根据端口找到 PID

推荐:

powershell 复制代码
Get-NetTCPConnection -LocalPort 9101 |
    Select-Object LocalAddress,LocalPort,State,OwningProcess

例如:

text 复制代码
LocalAddress LocalPort State  OwningProcess
------------ --------- -----  -------------
0.0.0.0      9101      Listen 1234

其中:

text 复制代码
OwningProcess = 1234

就是占用端口的进程 PID。


六、根据 PID 查进程

获得 PID 后:

powershell 复制代码
Get-Process -Id 1234

例如:

text 复制代码
Handles  NPM(K)  PM(K)  WS(K)  CPU(s)  Id   ProcessName
-------  ------  -----  -----  ------  ---  -----------
...      ...     ...    ...    ...     1234 example

也可以只查看进程名称:

powershell 复制代码
(Get-Process -Id 1234).ProcessName

七、CMD 中使用 netstat 查询端口

Windows CMD 最经典的端口查询命令是:

cmd 复制代码
netstat -ano

参数含义:

text 复制代码
-a    显示所有连接和监听端口
-n    使用数字形式显示地址和端口
-o    显示 PID

例如:

text 复制代码
Proto  Local Address   Foreign Address   State       PID
TCP    0.0.0.0:9101    0.0.0.0:0         LISTENING   1234

八、使用 CMD 查询指定端口

例如查询 9101:

cmd 复制代码
netstat -ano | findstr :9101

结果:

text 复制代码
TCP    0.0.0.0:9101    0.0.0.0:0    LISTENING    1234

这是 Windows 环境中最常见的端口排查方法之一。


九、CMD 根据 PID 查进程

已经获得 PID:

text 复制代码
1234

可以执行:

cmd 复制代码
tasklist /FI "PID eq 1234"

例如:

text 复制代码
Image Name     PID     Session Name
example.exe    1234    Console

因此 CMD 的完整排查流程就是:

cmd 复制代码
netstat -ano | findstr :9101

得到:

text 复制代码
PID = 1234

然后:

cmd 复制代码
tasklist /FI "PID eq 1234"

得到:

text 复制代码
example.exe

十、PowerShell 与 CMD 命令对照

排查目的 PowerShell CMD
查看所有 TCP 连接 Get-NetTCPConnection netstat -ano
查看监听端口 Get-NetTCPConnection -State Listen `netstat -ano
查询指定端口 Get-NetTCPConnection -LocalPort 9101 `netstat -ano
查看 PID OwningProcess netstat -ano 输出最后一列
PID → 进程 Get-Process -Id 1234 tasklist /FI "PID eq 1234"
查看 UDP Get-NetUDPEndpoint netstat -ano -p UDP
查看启动参数 Get-CimInstance Win32_Process wmic process(旧工具)

一般来说:

  • PowerShell:适合结构化查询、脚本自动化;
  • CMD:适合快速执行传统命令;
  • netstat:兼容性最好;
  • Get-NetTCPConnection:PowerShell 下信息更加结构化。

十一、查看一个进程监听的所有端口

如果已经知道 PID:

powershell 复制代码
Get-NetTCPConnection -OwningProcess 1234 |
    Where-Object State -eq Listen |
    Select-Object LocalAddress,LocalPort,State,OwningProcess

例如:

text 复制代码
LocalAddress LocalPort State  OwningProcess
------------ --------- -----  -------------
0.0.0.0      8080      Listen 1234
0.0.0.0      8888      Listen 1234
0.0.0.0      9000      Listen 1234
0.0.0.0      9101      Listen 1234

这对于一个进程同时提供多个网络服务的程序非常有用。


十二、直接查看某个程序的所有监听端口

例如查看 weed.exe:

powershell 复制代码
Get-Process weed -ErrorAction SilentlyContinue |
    ForEach-Object {
        Get-NetTCPConnection -OwningProcess $_.Id -ErrorAction SilentlyContinue |
            Where-Object State -eq "Listen" |
            Select-Object LocalAddress,LocalPort,State,OwningProcess
    }

同样的方法也适用于其他程序,只需要修改进程名称。


十三、同时显示端口、PID 和进程名称

可以进一步封装成一个更加实用的查询:

powershell 复制代码
Get-NetTCPConnection -State Listen |
    Sort-Object LocalPort |
    ForEach-Object {
        $p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue

        [PSCustomObject]@{
            Address = $_.LocalAddress
            Port    = $_.LocalPort
            PID     = $_.OwningProcess
            Process = if ($p) { $p.ProcessName } else { "Unknown" }
        }
    }

输出类似:

text 复制代码
Address   Port  PID   Process
-------   ----  ---   -------
0.0.0.0   135   1020  svchost
0.0.0.0   445   4     System
0.0.0.0   8080  1234  example
0.0.0.0   8888  1234  example
0.0.0.0   9101  1234  example

这种方式比单独使用 netstat 更容易阅读。


十四、查看 UDP 端口

TCP 和 UDP 是两种不同的传输协议。

查看 UDP:

powershell 复制代码
Get-NetUDPEndpoint

查看指定 UDP 端口:

powershell 复制代码
Get-NetUDPEndpoint -LocalPort 9101

CMD 中可以使用:

cmd 复制代码
netstat -ano -p UDP

因此排查网络端口时,需要注意:

text 复制代码
TCP 9101

和:

text 复制代码
UDP 9101

是两个不同的端点。


十五、查看进程实际启动参数

仅仅知道:

text 复制代码
PID = 1234
Process = example.exe

有时候还不够。

如果需要知道这个进程是通过什么参数启动的,可以使用:

powershell 复制代码
Get-CimInstance Win32_Process -Filter "ProcessId = 1234" |
    Select-Object ProcessId,CommandLine

例如:

text 复制代码
ProcessId CommandLine
--------- -----------
1234      example.exe --port=9101 --config=config.yaml

这样就可以进一步确定端口的来源。

对于 SeaweedFS 等命令行参数较多的程序,这种方法尤其有用。


十六、查看系统所有监听端口

可以使用:

powershell 复制代码
Get-NetTCPConnection -State Listen |
    Sort-Object LocalPort |
    Select-Object LocalAddress,LocalPort,OwningProcess

如果需要同时查看进程名称:

powershell 复制代码
Get-NetTCPConnection -State Listen |
    Sort-Object LocalPort |
    ForEach-Object {
        $p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue

        [PSCustomObject]@{
            Address = $_.LocalAddress
            Port    = $_.LocalPort
            PID     = $_.OwningProcess
            Process = if ($p) { $p.ProcessName } else { "Unknown" }
        }
    }

可以把它保存成 .ps1,作为日常端口检查脚本。


十七、Windows 自带可视化工具:资源监视器

Windows 自带一个非常实用的工具:

资源监视器(Resource Monitor)

按:

text 复制代码
Win + R

输入:

text 复制代码
resmon

打开后进入:

text 复制代码
网络 → 侦听端口

可以看到当前系统监听的端口,例如:

text 复制代码
映像          PID       协议     本地地址       本地端口
example.exe   1234      TCP      0.0.0.0        9101
example.exe   1234      TCP      0.0.0.0        9200

它适合快速确认:

text 复制代码
哪个程序
 ↓
哪个 PID
 ↓
监听哪个端口

不需要输入命令。


十八、推荐工具:TCPView

如果经常进行 Windows 网络排查,可以使用 Microsoft Sysinternals 的 TCPView。

TCPView 是一个专门查看 TCP/UDP 连接的图形化工具。

相比 netstat,它更加直观,可以实时显示:

text 复制代码
Process
PID
Protocol
Local Address
Local Port
Remote Address
Remote Port
State

例如:

text 复制代码
Process       PID     Protocol   Local Port   State
example.exe   1234    TCP        9101         LISTENING

主要优点:

  • 图形化;
  • 实时刷新;
  • 可以按照进程排序;
  • 可以按照端口排序;
  • 可以查看 TCP 状态;
  • 可以观察连接建立和关闭;
  • 适合快速定位端口占用。

如果只是日常查看端口,TCPView 是非常实用的工具。


十九、其他常用可视化工具

工具 类型 适合场景
资源监视器 Windows 自带 简单查看端口
TCPView Sysinternals 专业查看 TCP/UDP
CurrPorts 第三方 查看端口和进程
Process Explorer Sysinternals 深入分析进程
Wireshark 网络分析 抓包和分析实际网络通信

它们解决的问题并不完全相同:

text 复制代码
查看端口
    ↓
资源监视器 / TCPView

查看进程
    ↓
Process Explorer

自动化检查
    ↓
PowerShell

分析网络数据
    ↓
Wireshark

二十、端口占用与网络不通是两个不同的问题

需要特别注意:

"端口被占用"和"端口可以正常访问"不是同一个问题。

例如:

text 复制代码
程序
 ↓
监听 9101

只能说明本机存在一个服务。

但客户端是否能够访问,还涉及:

text 复制代码
服务是否监听正确地址
        ↓
Windows 防火墙
        ↓
网络路由
        ↓
网卡
        ↓
远端设备
        ↓
目标端口

例如程序监听:

text 复制代码
127.0.0.1:9101

只能接受本机访问。

而:

text 复制代码
0.0.0.0:9101

表示监听本机所有 IPv4 网络接口,是否能被其他机器访问还要继续检查防火墙和网络环境。


二十一、Windows 端口排查的推荐流程

实际工作中可以固定采用下面的流程:

text 复制代码
① 确认端口是否存在
        ↓
Get-NetTCPConnection -LocalPort 9101

② 获取 PID
        ↓
OwningProcess

③ 查看进程
        ↓
Get-Process -Id 1234

④ 查看启动参数
        ↓
Get-CimInstance Win32_Process

⑤ 查看该进程的其他端口
        ↓
Get-NetTCPConnection -OwningProcess 1234

⑥ 如果端口无法远程访问
        ↓
检查监听地址
        ↓
检查 Windows 防火墙
        ↓
检查网络连接
        ↓
必要时使用 Wireshark 抓包

二十二、最值得记住的几条命令

如果只记住几个命令,可以记下面这些。

查询指定 TCP 端口

powershell 复制代码
Get-NetTCPConnection -LocalPort 9101

查看所有监听端口

powershell 复制代码
Get-NetTCPConnection -State Listen

根据 PID 查进程

powershell 复制代码
Get-Process -Id 1234

查看进程启动参数

powershell 复制代码
Get-CimInstance Win32_Process -Filter "ProcessId = 1234" |
    Select-Object CommandLine

查询 UDP

powershell 复制代码
Get-NetUDPEndpoint

CMD 查询端口

cmd 复制代码
netstat -ano | findstr :9101

CMD 根据 PID 查进程

cmd 复制代码
tasklist /FI "PID eq 1234"

二十三、总结

Windows 下排查端口,核心并不是记住大量命令,而是掌握下面这条关系:

text 复制代码
端口
 ↓
PID
 ↓
进程
 ↓
启动参数
 ↓
网络服务

PowerShell 更适合:

text 复制代码
结构化查询
+
脚本自动化
+
批量检查

CMD 更适合:

text 复制代码
快速查询
+
兼容性较好的传统命令

而图形化工具可以辅助快速定位:

text 复制代码
资源监视器
    ↓
快速查看

TCPView
    ↓
专业查看端口和连接

Wireshark
    ↓
深入分析网络通信

因此,在 Windows 开发和部署环境中,一套比较实用的组合是:

text 复制代码
PowerShell
    +
netstat
    +
TCPView
    +
Wireshark

其中 PowerShell 负责自动化,netstat 负责快速确认,TCPView 负责可视化观察,Wireshark 负责进一步分析实际网络数据。

相关推荐
万年咸鱼12 小时前
Qt Windows 使用管理员权限运行 Cmd
windows
2601_9623649716 小时前
从录入到解锁,完整梳理 Windows Hello 识别链路
windows·安全·电脑
hacker_LeeFei17 小时前
Windows 下配置 Redis 8.10.2 开机自启:一次踩坑全记录
数据库·windows·redis
赵文宇(温玉)18 小时前
怎么下载 Windows 的 ISO 系统镜像
windows
2601_9621773020 小时前
Windows 安装 Codex CLI 入门级教程
人工智能·windows·node.js·ai编程
shada1 天前
CMake指定 MSVC 工具集与 Windows SDK
c++·windows
the3clipse1 天前
Windows 10 与 Windows 11 视频编解码区别:AV1、HEVC、HDR 与 D3D12 编码支持对比
windows·h.265·hevc·hdr·av1·视频解码·d3d12
郭庆汝1 天前
(三)MCP+A2A 从0到1构建类Manus多Agent全栈应用
windows
the3clipse1 天前
MacOS、Linux 与 Windows 视频编解码对比:AV1、HEVC、ProRes 与硬件加速优劣势
linux·windows·macos·hevc·av1·视频解码·硬件解码