如何从命令行获取PID,用username和imagename过滤

时间:2011-12-08 18:41:59

标签: windows command-line pid

我需要能够使用命令行从正在运行的进程(cmd.exe)中获取PID。 问题是有两个cmd.exe正在运行。一个是用户名SYSTEM,一个是compUser。有没有办法可以获取compUser cmd.exe的PID?

编辑:这需要进一步解释。 我是从批处理文件中执行此操作的。我在批处理文件中进行的其中一个调用启动了一个永不消亡的cmd.exe。因此杀死cmd.exe很简单:

taskkill /F /IM cmd.exe /FI "username eq compUser"

问题是我所在的批处理文件是由用户名compUser下的另一个cmd.exe实例处理的。我尝试做的是在启动第二个cmd.exe之前从原始cmd.exe获取PID。这样我就可以使用命令:

taskkill /F /IM cmd.exe /FI "username eq compUser" /FI "PID neq [orignal task's PID]"

4 个答案:

答案 0 :(得分:4)

我最终必须这样做的方法是使用:

TASKLIST /NH /FI  "IMAGENAME eq cmd.exe" /FI "username eq compUser"> psid.txt
FOR /F "tokens=2" %%I in (psid.txt ) DO set pIdNotToKill=%%I

在我启动挂起的批处理脚本之前。然后,当我准备杀死悬挂的cmd窗口时:

taskkill /F /IM cmd.exe /FI "PID ne %pIdNotToKill%" /FI "username eq compUser"

可能有更好的方法,但这很有用。

答案 1 :(得分:3)

这将显示用户“compUser”的所有名为“cmd.exe”的进程:

tasklist /FI "IMAGENAME eq cmd.exe" /FI "USERNAME eq compUser"

答案 2 :(得分:3)

我将标题设置为我自己的cmd窗口,其他cmd窗口我调用或运行“start / b”我将其重命名为其他窗口标题名称。接下来,我检测PID,设置MYPID并使用我的其他PID杀死所有其他cmd。

全部在一个文件上,使用超时dalay在其他标签循环中工作。

@(@Title TitleOfMyScript)
for /f "tokens=2" %%a in ('tasklist /fi "imagename eq cmd.exe" /fi "windowtitle eq TitleOfMyScript" /nh') do set MYPID=%%a
taskkill /FI "PID ne %MYPID%" /FI "IMAGENAME eq cmd.exe" /F

答案 3 :(得分:1)

我只想分享我的代码,也许这对某些人有用。它基于jiggawagga的评论,但它可以终止许多过程:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

REM kill old server process
SET pIdNotToKill=
SET pIdFilter=

FOR /F "tokens=2" %%I IN (%SERVER_HOME%\psid.txt) DO (
    IF NOT "%%I"=="No" (
        SET pIdNotToKill=!pIdNotToKill! %%I
        SET pIdFilter=!pIdFilter! /FI "PID ne %%I"
    )
)

IF NOT "!pIdNotToKill!"=="" (
    ECHO Killing all Java processes except%pIdNotToKill%
    ECHO TASKKILL command will be called with the filter%pIdFilter%
    TASKKILL /F /IM java.exe %pIdFilter%
)

DEL %SERVER_HOME%\psid.txt

TASKLIST /NH /FI "IMAGENAME eq java.exe" > %SERVER_HOME%\psid.txt

在我启动服务器进程之前。