windows 高效解决端口占用:一键Kill脚本

前言

在日常开发中,我们经常遇到这样的场景:

❗ “端口 3000 已被占用,请关闭后再试…”

于是你打开命令行,输入:

netstat -ano | findstr :3000
taskkill /PID 12345 /F

—— 但经常忘记命令,或者 PID 输错、权限不够、杀错进程,甚至还要去查语法。

更糟的是,当在调试多个项目、频繁启停服务时,手动查杀端口成了重复、低效、易错的体力活

于是,我下决定:

“与其每次都查命令,不如写个工具,一键解决!”

准备工作

确认路径:建议统一放在一个目录,比如:

C:\Tools\PortKiller\

创建文件夹

mkdir C:\Tools\PortKiller

打开记事本或 VSCode,准备写脚本

第一步:创建 PowerShell 脚本 kill-port.ps1

复制以下完整脚本

保存注意事项

  • 文件名:kill-port.ps1
  • 修改日志目录(可自定义位置)
  • 编码:UTF-8(带BOM)或 ANSI(避免中文乱码)
# kill-port.ps1
param(
    [string[]]$Ports,
    [switch]$Force
)

# 🔧 固定日志目录
$LogDir = "C:\Tools\PortKiller\logs"
$LogFile = "$LogDir\kill-port.log"

# ✅ 自动创建日志目录(如果不存在)
if (-not (Test-Path $LogDir)) {
    New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
    Write-Host "[+] 日志目录已创建: $LogDir" -ForegroundColor DarkGray
}

function Write-Log {
    param($msg)
    "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg" | Out-File $LogFile -Append -Encoding UTF8
}

function Confirm-Kill {
    param($processes)
    if ($Force) { return $true }

    Write-Host "`n[?] 发现以下进程:" -ForegroundColor Yellow
    $i = 1
    foreach ($p in $processes) {
        Write-Host "  $i. PID: $($p.PID) | 名称: $($p.Name) | 路径: $($p.Path)" -ForegroundColor White
        $i++
    }
    Write-Host ""
    $choice = Read-Host "是否终止以上 $($processes.Count) 个进程? (Y/N)" 
    return ($choice -match '^[Yy]$')
}

function Kill-Port {
    param($port)
    try {
        $connections = Get-NetTCPConnection -LocalPort $port -ErrorAction Stop
    } catch {
        Write-Host "[✓] 端口 $port 未被占用" -ForegroundColor Green
        return
    }

    $procs = @()
    foreach ($conn in $connections) {
        $procId = $conn.OwningProcess
        $proc = Get-Process -Id $procId -ErrorAction SilentlyContinue
        if ($proc) {
            $procs += [PSCustomObject]@{
                PID  = $procId
                Name = $proc.ProcessName
                Path = $proc.Path
            }
        }
    }

    $uniqueProcs = $procs | Sort-Object PID -Unique
    if ($uniqueProcs.Count -eq 0) {
        Write-Host "[!] 端口 $port 占用进程信息获取失败" -ForegroundColor Red
        return
    }

    if (-not (Confirm-Kill $uniqueProcs)) {
        Write-Host "[!] 已跳过端口 $port" -ForegroundColor Gray
        return
    }

    foreach ($p in $uniqueProcs) {
        $msg = "正在终止 PID $($p.PID) ( $($p.Name) ) ..."
        Write-Host $msg -ForegroundColor Magenta -NoNewline
        try {
            Stop-Process -Id $p.PID -Force -ErrorAction Stop
            Write-Host " ✅" -ForegroundColor Green
            Write-Log "KILLED | Port: $port | PID: $($p.PID) | Name: $($p.Name)"
        } catch {
            $errMsg = $_.Exception.Message
            Write-Host " ❌ $errMsg" -ForegroundColor Red
            Write-Log "FAILED | Port: $port | PID: $($p.PID) | Error: $errMsg"
        }
    }
}

# ===== 主程序开始 =====
do {
    Clear-Host  # 可选:每次循环清屏,界面更干净
    Write-Host "=== 🚀 智能端口杀手 ===" -ForegroundColor Cyan

    if (-not $Ports) {
        $input = Read-Host "请输入端口号(多个用空格分隔,如 3000 8080)"
        $Ports = $input -split '\s+' | Where-Object { $_ -match '^\d+$' }
    }

    if ($Ports.Count -eq 0) {
        Write-Host "[!] 未输入有效端口号" -ForegroundColor Red
        Start-Sleep -Seconds 2
        continue  # 重新开始循环
    }

    foreach ($port in $Ports) {
        Write-Host "`n[+] 正在检查端口: $port" -ForegroundColor Blue
        Kill-Port $port
    }

    Write-Host "`n=== 🎯 操作完成 ===" -ForegroundColor Cyan

    # ========== 新增:循环菜单 ==========
    Write-Host ""
    Write-Host "请选择下一步操作:" -ForegroundColor Yellow
    Write-Host "  1. 退出"
    Write-Host "  2. 继续查杀其他端口"
    Write-Host ""

    $choice = Read-Host "请输入选择 (1 或 2)"
    if ($choice -eq '1') {
        Write-Host "`n感谢使用,再见!👋" -ForegroundColor Green
        break  # 退出循环
    } elseif ($choice -eq '2') {
        $Ports = $null  # 清空端口,下次循环重新输入
        continue        # 继续下一轮
    } else {
        Write-Host "[!] 无效选择,默认继续..." -ForegroundColor Red
        Start-Sleep -Seconds 1
        $Ports = $null
        continue
    }

} while ($true)  # 无限循环,直到用户选择退出

第二步:创建快捷方式(带参数,推荐方式)

创建快捷方式

1、在桌面或文件夹 → 右键 → 新建 → 快捷方式

2、在“请键入项目的位置”中,粘贴:

powershell.exe -ExecutionPolicy Bypass -File "C:\Tools\PortKiller\kill-port.ps1"

3、点击 “下一步”

4、输入名称 PortKiller (可自定义)

5、点击 “完成”

设置“以管理员身份运行”

右键刚创建的快捷方式 → 属性 → 快捷方式 → 高级

勾选 ”用管理员身份运行“

创建其他常用快捷方式(可选)

名称目标命令
杀端口8080powershell.exe -ExecutionPolicy Bypass -File "C:\Tools\PortKiller\kill-port.ps1" -Ports 8080
强制杀3000powershell.exe -ExecutionPolicy Bypass -File "C:\Tools\PortKiller\kill-port.ps1" -Ports 3000 -Force
杀3000和8080powershell.exe -ExecutionPolicy Bypass -File "C:\Tools\PortKiller\kill-port.ps1" -Ports 3000,8080

测试运行

双击创建的快捷方式

出现power shell界面 → 输入需要关闭的进程相对应的端口

查看日志

打开:

C:\Tools\PortKiller\logs\kill-port.log

应该能看到操作记录!

清理与维护

  • 日志文件会自动增长,定期可手动清空或删除
  • 脚本可随时用记事本修改(比如改默认端口、加新功能)
  • 快捷方式可拖到桌面、任务栏、开始菜单,随用随点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值