使用命令标题从任务列表中仅获取 PID
Get only PID from tasklist using cmd title
期望的输出:
1234
只是 PID。没有别的 - 没有其他字符、数字或符号。
我正在尝试 运行 tasklist
所以它只给我命名或命名进程的 PID。
tasklist | findstr /i "cmd.exe"
是我得到的最接近的结果,但结果太冗长了。我只想要PID号。
将任务列表过滤器运算符的含义描述链接到我的奖励积分 - "eq"、"ne" 等,因为它们不在 the documentation.[=14 中的任何地方=]
使用for /f
解析输出。 PID 是分隔的第 2 列 space。
默认 separator/delmiter 是 space,相邻的 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 has PID(s) 14924,11268,3652
最后一个大概是for /f
自己临时用的
编辑 我的回答迟到。
Ritchie Lawrence 的工具 cmdow 可以完成您的任务。
在 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
只获取命令行上的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:\Test18\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
炮弹 运行。如果他们是 运行 程序,他们的 window 标题通常会改变。
获取 cmd 进程和 PID(Id 字段)非常容易。 window 标题也可用。
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 Usage
========================= ======== ================ =========== ============
cmd.exe 12740 Console 1 3'328 K
cmd.exe 11020 Console 1 3'304 K
除非列宽是固定的,我不会依赖它,否则提取 PID 并不是那么简单,因为图像名称也可以有 SPACEs在里面,所以使用诸如定界符是行不通的。
一种可能的方法是计算第二行到第一行 SPACE 中 =
符号的数量,因此我们知道要截断的字符数删除图像名称,但这需要某种循环(使用 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 /?
) 没有解释它们的含义,但我找到了以下外部资源:
期望的输出:
1234
只是 PID。没有别的 - 没有其他字符、数字或符号。
我正在尝试 运行 tasklist
所以它只给我命名或命名进程的 PID。
tasklist | findstr /i "cmd.exe"
是我得到的最接近的结果,但结果太冗长了。我只想要PID号。
将任务列表过滤器运算符的含义描述链接到我的奖励积分 - "eq"、"ne" 等,因为它们不在 the documentation.[=14 中的任何地方=]
使用for /f
解析输出。 PID 是分隔的第 2 列 space。
默认 separator/delmiter 是 space,相邻的 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 has PID(s) 14924,11268,3652
最后一个大概是for /f
自己临时用的
编辑 我的回答迟到。
Ritchie Lawrence 的工具 cmdow 可以完成您的任务。
在 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
只获取命令行上的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:\Test18\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
炮弹 运行。如果他们是 运行 程序,他们的 window 标题通常会改变。
获取 cmd 进程和 PID(Id 字段)非常容易。 window 标题也可用。
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 Usage ========================= ======== ================ =========== ============ cmd.exe 12740 Console 1 3'328 K cmd.exe 11020 Console 1 3'304 K
除非列宽是固定的,我不会依赖它,否则提取 PID 并不是那么简单,因为图像名称也可以有 SPACEs在里面,所以使用诸如定界符是行不通的。
一种可能的方法是计算第二行到第一行 SPACE 中 =
符号的数量,因此我们知道要截断的字符数删除图像名称,但这需要某种循环(使用 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 /?
) 没有解释它们的含义,但我找到了以下外部资源: