我已经多次回顾这个过程。我必须在 Windows 机器上终止一个进程,而我只知道它的端口。通常步骤如下:通过查看端口找到 PID(例如端口 8084)列出在端口上运行的进程
netstat -a -o -n
然后使用以下命令终止该端口上的进程
taskkill /F /PID <pid>
是否有像管道或类似的东西可以在 Windows 操作系统上用来在一行中运行此命令!?
答案1
我可以在 Windows 操作系统上使用什么类似管道或类似的东西来在一行中运行此命令吗?
和 PowerShell都cmd.exe
支持从一个命令到另一个命令的管道。在 PowerShell 中,类似这样的操作(这应该在命令行上的一行中,或者在脚本中使用 ` 来转义换行符):
netstat -ano
| select -skip 4
| % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}}
| ? {$_.Fields[1] -match '15120$'}
| % {taskkill /F /PID $_.Fields[4] }
在哪里:
Select -skip 4
跳过前四个标题行。 (Select
是Select-Object
用于执行 SQL SELECT 类对象项目的缩写。%
是 的缩写Foreach-Object
,它对管道中的每个对象()执行一个脚本块$_
,并将脚本块的结果输出到管道。这里,它首先将输入分解为一个字段数组,然后创建一个具有两个属性的新对象:Original
字符串netstat
和Fields
刚刚创建的数组。?
是Where-Object
基于脚本块结果进行过滤的缩写。此处在第二个字段的末尾匹配正则表达式(所有 PowerShell 容器都以零为基础)。
(除最后一个元素外所有测试均已完成:我不想开始终止进程:-))。
实际上,我会简化这一点,例如,只返回 0 或第一个的 PID foreach
(这将被设计为忽略标题)并在调用之前过滤不为零的值taskkill
。这样输入起来会更快,但如果不了解 PowerShell,就很难理解。
答案2
打开命令提示符并执行:
for /f "tokens=5" %a in ('netstat -aon | find "8080"') do taskkill /f /pid %a
如果您想在批处理文件中执行此操作,请%a
用%%a
和|
替换^|
。
如果您只想杀死正在监听该端口的那个,请将其附加| find "LISTENING"
到另一个查找的末尾。
答案3
以下是您可以使用的一个便捷函数:
https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1
killp 8081