如何从Windows命令行的tasklist输出中提取特定字段

14

我在 Windows 命令提示符上运行了以下命令

C:>tasklist /fi "Imagename eq BitTorrent.exe"

其输出结果为

Image Name            PID      Session Name       Session #    Mem Usage
==================  ======== =================   ===========   =========
BitTorrent.exe        6164      Console                   3     24,144K

我需要提取一个字段,即PID,即从上面的输出中获取数字6164。

我该如何实现这个功能? 更一般地说,我如何从Windows命令行上的命令输出中提取一个或多个字段?

3个回答

15

与之前的回答类似,但使用tasklist中的特定开关跳过标题并正确处理图像名称中的空格:

类似于之前的回答,但使用tasklist的特定选项来跳过标题并正确处理图像名称中的空格:

for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq BitTorrent.exe" /fo csv') do @echo %~F

如果直接从命令行运行,则将 %F 替换为 %%F,如果从批处理文件中运行。


所有三个答案对我都有效,但我不理解它们 :( 有人可以解释一下他们的代码片段或者指向“for /f”、“tokens”、“delims”的文档吗? - ashish makani
在括号中运行“command”,然后针对其输出的每一行:使用逗号作为分隔符对其进行分词处理,并将第二个标记放入%变量(%F)中,然后以给定变量值(sans引号,这就是波浪线的用处)运行echo。有关更一般的“for”语法解释(包括“for / f”),只需在命令行中输入“help for”。 - wmz
@ashishmakani 这里是文档链接:https://ss64.com/nt/for_f.html - Zeeshan

10

最简单的方法是使用WMIC:

c:\>wmic process where caption="BitTorrent.exe" get  ProcessId

编辑:由于 WMIC 不包含在 Windows 家庭版中:

for /f "tokens=1,2 delims= " %A in ('tasklist /fi ^"Imagename eq cmd.exe^" ^| find ^"cmd^"') do echo %B

这里使用了标题的CMD。您可以在查找和任务列表参数中更改它。 如果在批处理文件中使用,您需要%%B%%A


2
我无法在这台机器上安装任何东西,只能使用标准的Windows安装程序。 - ashish makani
wmic是Windows的标准命令,除了家庭版...无论如何,我会在我的答案中添加其他方法。 - npocmaka
1
@npocmaka,您在上面的评论中是否犯了一个小错别字?对于9个字段来说,第9个字段不应该是%%I而不是%%H吗? - ashish makani
如果有多个具有相同名称的进程,WMIC无法满足我们的需求... - Raul Chiarella
兄弟,你的命令打印了三行。我怎么只打印第三行? - Raul Chiarella
显示剩余2条评论

3

您可以使用wmic命令而不进行输出过滤:

wmic process where name="BitTorrent.exe" get processid | MORE +1

更新:另一种方法:
@Echo OFF
FOR /F "tokens=2" %%# in ('tasklist /fi "Imagename eq winamp.exe" ^| MORE +3') do (Echo %%#)
Pause&Exit

PS:记得如果应用程序文件名包含空格,您需要正确设置令牌。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接