部署DeepSeek模型,进群交流最in玩法!
立即加群
发布
社区首页 >专栏 >过滤某PID的svchost进程

过滤某PID的svchost进程

原创
作者头像
Windows技术交流
发布2025-02-12 10:39:07
发布2025-02-12 10:39:07
630
举报
文章被收录于专栏:Windows技术交流Windows技术交流

原始问题:tasklist /svc结果如下(节选),pid 1560对应的svchost.exe是紧挨的2行,svchost.exe和1560只显示在第一行,单纯用tasklist /svc | findstr 1560过滤1560会导致过滤出的结果不全(下一行不会显示)

代码语言:txt
复制


映像名称                       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参数(最为简单,能看到算法之美)

代码语言:txt
复制
tasklist /svc /fi "PID eq 1560"
tasklist /svc /fi "PID eq 1560" /fi "IMAGENAME eq svchost.exe"

②用powershell处理字符串(虽然麻烦,但能看到代码之美、AI之美)

让deepseek帮忙优化下代码

代码语言:txt
复制
做了如下改造,是因为最多的时候同一个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
    }
}

代码语言:txt
复制
# 获取 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档