zhangbo093 发表于 2022-7-16 17:34

【批处理】根据进程名关闭占用服务端口的进程(适用于java、php等大部分语言)

本帖最后由 zhangbo093 于 2022-7-16 17:36 编辑

> **背景介绍:日常工作中,常用IDEA,经常遇到右上角停止不了项目的问题(导致IDEA假死),特别是微服务项目打开任务管理器结束进程又分不清要结束哪些进程,故有此想法,写个批处理,方便快捷,此批处理也适用其他服务进程(如:php.exe等)。现分享给大家,欢迎交流学习,大佬勿喷。谢谢!**

```
@echo off
setlocal enabledelayedexpansion
:start1
title 根据进程名关闭占用服务端口的进程。作者:zhangbo093
echo------------------------------------------------------------------------------------------------------
echo ┃--------------------------------------------------------------------------------------------------┃
echo ┃ ┃   _______      _____      ______      ____      _____    _____    _________                  ┃ ┃
echo ┃ ┃┃_____┃    / ___ `.   ┃_   __ \    .'    `.   ┃_   _┃┃_   _┃┃_   ___┃               ┃ ┃
echo ┃ ┃┃ ┃____   ┃_/___) ┃   ┃ ┃__) ┃/.--.\      ┃ ┃      ┃ ┃      ┃ ┃_\_┃               ┃ ┃
echo ┃ ┃'_.____''.   .'____.'   ┃___/   ┃ ┃    ┃ ┃   _┃ ┃      ┃ ┃      ┃_┃_                  ┃ ┃
echo ┃ ┃┃ \____) ┃/ /____      _┃ ┃_      \`--'/┃ ┃_' ┃   _┃ ┃_    _┃ ┃___/ ┃               ┃ ┃
echo ┃ ┃   \______.'┃_______┃   ┃_____┃      `.____.'   `.___.'    ┃_____┃┃_________┃By zhangbo093┃ ┃
echo ┃ ┃                                                                                                ┃ ┃
echo ┃--------------------------------------------------------------------------------------------------┃
echo------------------------------------------------------------------------------------------------------
echo.
rem 清空进程名,防止使用上次输入的进程名称
set pname=
set /p pname=请输入需要关闭占用服务端口的进程名(直接回车,默认为java.exe):
rem 如果用户未输入,则默认为java.exe
if not defined pname (
    echo 用户未输入进程名,默认为java.exe
    set pname=java.exe
)
echo.
echo 检查%pname%进程开始
rem 根据进程名遍历进程信息
for /f "delims=" %%i in ('tasklist^|findstr "%pname%"') do (
    rem 遍历进程信息获取进程PID
    for /f "tokens=2 delims= " %%b in ("%%i") do (
      rem 记录进程PID
      set pid=%%b
      rem 记录进程占用服务端口信息
      set ports=
      rem 遍历进程PID占用服务端口信息
      for /f "delims=" %%a in ('netstat -nao^|findstr %%b^|findstr "LISTENING"^|find "[::]:0"') do (
            for /f "tokens=2,5 delims= " %%a in ("%%a") do (
                if defined ports (
                  set ports=!ports!、%%a
                )
                if not defined ports (
                  set ports=%%a
                )
            )
      )
      rem 如果占用了服务端口,则提示用户选择是否结束对应进程
      if defined ports (
            set var=
            set /p var=进程名:%pname%,进程PID:!pid!,占用端口:!ports:[::]:=!,是否确认结束此进程?:
            if not defined var (
                echo 用户未选择,默认不处理
            )
            if defined var (
                if /i "!var!" NEQ "Y" (
                  echo 用户选择不处理
                )
                if /i "!var!" NEQ "N" (
                  echo 用户选择结束此进程,开始处理
                  taskkill /pid %%b -t -f
                )
            )
      )
      echo.
    )
)

@pause
cls&goto start1
```

java进程示意图:


默认操作示意图:


选择不结束进程示意图(小写n、大写N均可):


选择结束进程示意图(小写y、大写Y均可):


成品(1CB):

成品地址(免费):「根据进程名关闭占用服务端口的进程20220716.bat」https://www.aliyundrive.com/s/Jxw3GZW7QGC 提取码: pk13
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

zhangbo093 发表于 2022-7-16 23:57

WGT 发表于 2022-7-16 20:24
试了没效果。。。

什么语言?如果找不到进程pid和占用的端口,可以先试试命令,验证一下:
是否能显示进程信息的命令(注意:进程名要写对哦)
tasklist|findstr "java.exe"
进程pid对应端口信息的命令(注意:10086为上面命令结果中的pid)
netstat -nao|findstr 10086|findstr "LISTENING"

zhangbo093 发表于 2022-7-17 00:04

落华无痕 发表于 2022-7-16 19:57
编码UTF8没改成ANSI吧。话说,怎么不是根据占用端口号提示结束对应进程。

假如有5个微服务启动了,那么要输入5次对应端口号才行。这个只输入一次进程名就可以找到5个微服务啦,岂不快哉?
我就是今天启动这几个微服务,明天启动另外几个微服务,又经常停不掉(idea假死),才想办法写了这个批处理程序的。

dork 发表于 2022-7-16 17:40

已阅。。。

裴冰夏 发表于 2022-7-16 17:49

已存 蟹蟹

平淡最真 发表于 2022-7-16 17:56

5-15行已抄走

cn2jp 发表于 2022-7-16 19:02

为什么我把代码另存为bat运行会出错?

zhangbo093 发表于 2022-7-16 19:47

cn2jp 发表于 2022-7-16 19:02
为什么我把代码另存为bat运行会出错?

可否把报错信息发一下呢?或者下载成品试试看呢?一起看看是哪里报错了,谢谢!

落华无痕 发表于 2022-7-16 19:57

zhangbo093 发表于 2022-7-16 19:47
可否把报错信息发一下呢?或者下载成品试试看呢?一起看看是哪里报错了,谢谢!

编码UTF8没改成ANSI吧。话说,怎么不是根据占用端口号提示结束对应进程。

woflant 发表于 2022-7-16 20:11

平淡最真 发表于 2022-7-16 17:56
5-15行已抄走

大佬果然思路清奇{:301_988:}

wkdxz 发表于 2022-7-16 20:19

很实用,谢谢了!

WGT 发表于 2022-7-16 20:24

试了没效果。。。
页: [1] 2 3
查看完整版本: 【批处理】根据进程名关闭占用服务端口的进程(适用于java、php等大部分语言)