windows – 通过从.BAT查找正在使用的端口来终止进程

在Windows中,什么可以寻找端口8090,并尝试杀死它通过.BAT文件使用的进程?

1、正常情况下,我们会这样做,打开cmd窗口,

输入

netstat -a -n -o | findstr :8090

在这里插入图片描述

查找一下8090端口的进程,之后获取进程好 2044 。再次向taskkill结束进程

taskkill /pid 2044 -t -f  

在这里插入图片描述

然后就结束进程了。

但是这样做有一个缺点,需要执行两条命令,因为每次程序启动的pid号码都是不一样的。而且需要人为的去填写进程pid号码,有没有更方便的方式呢,自动执行呢。

2、 这就需要用到for方法了

FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8090') DO TaskKill.exe  /PID %P  -t -f

在这里插入图片描述

这样就结束了进程了,而且不需要分两次人工干预了。

FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8090') DO echo TaskKill.exe  /PID %P  -t -f

添加一个echo可以显示命令

请注意,您可能需要为不同的操作系统略有更改。例如,在Windows 7或者Windows10上,您可能需要tokens = 5而不是tokens = 4。

3、进阶

如果我需要结束不止一个端口呢,难道问命令还需要写很多个吗?
其实很简单,只要把port设置成变量即可

set port=8090 8080
FOR /F "tokens=1-5 delims= " %P IN ('netstat -a -n -o ^| findstr ":%port%"') DO  TaskKill.exe  /PID %P  -t -f
@echo off
set port=20812
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
    echo kill the process %%m who use the port %port%
    taskkill /pid %%m
)

循环读取一批端口,并查询对应PID是否存在,若存在则关闭,脚本如下:

@echo off
for /l %%n in (20801,1,20812) do (
    @echo find the process which use port [%%n]
    for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%%n"') do (
        tasklist /FI "PID eq %%m"|find /i "PID" && (
        echo PID:%%m 运行中,kill the process [%%m] who use the port [%%n]
        taskkill /F /pid %%m
        ) || echo PID:%%m 未运行 
    )
)

4、注意事项:

运行

FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8090') DO TaskKill.exe  /PID %P  -t -f 

发现虽然可以关闭进程,但是那个dos黑窗口还在,这个关不掉,原因是,我是直接 win+r键,然后输入cmd,然后输入命令脚本运行程序的。
如果我把运行程序的脚本写成bat脚本,然后直接双击运行,这样的情况,就可以关闭进程的同时又关闭那个doc黑框了。

5 、原理:

FOR /F ... %variable IN ('command') DO otherCommand %variable...

这使您可以执行命令,并在其输出上循环。每行都将填充到%变量,并可以扩展到otherCommand任意多次,你喜欢,无论你喜欢什么。 %变量在实际使用中只能有一个单字母的名称,例如。 %V。

"tokens=4 delims= "

这允许你用空格分隔每一行,并取第四个块,并将它填充到%变量(在我们的例子中,%% P)。 delims看起来空的,但是额外的空间实际上是重要的。

netstat -a -n -o

只是运行它,找出来。根据命令行帮助,它“显示所有连接和侦听端口”,“以数字形式显示地址和端口号”和“显示与每个连接相关的拥有进程ID”。我只是使用这些选项,因为有人建议它,它碰巧工作:)

^|

这取得第一个命令或程序(netstat)的输出,并将其传递到第二个命令程序(findstr)。如果你直接在命令行中使用它,而不是在命令字符串中,你可以使用|而不是^ |。

findstr :8090

这将过滤传递给它的任何输出,只返回包含以下内容的行:8080。

TaskKill.exe /PID <value>

这将使用进程ID杀死正在运行的任务。

%%P instead of %P

这在批处理文件中是必需的。如果在命令提示符下执行此操作,您将使用%P。

https://codeday.me/bug/20170617/28398.html
https://www.cnblogs.com/luodengxiong/p/5863112.html

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值