首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从tasklist命令获取PID

从tasklist命令获取PID
EN

Stack Overflow用户
提问于 2021-08-26 20:07:04
回答 2查看 1.1K关注 0票数 1

我正在使用tasklist向我提供有关在我的Windows上运行的特定服务/进程的信息。

命令:

代码语言:javascript
运行
复制
tasklist /svc /fi "SERVICES eq .Service02"

产出:

代码语言:javascript
运行
复制
Image Name           PID      Services
================== ======== ============================================
app02.exe           15668    .Service02

我在StackOverflow、其他论坛和Windows上搜索了很长一段时间,但我不知道如何获得所需的输出,即:

代码语言:javascript
运行
复制
15668

我成功地完成了一项命令,但并不是真的.

代码语言:javascript
运行
复制
for /f "tokens=1,2 delims= " %A in ('tasklist /svc /fi "SERVICES eq .Service02"') do echo %B

这并没有给我想要的输出-相反,它给了我以下输出:

代码语言:javascript
运行
复制
C:\Users\admin>echo Name
Name

C:\Users\admin>echo ========
========

C:\Users\admin>echo 15668
15668

如果我能做的只是重复第三句话的话。输出就是我所需要的。PID。

因此,我需要一个命令来获取我所提供的服务所使用的进程的名称,并且只返回它的PID。

拜托有人能帮我吗?

编辑:由于@Squashman,我成功地执行了一个新命令:

代码语言:javascript
运行
复制
tasklist /svc /fi "SERVICES eq .Service02" /FO csv /NH
"service02.exe","15668",".Service02"

现在的输出是:

代码语言:javascript
运行
复制
"service02.exe","15668",".Service02"

但我该去哪呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-27 13:53:48

只需使用for /F loop来捕获tasklist命令的CSV输出并提取正确的令牌。

在指挥提示符中:

代码语言:javascript
运行
复制
@for /F "tokens=2 delims=," %P in ('tasklist /SVC /FI "Services eq .Service02" /FO CSV /NH') do @echo %~P

在批处理文件中:

代码语言:javascript
运行
复制
@echo off
for /F "tokens=2 delims=," %%P in ('
    tasklist /SVC /FI "Services eq .Service02" /FO CSV /NH
') do echo %%~P

~-modifier从PID值中移除周围的引号。

票数 2
EN

Stack Overflow用户

发布于 2021-08-29 01:03:42

当然,您可以使用Service可执行文件sc.exe检索PID。

代码语言:javascript
运行
复制
@For /F "Tokens=3" %%G In ('%SystemRoot%\System32\sc.exe QueryEx .Service02 ^| %SystemRoot%\System32\find.exe "PID" 2^>NUL') Do @Set "PID=%%G"

但是,基于your reply in comment,下面是一个简单的示例,向您展示如何在不需要检索PID的情况下执行任务:

代码语言:javascript
运行
复制
@Set "SvcName=.Service02"
@Set "SysDir=%SystemRoot%\System32"
@Rem Stop service if memory usage is greater than or equal to 150 MB
@%SysDir%\tasklist.exe /Fi "Services Eq %SvcName%" /Fi "MemUsage GE 153600" /Fo CSV /NH /Svc | %SysDir%\findstr.exe /I /R ",\"%SvcName%\"$" 1>NUL && (
    %SysDir%\sc.exe Stop %SvcName%
    Rem Add a delay to give the service time to stop
    %SysDir%\timeout.exe /T 5 /NoBreak 1>NUL
    Rem If service state is stopped then start service again
    %SysDir%\sc.exe Query %SvcName% | %SysDir%\findstr.exe /R /C:"STATE  *: 1 " 1>NUL && %SysDir%\sc.exe Start %SvcName%)

可以根据需要调整行7以增加5秒的超时时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68944725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档