使用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
tasklist/?
)没有解释它们的含义,但我找到了以下外部资源:
中,“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
,检查是否列出了您想要的任务,然后依次添加一个筛选选项并再次进行检查……详细解释如下: