搜索删除java进程——bat脚本(win)
搜索删除java进程——bat脚本(win)
该 BAT 脚本的核心作用是:以交互方式按关键词查找并批量终止 Java 进程,并将全过程记录到日志文件中。其功能可概括如下。
一、整体功能概述
- 循环执行的 Java 进程管理工具
- 基于
jps -ml列出所有 Java 进程 - 支持用户输入 关键词 精确/模糊匹配进程启动命令
- 支持 一次性批量强制终止 匹配到的 Java 进程
- 使用 ANSI 颜色 提示不同状态(成功 / 警告 / 错误)
- 所有关键操作都会写入 日志文件
kill_com_log.txt - 用户可随时输入
exit安全退出脚本
二、执行流程拆解
1. 初始化与环境准备
-
关闭命令回显(
@echo off) -
启用延迟变量扩展(
enabledelayedexpansion) -
定义日志文件:
kill_com_log.txt -
检查并启用 Windows 10+ 控制台 ANSI 颜色支持:
- 自动写入注册表
HKCU\Console\VirtualTerminalLevel=1
- 自动写入注册表
2. 主循环(:main_loop)
脚本进入一个 无限循环,每一轮代表一次完整的进程扫描与操作。
3. 显示当前所有 Java 进程
-
使用:
jps -ml -
输出内容包括:
- PID
- 启动命令(main class / jar 路径 + 参数)
-
按序号展示,便于人工查看
-
若未检测到 Java 进程,明确提示
同时记录日志:
[时间] 脚本循环开始
4. 用户输入关键词
- 提示用户输入 关键词
- 输入
exit:- 记录日志
- 正常退出脚本
- 否则进入匹配流程
5. 按关键词过滤 Java 进程
-
通过:
jps -ml | findstr "%keyword%" -
找出启动命令中包含关键词的进程
-
收集信息:
- 匹配数量
foundCount - 所有 PID 列表
PIDS - 进程详细信息
INFO_LIST
- 匹配数量
-
实时输出匹配结果
无匹配时:
- 红色提示未找到
- 写日志
- 短暂等待后回到主循环
6. 二次确认是否终止进程
-
明确询问:
是否终止以上所有匹配进程? (Y/N) -
防止误杀,必须人工确认
7. 批量强制终止进程(确认 Y)
-
使用:
taskkill /PID <pid> /F -
对每个 PID:
- 成功:绿色提示 + 日志
- 失败(权限不足 / 已退出):红色提示 + 日志
-
日志记录终止数量和关键词
8. 取消操作(输入非 Y)
- 不终止任何进程
- 记录用户取消行为及进程信息到日志
9. 循环与退出
-
每轮结束后
pause -
自动回到主循环
-
退出时写入:
[时间] 脚本退出
三、日志内容覆盖范围
日志 kill_com_log.txt 记录了:
- 每次循环开始
- 用户输入的关键词
- 匹配为空的情况
- 用户是否确认或取消
- 每个进程的终止成功 / 失败
- 用户主动退出脚本
具备完整审计能力
四、典型使用场景
-
本地或服务器上:
- 多个 Java 服务 / Spring Boot 应用并行运行
- 需要快速根据 jar 名、端口、模块名批量停服
-
替代手动:
jps → copy PID → taskkill -
适合开发 / 测试 / 运维场景
五、一句话总结
这是一个带颜色提示、日志记录、二次确认的 Java 进程“关键词匹配 + 批量强杀”交互式 BAT 工具,用于安全高效地管理本机 Java 进程。
脚本
@echo off
setlocal enabledelayedexpansion
set "LOGFILE=kill_com_log.txt"
:: 启用 ANSI 颜色(Windows 10+)
reg query HKCU\Console | find "VirtualTerminalLevel" >nul 2>&1
if errorlevel 1 (
reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 /f >nul
)
:main_loop
cls
set "PIDS="
set "INFO_LIST="
echo ===============================================================================
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 脚本循环开始' -Encoding UTF8"
echo 当前所有 Java 进程如下:
echo ===============================================================================
set /a idx=0
for /f "tokens=1,*" %%a in ('jps -ml') do (
set /a idx+=1
set "pid=%%a"
set "cmd=%%b"
echo [!idx!] PID: !pid! 进程启动命令: !cmd!
)
if !idx! EQU 0 (
echo 没有检测到任何 Java 进程
)
echo ===============================================================================
echo.
echo [93m请输入关键词,输入 exit 退出:[0m
set /p keyword=:
if /i "%keyword%"=="exit" (
echo.
echo 用户选择退出,脚本结束。
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 用户主动退出脚本' -Encoding UTF8"
goto end
)
echo.
echo 正在查找包含关键词 [%keyword%] 的 Java 进程...
echo ===============================================================================
setlocal enabledelayedexpansion
set "foundCount=0"
set "PIDS="
set "INFO_LIST="
for /f "tokens=1,*" %%i in ('jps -ml ^| findstr /R /C:"%keyword%"') do (
set /a foundCount+=1
set "pid=%%i"
set "info=%%j"
echo [!foundCount!] PID: !pid! 进程启动命令: !info!
set "PIDS=!PIDS! %%i"
set "INFO_LIST=!INFO_LIST! [进程号=%%i 命令=%%j]"
)
endlocal & set "foundCount=%foundCount%" & set "PIDS=%PIDS%" & set "INFO_LIST=%INFO_LIST%"
if "%foundCount%"=="0" (
echo.
echo [91m未找到匹配关键词 [%keyword%] 的 Java 进程[0m
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 匹配为空:%keyword%' -Encoding UTF8"
timeout /t 2 >nul
goto main_loop
)
echo.
echo ===============================================================================
echo [93m是否终止以上所有匹配进程? (Y/N):[0m
set /p confirm=:
if /i "%confirm%"=="Y" (
echo.
echo 正在终止进程...
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 开始终止匹配关键词 [%keyword%] 的进程,数量:%foundCount%' -Encoding UTF8"
for %%p in (%PIDS%) do (
echo 正在结束进程号: %%p ...
taskkill /PID %%p /F >nul 2>&1
if errorlevel 1 (
echo [91m无法结束进程号: %%p(可能已退出或权限不足)[0m
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 无法结束进程号: %%p' -Encoding UTF8"
) else (
echo [92m已成功结束进程号: %%p[0m
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 成功结束进程号: %%p' -Encoding UTF8"
)
)
echo 所有操作已完成。
) else (
echo.
echo 用户取消操作,未终止任何进程。
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 用户取消终止匹配进程:%INFO_LIST%' -Encoding UTF8"
)
echo.
pause
goto main_loop
:end
echo.
echo 脚本已退出。
powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 脚本退出' -Encoding UTF8"
pause
Comments