原始问题:tasklist /svc结果如下(节选),pid 1560对应的svchost.exe是紧挨的2行,svchost.exe和1560只显示在第一行,单纯用tasklist /svc | findstr 1560过滤1560会导致过滤出的结果不全(下一行不会显示)
映像名称 PID 服务
========================= ======== ============================================
System Idle Process 0 暂缺
System 4 暂缺
Registry 272 暂缺
smss.exe 736 暂缺
csrss.exe 1032 暂缺
wininit.exe 1232 暂缺
services.exe 1328 暂缺
lsass.exe 1340 EFS, KeyIso, SamSs, VaultSvc
svchost.exe 1560 BrokerInfrastructure, DcomLaunch, PlugPlay,
Power, SystemEventsBroker
fontdrvhost.exe 1592 暂缺
有2种办法
①用/fi参数(最为简单,能看到算法之美)
tasklist /svc /fi "PID eq 1560"
tasklist /svc /fi "PID eq 1560" /fi "IMAGENAME eq svchost.exe"
②用powershell处理字符串(虽然麻烦,但能看到代码之美、AI之美)
让deepseek帮忙优化下代码
做了如下改造,是因为最多的时候同一个svchost对应的服务有十几个,可能展示五六行,但其实有特点,
如果没显示完,下一行的最后一个字符是英文逗号,可否打印下一行的时候看看最后一个字符是不是逗号,
是的话再打印一行,麻烦继续修改代码
# 获取 tasklist /svc 的输出
$tasklist = tasklist /svc
# 遍历每一行,找到 PID 为 960 的行
for ($i = 0; $i -lt $tasklist.Count; $i++) {
# 检查当前行是否包含 "svchost.exe" 和 "960"
if ($tasklist[$i] -match "svchost.exe\s+960\s+") {
# 输出当前行(svchost.exe 和 PID)
$tasklist[$i]
# 输出下5行(最多的时候同一个svchost对应的服务有十几个,可能展示五六行)
$tasklist[$i + 1]
$tasklist[$i + 2]
$tasklist[$i + 3]
$tasklist[$i + 4]
$tasklist[$i + 5]
break
}
}
# 获取 tasklist /svc 的输出
$tasklist = tasklist /svc
# 遍历每一行,找到 PID 为 960 的行
for ($i = 0; $i -lt $tasklist.Count; $i++) {
# 检查当前行是否包含 "svchost.exe" 和 "960"
if ($tasklist[$i] -match "svchost.exe\s+960\s+") {
# 输出当前行(svchost.exe 和 PID)
$tasklist[$i]
# 初始化行号
$j = $i + 1
# 循环输出后续行,直到某一行不以逗号结尾
while ($j -lt $tasklist.Count -and $tasklist[$j].TrimEnd().EndsWith(",")) {
# 输出当前行
$tasklist[$j]
# 移动到下一行
$j++
}
# 输出最后一行(不以逗号结尾的行)
if ($j -lt $tasklist.Count) {
$tasklist[$j]
}
break
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。