使用cmd title从任务列表中仅获取PID

使用cmd title从任务列表中仅获取PID,cmd,title,pid,tasklist,Cmd,Title,Pid,Tasklist,期望输出: 1234 只是PID。没有其他内容-没有其他字符、数字或符号 我正在尝试运行任务列表,因此它只提供已命名或已命名进程的PID tasklist | findstr/i“cmd.exe”是我得到的最接近的,但是结果太冗长了。我只想要PID号 将任务列表筛选器运算符的含义的描述链接到我的奖励点——“eq”、“ne”等,因为它们不在任何位置。使用for/f解析输出。PID是分隔的第二列空间。 默认的分隔符/三角形是空间,相邻的delims作为一个 因此,这个示例输出: > task

期望输出:

1234
只是PID。没有其他内容-没有其他字符、数字或符号

我正在尝试运行
任务列表
,因此它只提供已命名或已命名进程的PID

tasklist | findstr/i“cmd.exe”
是我得到的最接近的,但是结果太冗长了。我只想要PID号


将任务列表筛选器运算符的含义的描述链接到我的奖励点——“eq”、“ne”等,因为它们不在任何位置。

使用
for/f
解析输出。PID是分隔的第二列空间。 默认的分隔符/三角形是空间,相邻的delims作为一个

因此,这个示例输出:

> tasklist | findstr /i "cmd.exe"
cmd.exe                      14924 Console                    9         6.008 K
在cmd行上解析

for /f "tokens=2" %A in ('tasklist ^| findstr /i "cmd.exe" 2^>NUL') do @Set "PID=%A"
或批量:

@Echo off & SetLocal EnableDelayedExpansion
set "PID="
for /f "tokens=2" %%A in ('tasklist ^| findstr /i "cmd.exe" 2^>NUL') do @Set "PID=!PID!,%%A"
if defined PID Echo cmd.exe has PID(s) %PID:~1%
cmd.exe的PID为14924112683652

最后一个可能是
为/f
本身使用的临时值


编辑延迟添加我的答案。 Ritchie Lawrence提供的工具可以完成您的任务

在firefox中打开此问题:

> cmdow.exe "get only PID from task*" /f
Handle  Lev Pid -Window status- Image    Caption
0x0103DE 1 9532 Max Ina Ena Vis firefox  Get only PID from tasklist using cmd title - Stack Overflow - Mozilla Firefox
仅获取cmd行上的PID

> for /f "tokens=3" %A in ('cmdow.exe "get only PID from task*" /B /F') Do @Echo:%A
9532
在批处理文件中,将百分比符号加倍
%%a

使用
start
运行另一个具有指定标题的cmd.exe的演示:

:: Q:\Test\2018\05\27\SO_50555929_2.cmd
@Echo off
set "MyTitle=This is a quite long title to distinguish from other"
start "%MyTitle%" cmd.exe /k cmdow.exe @ /F

:: wait to get other cmd instance get started
timeout /t 3 >NUL

set "PID="
for /F "tokens=3" %%A in ('cmdow.exe "%MyTitle%*"') do set "PID=%%A"
if defined PID Echo %PID%

我不知道你在期待什么。可能有几个
cmd
shell正在运行。如果他们正在运行一个程序,他们的窗口标题通常会改变

获取cmd进程和PID(Id字段)非常容易。窗口标题也可用

PS C:\src\t\s1> Get-Process | Where-Object { $_.ProcessName -eq 'cmd' }

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    152      15    10280      16432      10.80   2808   1 cmd
    153      13     8472      12220       3.68   7232   1 cmd

PS C:\src\t\s1> Get-Process | Where-Object { $_.ProcessName -eq 'cmd' } | ForEach-Object { $_.MainWindowTitle }
cmd.exe
dirlist.bat (C:\src\t) - VIM
只显示PID是很容易的。但是,你想要哪一个

PS C:\src\t\s1> Get-Process | Where-Object { $_.ProcessName -eq 'cmd' } | ForEach-Object { $_.Id }
2808
7232

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

tasklist/FI“ImageName eq cmd.exe”/FI“Status eq Running”
执行后,我们得到:

Image Name PID Session Name Session#Mem用法
========================= ======== ================ =========== ============
cmd.exe 12740控制台1 3'328 K
cmd.exe 11020控制台1 3'304 K
除非列宽是固定的(我不依赖列宽),否则提取PID就不是那么简单了,因为图像名称中也可能有空格,所以使用诸如分隔符之类的方法是行不通的。
一种可能的方法是将第二行中的
=
-符号数一直计算到第一个空格,这样我们就知道要删除图像名需要截断的字符数,但这需要某种循环(使用
goto
),因此性能可能相当差

但是,
任务列表
还有其他输出格式可用。命令行:

tasklist/FI“ImageName eq cmd.exe”/FI“Status eq Running”/FO CSV
此输出中的结果:

“映像名”、“PID”、“会话名”、“会话#”、“内存使用”
“cmd.exe”、“12740”、“控制台”、“1”、“3'328K”
“cmd.exe”、“11020”、“控制台”、“1”、“3'304K”
现在很容易提取PID:

@echo关闭
对于/F“delims=”%%R in('
任务列表/FI“ImageName eq cmd.exe”/FI“状态eq Running”/FO CSV/NH
""做"(
set“FLAG1=”&set“FLAG2=”
对于%%C in(%%R)do(
如果定义为FLAG1(
如果未定义,则标记2(
回声%%~C
)
设置“FLAG2=#”
)
设置“FLAG1=#”
)
)
以下命令行使用另一种输出格式:

tasklist/FI“ImageName eq cmd.exe”/FI“Status eq Running”/FO LIST
产生这种输出:

图像名称:cmd.exe
PID:12740
会话名称:控制台
课时#:1
内存使用量:3'328 K
图像名称:cmd.exe
PID:11020
会话名称:控制台
课时#:1
内存使用:3'304 K
这样,获得所需输出就更简单了:

1234
@echo关闭
对于/F“令牌=2”%%K英寸('
任务列表/FI“ImageName eq cmd.exe”/FI“状态eq Running”/FO列表^findstr/B“PID:”
""做"(
回声%%K
)
顺便说一下,对于过滤器选项
/FI
,有以下可用的运算符:

  • eq
    ——等于
  • ne
    ——不等于
  • gt
    ——大于
  • lt
    ——小于
  • ge
    ——大于或等于
  • le
    ——小于或等于
Microsoft文档以及帮助消息(
tasklist/?
)没有解释它们的含义,但我找到了以下外部资源:


这两个都不是我想要的。在Admin CMD:
中,“PS”不被识别为内部或外部命令
在Admin PS:
Get Process:找不到接受参数“Get Process”的位置参数
计划使用带标题的CMD窗口,如
TITLE test
,当你说“title”时,听起来像是指“Image name”(即blah.exe)。另外,该命令从
Get Process
开始,而不是
PS
“Title”表示窗口顶部系统栏中的文本。它不是可执行映像名称<代码>(获取进程)|其中对象{$null-ne$\.MainWindowTitle-和''-ne$\.MainWindowTitle}}{$\.MainWindowTitle}
$tasklist/FI“ImageName eq cmd.exe”/FI“Status eq Running”/FO CSV
信息:没有运行符合指定条件的任务。和
tasklist/?
像文档一样显示过滤器选项,但都没有显示“eq”、“ge”、“le”等的含义。这就是我要问的。请看我的编辑——现在已经解释了运算符。关于您提到的返回消息(
INFO:
):键入不带任何筛选选项的
tasklist
,检查是否列出了您想要的任务,然后依次添加一个筛选选项并再次进行检查……详细解释如下: