期望的输出:
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 /?
) 没有解释它们的含义,但我找到了以下外部资源:关于cmd - 使用 cmd 标题仅从任务列表中获取 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50555929/