windows - batch - cmd kill process



通過從.BAT查找正在使用的端口來終止進程 (10)

在Windows中,什麼可以查找端口8080並嘗試通過.BAT文件終止正在使用的進程?


使用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

只是為了完成:

我想殺死連接到特定端口的所有進程,但不是進程偵聽

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

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

findstr

  • r用於表達式,c用於精確鏈匹配。
  • [] *用於匹配空格

netstat

  • 一個 - >全部
  • n - >不解決(更快)
  • o - > pid

它的工作原理是netstat打印出源端口,目標端口,然後打印出ESTABLISHED


如果你通過系統,你不能結束任務。 試試這個命令

x:>淨停止http / y


如果有人正在尋找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


打開命令提示符並運行以下命令

 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


查找哪個進程正在偵聽端口: 如何找出在Windows上的端口上偵聽哪個進程?

殺死它:以任何方式編寫Windows .bat文件來殺死進程?


與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.
)

要列出在端口8080上運行的所有進程,請執行以下操作。

netstat -ano | 找到“8080”

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

然後殺死進程運行以下命令

taskkill / F / PID 10612


謝謝大家,只需添加一些進程即可關閉,除非/ 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


這裡有一個讓你開始的命令:

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多次擴展到其他otherCommand ,無論你喜歡什麼。 實際使用中的%variable只能包含單個字母的名稱,例如%V

"tokens=4 delims= "

這可以讓你用空格分割每一行,然後取第四行,並將其填入%variable (在我們的例子中為%%P )。 delims看起來是空的,但是額外的空間實際上很重要。

netstat -a -n -o

運行它並找出答案。 根據命令行幫助,它顯示“顯示所有連接和偵聽端口”,“以數字形式顯示地址和端口號”,以及“顯示與每個連接關聯的擁有進程ID”。 我剛剛使用這些選項,因為有人建議它,它碰巧工作:)

^|

這需要第一個命令或程序( netstat )的輸出並將其傳遞到第二個命令程序( findstr )。 如果您直接在命令行上使用它,而不是使用命令字符串,則可以使用| 而不是^|

findstr :8080

這將過濾所有傳入它的輸出,僅返回包含:8080:8080

TaskKill.exe /PID <value>

這會使用進程ID來殺死正在運行的任務。

%%P instead of %P

這在批處理文件中是必需的。 如果您在命令提示符下執行了此操作,則可以使用%P





kill-process