【问题标题】:how to get PID from command line filtered by username and imagename如何从通过用户名和图像名过滤的命令行获取 PID
【发布时间】:2012-01-16 04:22:43
【问题描述】:

我需要能够使用命令行从正在运行的进程 (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]"

【问题讨论】:

    标签: windows command-line pid


    【解决方案1】:

    我最终不得不这样做的方式是使用:

    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"
    

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

    【讨论】:

    • @FOR /F "usebackq tokens=2" %%I in (`TASKLIST /NH /FI "imagename eq tomcatDL.exe" /FI "username eq SYSTEM"`) DO set PID=%%I
    【解决方案2】:

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

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

    【讨论】:

    • 这不是我真正需要的
    【解决方案3】:

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

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

    @(@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
    

    【讨论】:

      【解决方案4】:

      我只想分享我的一段代码,也许它对某人有用。它基于 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
      

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

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 2021-08-19
        • 2010-11-09
        相关资源
        最近更新 更多