我需要能够使用命令行从正在运行的进程(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]"
答案 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
在我启动服务器进程之前。