如何在Windows上查找监听TCP或UDP端口的进程?

3244

如何在Windows系统中查找监听TCP或UDP端口的进程?


9
CurrPorts 是一款帮助搜索和筛选的工具。网址为 https://www.nirsoft.net/utils/cports.html。 - Blue Clouds
3
在尝试在IntelliJ下以调试模式运行Tomcat时,我遇到了这个问题。对我来说最好的解决方案是更改调试传输配置(文件->设置->构建/执行/部署->调试器)从“socket”改为“共享内存”。 - TMN
103
将端口号8080替换为其他端口号后,运行命令netstat -aof | findstr :8080 - David Jesus
5
OT: 很有趣看到关于Windows的第一个问题被标记为不相关... - IT M
9
为什么这个问题被关闭了?这是我见过的最直接的问题。 - Glenn Maynard
显示剩余13条评论
34个回答

6

使用PowerShell... ...这将成为您的好帮手(将8080替换为您的端口号):

 netstat -abno | Select-String -Context 0,1 -Pattern 8080

示例输出

>   TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING         2920
   [tnslsnr.exe]
>   TCP    [::]:8080              [::]:0                 LISTENING         2920
   [tnslsnr.exe]

在这个例子中,tnslsnr.exe(OracleXE数据库)正在监听端口8080。
简要解释:
- 使用Select-String过滤netstat的冗长输出以获取相关行。 - -Pattern用于对每行进行正则表达式测试。 - -Context 0,1将为每个模式匹配输出0个前导行和1个尾随行。

3

对于 Windows 操作系统,如果要查找正在监听或连接到端口 1234 的进程,可以在命令提示符中执行以下命令:

netstat -na | find "1234"

2

根据infokill的答案,对我来说将它们结合在一个命令中是有用的。你可以从cmd中运行此命令以获取有关监听给定端口(例如8080)的进程信息:

for /f "tokens=3 delims=LISTENING" %i  in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"

或者如果你想杀掉它:

for /f "tokens=3 delims=LISTENING" %i  in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i

您还可以将这些命令放入批处理文件中(它们会略有不同-用%%i替换%i):

文件portInfo.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"

文件 portKill.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i

然后你可以在命令提示符中执行以下操作:

portInfo.bat 8080

或者

portKill.bat 8080


1
这可能是一个有用的脚本。然而,我在CMD和PowerShell 6中尝试了它,但没有成功。也许您可以提供更多细节来改进您的答案。 - Manfred
第一部分是否正常工作?只有“bat”存在问题吗?在传递变量方面存在一些差异:(%%i) - lczapski
@Manfred 我已经在3个不同的Windows 10上尝试过了。例如,在PowerShell中运行.\portInfo.bat 800会得到类似于以下内容:`C:\work>for /F "tokens=3 delims=LISTENING" %i in ('netstat -ano | findStr "800" | findStr "["') do (tasklist /fi "pid eq %i" )C:\work>(tasklist /fi "pid eq 4" )映像名称 PID 会话名 会话# 内存使用 ========================= ======== ================ =========== ============ System 4 Services 0 1,820 K` - lczapski
抱歉,没有成功。我在PowerShell终端中将该命令放入名为portInfo.bat的文件中,然后执行了.\portInfo.bat 8080。输出只是批处理文件的内容。很可能我忽略了某些东西。请注意,我正在Windows 10上使用PowerShell 6.2.3。我还尝试在常规命令提示符中运行它,但结果相同:输出脚本内容。我确定我缺少关键信息以使其正常工作。 - Manfred
@Manfred 文件的内容应该被打印出来,就像我在之前的提交中展示的那样。也许端口8080上没有任何东西。你试过第一个命令了吗?并且它是否返回了这个端口的一些信息?for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do tasklist /fi "pid eq %i" - lczapski
1
为什么不加上 /nh : @tasklist /nh /fi "pid eq %i"?并且要精确查找:**Findstr ":8080"**。 - Io-oI

2

使用以下批处理脚本,将进程名称作为参数,并提供该进程的netstat输出。

@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End

:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------

netstat -ano |findstr %z%
goto :eof

:End

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接