通过查找.BAT中使用的端口来终止进程

时间:2011-06-01 15:51:31

标签: windows batch-file process kill-process

在Windows中,什么可以查找端口8080并尝试通过.BAT文件终止它正在使用的进程?

15 个答案:

答案 0 :(得分:192)

打开命令提示符并运行以下命令

 C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000      0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116

,这里3116是进程ID

答案 1 :(得分:135)

这是一个让你入门的命令:

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P

如果您对批处理文件有信心,请删除@ECHO

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P

请注意,您可能需要针对不同的操作系统稍微更改一下。例如,在Windows 7上,您可能需要tokens=5而不是tokens=4

如何运作

FOR /F ... %variable IN ('command') DO otherCommand %variable...

这使您可以执行command,并循环其输出。每一行都会被填充到%variable中,并且可以随时随地在otherCommand中展开,无论您喜欢什么。实际使用中的%variable只能使用单个字母的名称,例如%V

"tokens=4 delims= "

这允许您按空格分割每一行,并取出该行中的第4个块,并将其填入%variable(在我们的例子中,%%P)。 delims看起来是空的,但额外的空间实际上很重要。

netstat -a -n -o

运行它然后找出答案。根据命令行帮助,它“显示所有连接和侦听端口。”,“以数字形式显示地址和端口号。”和“显示与每个连接关联的拥有进程ID”。我只是使用了这些选项,因为其他人建议它,它碰巧工作:)

^|

这将获取第一个命令或程序(netstat)的输出,并将其传递给第二个命令程序(findstr)。如果您直接在命令行中使用它,而不是在命令字符串中,则可以使用|而不是^|

findstr :8080

这会过滤传递给它的任何输出,只返回包含:8080的行。

TaskKill.exe /PID <value>

这会使用进程ID终止正在运行的任务。

%%P instead of %P

批处理文件中需要这样做。如果您在命令提示符下执行此操作,则可以使用%P代替。

答案 2 :(得分:51)

要在命令行上查找特定进程,请使用以下命令:8080是进程

使用的端口
netstat -ano | findstr 8080

杀死进程使用下面命令21424是进程ID

taskkill /pid 21424 /F 

答案 3 :(得分:19)

使用Merlyn的解决方案导致其他应用程序像firefox一样被杀死。 这些进程使用相同的端口,但不是作为监听器:

例如:

netstat -a -n -o | findstr :8085
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       6568
  TCP    127.0.0.1:49616        127.0.0.1:8085         TIME_WAIT       0
  TCP    127.0.0.1:49618        127.0.0.1:8085         TIME_WAIT       0

因此,可以通过向findstr添加“LISTENING”来排除这些,如下所示:

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

答案 4 :(得分:16)

要列出在端口8080上运行的所有进程,请执行以下操作。

  

netstat -ano |找到&#34; 8080&#34;

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

TCP    [::]:8080              [::]:0                 LISTENING       10612

然后杀死进程运行以下命令

  

taskkill / F / PID 10612

答案 5 :(得分:13)

谢谢大家,只是添加一些进程不会关闭,除非/ F强制开关也与TaskKill一起发送。 使用/ T开关时,过程的所有辅助线程都将关闭。

C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^|
 findstr :2002') DO TaskKill.exe /PID %P /T /F

对于服务,有必要获取服务的名称并执行:

  

sc停止ServiceName

答案 6 :(得分:3)

答案 7 :(得分:2)

刚刚完成:

我想杀死连接到特定端口但不是进程监听的所有进程

端口9001的命令(在cmd shell中)是:

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

<强> FINDSTR

  • r用于表达式,c用于精确链匹配。
  • [] *用于匹配空格

<强> netstat的

  • a - &gt;所有
  • n - &gt;不解决(更快)
  • o - &gt; PID

它的工作原理是因为netstat打印出源端口然后打印出目标端口,然后打印出ESTABLISHED

答案 8 :(得分:1)

如果要杀死正在侦听端口8080的进程,可以使用PowerShell。只需将Get-NetTCPConnection cmdlet与Stop-Process结合使用。

经过测试并且应该在Windows 10或Windows Server 2016上使用PowerShell 5.但是,我想它应该适用于安装了PowerShell 5的旧版Windows。

以下是一个例子:

PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

答案 9 :(得分:1)

使用以下内容创建了一个bat文件,它接受端口号的输入

@ECHO ON
set /p portid=Enter the Port to be killed: 
echo %portid%                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

最后单击“ Enter”退出。

答案 10 :(得分:0)

与Merlyn的回应类似,但是这个也处理了这些案例:

  • 端口号实际上是另一个较长端口的左子串 你不想要的号码。你想搜索一个 准确端口号,这样您就不会杀死随机,无辜的进程!
  • 脚本代码需要能够运行多次并且每次都是正确的,而不是显示更旧,不正确 答案。

这是:

set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
  taskkill /PID %serverPid%
) else (
  rem echo Server is not running.
)

答案 11 :(得分:0)

步骤:

  1. 转到 apache tomcat 服务器的conf文件夹。在我的情况下,它apache-tomcat-7.0.61\conf,因为我正在使用apache-tomcat-7.0.61

  2. 打开server.xml并根据需要将端口号从8080更改为任何其他端口。例如:8081,8082,8087等

  3. 现在转到bin文件夹并运行shutdown.bat

  4. 现在通过eclipse重启服务器。

  5. 现在您的项目可以正常运行。

答案 12 :(得分:0)

如果有人在寻找Powershell脚本:

function Search-And-Destroy
{
    param ( [Parameter(Mandatory=$true)][string]$port )
    $lines = netstat -a -o -n | findstr $port
    $ports = @()

    ForEach($line In $lines)
    {
        $res = $($lines -split '\s+')
        $ports += $res[5]
    }

    $ports = $ports | select -uniq

    ForEach($port In $ports)
    {
        echo $(taskkill /F /PID $port)
    }
}

此函数基本上执行上述函数的功能,但它采用Powershell脚本格式,因此您可以将其添加到Powershell配置文件中。要查找您的个人资料的位置,请转到powershell并输入echo $profile

答案 13 :(得分:0)

将其粘贴到命令行

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)

如果您想在批处理%%P而不是%P

中使用它

答案 14 :(得分:0)

如果您通过系统无法结束任务。试试这个命令

X产品:&gt;净停止http / y