跳到主要内容

v1

简介

下载链接(用新不用旧!!!)

image.png

源代码

程序使用 Golang 编写,源代码如下:

package main

import (
"flag"
"fmt"
"os"
"os/exec"
"strings"
)

func getPIDByPort(port string) string {
cmd := exec.Command("netstat", "-a", "-n", "-o")
output, err := cmd.Output()
if err != nil {
fmt.Println("执行命令时发生错误:", err)
return ""
}

lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, fmt.Sprintf(":%s", port)) {
fields := strings.Fields(line)
if len(fields) >= 5 {
return fields[len(fields)-1]
}
}
}

return ""
}

func killProcessByPID(pid string) {
if pid == "" {
fmt.Println("未找到进程")
return
}

cmd := exec.Command("taskkill", "/F", "/PID", pid)
err := cmd.Run()
if err != nil {
fmt.Println("无法结束进程:", err)
return
}

fmt.Println("进程", pid, "已结束")
}

func printCustomUsage() {
fmt.Println("欢迎使用端口清理工具,作者: biuaxia & ChatGPT")
fmt.Println("Usage:")
flag.PrintDefaults()
}

func main() {
var portsList []string

var port string
flag.StringVar(&port, "port", "", "要检查的单个端口号")

var ports string
flag.StringVar(&ports, "ports", "", "要检查的端口号列表,多个端口号以逗号分隔")

flag.Usage = func() {
if flag.NArg() == 0 {
printCustomUsage()
} else {
flag.PrintDefaults()
}
}

flag.Parse()

if port != "" {
portsList = append(portsList, port)
}

if ports != "" {
portsList = append(portsList, strings.Split(ports, ",")...)
}

if len(portsList) == 0 {
printCustomUsage()
os.Exit(1)
}

for _, p := range portsList {
pid := getPIDByPort(p)
if pid != "" {
fmt.Println("端口", p, "被进程 PID:", pid, "所占用")
killProcessByPID(pid) // 结束对应 PID 的进程
fmt.Println("正在为您清理 PID:", pid, "...")
pid = getPIDByPort(p)
if pid != "" {
fmt.Println("端口", p, "清理失败, 建议通过任务管理器查看 PID:", pid)
} else {
fmt.Println("端口", p, "已清理")
}
} else {
fmt.Println("端口", p, "未被使用")
}
}
}