cmd - 使用 cmd 标题仅从任务列表中获取 PID

标签 cmd title pid tasklist

期望的输出:

1234

只是PID。没有别的 - 没有其他字符、数字或符号。

我正在尝试运行 tasklist 所以它只给我一个命名或标题进程的 PID。
tasklist | findstr /i "cmd.exe" 是我得到的最接近的,但结果太冗长了。我只想要PID号。

将任务列表过滤器运算符的含义描述与我联系起来的奖励积分 - “eq”、“ne”等,因为它们不在 the documentation 中的任何地方。

最佳答案

tasklist 的难点在于它的默认输出格式。例如,当命令行:

tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running"

被执行,我们得到:

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
cmd.exe                      12740 Console                    1      3'328 K
cmd.exe                      11020 Console                    1      3'304 K


除非列宽是固定的(我不会依赖),否则提取 PID 并不是那么简单,因为图像名称中也可能包含空格,因此使用诸如分隔符之类的方法是行不通的。
一种可能的方法是计算第二行中 = 符号的数量,直到第一个空格,所以我们知道要截断图像名称的字符数,但这需要某种循环(使用 goto ),所以性能可能很差。

但是,还有其他输出格式可用于 tasklist 。命令行:

tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV

导致此输出:

"Image Name","PID","Session Name","Session#","Mem Usage"
"cmd.exe","12740","Console","1","3'328 K"
"cmd.exe","11020","Console","1","3'304 K"


现在很容易提取PID:

@echo off
for /F "delims=" %%R in ('
    tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV /NH
') do (
    set "FLAG1=" & set "FLAG2="
    for %%C in (%%R) do (
        if defined FLAG1 (
            if not defined FLAG2 (
                echo %%~C
            )
            set "FLAG2=#"
        )
        set "FLAG1=#"
    )
)

以下命令行使用另一种输出格式:

tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO LIST

导致此输出:

Image Name:   cmd.exe
PID:          12740
Session Name: Console
Session#:     1
Mem Usage:    3'328 K

Image Name:   cmd.exe
PID:          11020
Session Name: Console
Session#:     1
Mem Usage:    3'304 K


有了这个,获得所需的输出就更简单了:

@echo off
for /F "tokens=2" %%K in ('
   tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO LIST ^| findstr /B "PID:"
') do (
   echo %%K
)

顺便说一下,对于过滤器选项 /FI ,有以下运算符可用:
  • eq -- 等于;
  • ne -- 不等于;
  • gt -- 大于;
  • lt -- 小于;
  • ge -- 大于或等于;
  • le -- 小于或等于;

  • Microsoft 文档以及帮助消息 ( tasklist /? ) 没有解释它们的含义,但我找到了以下外部资源:
  • Managing Windows Programs from the Command Line: Tasklist
  • Microsoft DOS tasklist command
  • 关于cmd - 使用 cmd 标题仅从任务列表中获取 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50555929/

    相关文章:

    windows - psql shell 使用代码页 850,windows 使用 1252。如何解决更改控制台代码页?

    internet-explorer - IE 选项标题在所选上方不起作用

    html - 如何在 <a href 中的标题属性中显示一些文本粗体

    HTML 标题显示为纯文本而不是标题

    linux - 后台任务的 PID 与使用 ps 列出的任务 PID 不同

    字符编码 C 和瑞典语 åöä

    file - CMDExec如果存在则停止

    C++ 使用带任务列表的命令提示符扫描进程 ID

    elixir - 获取场景组件/场景的 PID

    cmd - 在 Visual Studio Code 终端中打开 CMD