从任务列表命令获取 PID
Get PID from tasklist command
我正在使用任务列表为我提供有关 Windows 服务器上特定 service/proccess 运行 的信息。
命令:
tasklist /svc /fi "SERVICES eq .Service02"
输出:
Image Name PID Services
================== ======== ============================================
app02.exe 15668 .Service02
我现在在 Whosebug、其他论坛以及 Windows 文档上搜索了很长时间,但我不知道如何获得所需的输出,即:
15668
我设法执行了一个有效但实际上无效的命令...
for /f "tokens=1,2 delims= " %A in ('tasklist /svc /fi "SERVICES eq .Service02"') do echo %B
这没有给我想要的输出 - 相反,它给了我以下输出:
C:\Users\admin>echo Name
Name
C:\Users\admin>echo ========
========
C:\Users\admin>echo 15668
15668
如果我只能做一些只呼应第三行的事情。输出正是我所需要的。 PID.
所以,我需要一个命令来获取我提供的服务正在使用的进程的名称,并且 return 我只需要它的 PID。
拜托,有人可以帮助我吗?
编辑:感谢@Squashman,我设法执行了一个新命令:
tasklist /svc /fi "SERVICES eq .Service02" /FO csv /NH
"service02.exe","15668",".Service02"
现在输出是:
"service02.exe","15668",".Service02"
但是我从这里去哪里呢?
只需使用 for /F
loop 捕获 tasklist
命令的 CSV 输出并提取正确的标记。
在命令提示符中:
@for /F "tokens=2 delims=," %P in ('tasklist /SVC /FI "Services eq .Service02" /FO CSV /NH') do @echo %~P
在批处理文件中:
@echo off
for /F "tokens=2 delims=," %%P in ('
tasklist /SVC /FI "Services eq .Service02" /FO CSV /NH
') do echo %%~P
~
-modifier 删除了 PID 值周围的引号。
您当然可以使用服务控制可执行文件检索 PID,sc.exe
而不是。
@For /F "Tokens=3" %%G In ('%SystemRoot%\System32\sc.exe QueryEx .Service02 ^| %SystemRoot%\System32\find.exe "PID" 2^>NUL') Do @Set "PID=%%G"
但是,基于 ,这里有一个简单的示例,向您展示如何在不需要检索 PID 的情况下执行任务:
@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
秒增加。
我正在使用任务列表为我提供有关 Windows 服务器上特定 service/proccess 运行 的信息。
命令:
tasklist /svc /fi "SERVICES eq .Service02"
输出:
Image Name PID Services
================== ======== ============================================
app02.exe 15668 .Service02
我现在在 Whosebug、其他论坛以及 Windows 文档上搜索了很长时间,但我不知道如何获得所需的输出,即:
15668
我设法执行了一个有效但实际上无效的命令...
for /f "tokens=1,2 delims= " %A in ('tasklist /svc /fi "SERVICES eq .Service02"') do echo %B
这没有给我想要的输出 - 相反,它给了我以下输出:
C:\Users\admin>echo Name
Name
C:\Users\admin>echo ========
========
C:\Users\admin>echo 15668
15668
如果我只能做一些只呼应第三行的事情。输出正是我所需要的。 PID.
所以,我需要一个命令来获取我提供的服务正在使用的进程的名称,并且 return 我只需要它的 PID。
拜托,有人可以帮助我吗?
编辑:感谢@Squashman,我设法执行了一个新命令:
tasklist /svc /fi "SERVICES eq .Service02" /FO csv /NH
"service02.exe","15668",".Service02"
现在输出是:
"service02.exe","15668",".Service02"
但是我从这里去哪里呢?
只需使用 for /F
loop 捕获 tasklist
命令的 CSV 输出并提取正确的标记。
在命令提示符中:
@for /F "tokens=2 delims=," %P in ('tasklist /SVC /FI "Services eq .Service02" /FO CSV /NH') do @echo %~P
在批处理文件中:
@echo off
for /F "tokens=2 delims=," %%P in ('
tasklist /SVC /FI "Services eq .Service02" /FO CSV /NH
') do echo %%~P
~
-modifier 删除了 PID 值周围的引号。
您当然可以使用服务控制可执行文件检索 PID,sc.exe
而不是。
@For /F "Tokens=3" %%G In ('%SystemRoot%\System32\sc.exe QueryEx .Service02 ^| %SystemRoot%\System32\find.exe "PID" 2^>NUL') Do @Set "PID=%%G"
但是,基于
@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
秒增加。