windows服务管理器(services.msc)仅支持基础关键词搜索,无法多条件筛选或保存视图;powershell通过get-service、where-object、sort-object等命令可实现动态筛选、多字段排序、导出csv及事件日志溯源。
windows 服务管理器本身(services.msc)不支持真正的“高级筛选”或“多字段排序”,它的筛选能力非常基础——仅能按服务名称、状态、描述等字段手动输入关键词搜索,且无法组合条件、无法保存筛选视图、也不支持逻辑运算(如“运行中且启动类型为自动”)。但通过 powershell,你可以实现远超 gui 的精准控制。
用 PowerShell 实现动态筛选
PowerShell 的 Get-Service(别名 gsv)配合 Where-Object(别名 ?),可构建灵活的筛选逻辑:
- 查所有正在运行的服务:
gsv | ? {$_.Status -eq 'Running'} - 查名称含 “win” 且状态为停止的服务:
gsv | ? {$_.Name -like '*win*' -and $_.Status -eq 'Stopped'} - 查启动类型为“自动延迟启动”的服务(需扩展属性):
Get-CimInstance Win32_Service | ? {$_.StartMode -eq 'Auto' -and $_.DelayedAutoStart -eq $true} | Select Name, DisplayName, State
按多维度排序显示
GUI 中只能单列点击排序,而 PowerShell 支持链式排序,例如先按状态降序(运行在前),再按名称升序排列:
gsv | Sort-Object Status -Descending, Name- 想把“禁用”服务排最后?可自定义排序顺序:
gsv | Sort-Object @{Expression={$_.Status}; Ascending=$false}, Name
导出与批量验证
筛选排序后的结果可直接导出为 CSV,便于归档或跨机比对:
- 导出所有非“手动”启动的服务:
gsv | ? {$_.StartType -ne 'Manual'} | Export-Csv .\non_manual_services.csv -NoTypeInformation - 检查某组关键服务是否全部运行:
'wuauserv','bits','cryptsvc' | ForEach-Object { Get-Service $_ -ErrorAction SilentlyContinue } | Select Name, Status, StartType
结合事件日志做状态溯源
仅看当前状态不够?可关联服务启停事件(ID 7035/7040)定位异常时间点:
- 查最近1小时 EdgeUpdate 服务的状态变更:
Get-WinEvent -FilterHashtable @{LogName='System'; ID=7035,7040; StartTime=(Get-Date).AddHours(-1)} | Where-Object {$_.Message -match 'edgeupdate'} | Format-List TimeCreated, Message











