搜索删除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 请输入关键词,输入 exit 退出:
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 未找到匹配关键词 [%keyword%] 的 Java 进程
    powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 匹配为空:%keyword%' -Encoding UTF8"
    timeout /t 2 >nul
    goto main_loop
)
echo.
echo ===============================================================================
echo 是否终止以上所有匹配进程? (Y/N):
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 无法结束进程号: %%p(可能已退出或权限不足)
            powershell -NoProfile -Command "Add-Content -Path '%LOGFILE%' -Value '[%DATE% %TIME%] 无法结束进程号: %%p' -Encoding UTF8"
        ) else (
            echo 已成功结束进程号: %%p
            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