hudada-cli
Version:
专为程序员准备的本地文档搜索,快捷开发工具
3 lines (2 loc) • 1.52 kB
JavaScript
import{exec as o}from"child_process";import{promisify as t}from"util";import n from"chalk";const e=t(o);async function r(o){try{if(!o||isNaN(Number(o)))return void console.error(n.red("请提供有效的端口号"));console.log(n.cyan(`正在查找使用端口 ${o} 的进程...`));const{stdout:t}=await e(`netstat -ano | findstr :${o}`,{encoding:"utf8"});if(!t.trim())return void console.log(n.yellow(`未找到使用端口 ${o} 的进程`));const r=await async function(o){const t=new Set,n=[],r=o.split("\n");for(const o of r){const r=o.trim().split(/\s+/);if(r.length>=5){const o=r[4];if(o&&!t.has(o)&&/^\d+$/.test(o)){t.add(o);try{const{stdout:t}=await e(`tasklist /FI "PID eq ${o}" /FO CSV /NH`,{encoding:"utf8"}),r=t.split(",")[0].replace(/"/g,"").trim();r&&n.push({pid:o,name:r})}catch(o){}}}}return n}(t);if(0===r.length)return void console.log(n.yellow(`未找到使用端口 ${o} 的进程`));console.log(n.cyan("\n找到以下进程:"));for(const o of r)console.log(n.gray(`PID: ${o.pid}\t进程名: ${o.name}`));for(const o of r)if("0"!==o.pid&&"4"!==o.pid)try{await e(`taskkill /F /PID ${o.pid}`,{encoding:"utf8"}),console.log(n.green(`✓ 已终止进程 ${o.pid} (${o.name})`))}catch(t){const e=t;console.error(n.red(`× 终止进程 ${o.pid} 失败`)),e.stderr&&console.error(n.gray(e.stderr))}else console.log(n.yellow(`跳过系统进程 ${o.pid} (${o.name})`));console.log(n.green(`\n端口 ${o} 已释放`))}catch(o){console.error(n.red("操作失败:"),o)}}export{r as killPort};