PowerShell 自动化运维:监测 Windows 服务启动耗时

云婷小哥_5811

云婷小哥_5811

2026-06-12

585人浏览

原创

powershell不直接记录服务启动耗时,但可通过事件id 100(kernel-boot日志)获取自动启动服务的完成时间戳,或用start-service前后计时法测算手动启动耗时,并结合事件id 7000/7009排查失败原因。

powershell 本身不直接记录单个 windows 服务的“启动耗时”,但可通过组合事件日志、时间戳比对与服务状态变化,间接测算关键服务从触发启动到进入 running 状态所经历的时间。这不是毫秒级仪表盘,而是面向运维可观测性的实用追踪方案。

抓取服务启动完成的确切时刻(事件 ID 100)

Windows 内核在每个服务成功启动后,会向 Microsoft-Windows-Kernel-Boot 日志源写入事件 ID 100,其中包含 ServiceName 和精确到毫秒的 StartTime 字段。这是最权威的启动完成标记。

  • 执行命令提取最近一次某服务(如 WinRM)的启动事件:
    Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-Kernel-Boot'; Id=100} -MaxEvents 50 | Where-Object {$_.Properties[0].Value -eq 'WinRM'} | Select-Object TimeCreated, @{n='ServiceName';e={$_.Properties[0].Value}}, @{n='StartTimeMs';e={$_.Properties[1].Value}} | Sort-Object TimeCreated -Descending | Select-Object -First 1
  • 注意:该事件仅在服务由系统自动启动(非手动 Start-Service)时稳定生成;若用于监控自定义服务,请确保其 StartType = Automatic

用时间差法估算手动/计划启动耗时

当你通过脚本或任务计划启动一个服务时,可主动打点计时:在 Start-Service 前记录当前时间,在确认状态变为 Running 后再取一次时间,二者之差即为本次启动耗时。

windows-git-ops
windows-git-ops

在 Windows PowerShell 工作区执行 Git 操作时使用此技能,特别适用于创建分支、暂存、提交、合并、状态检查等。

下载
  • 示例片段(含超时保护):
    $start = Get-Date
    Start-Service -Name 'Spooler' -ErrorAction Stop
    $maxWait = 30
    1..$maxWait | ForEach-Object {
      if ((Get-Service Spooler).Status -eq 'Running') { break }
      Start-Sleep -Seconds 1
    }
    $end = Get-Date
    $duration = $end - $start
    Write-Host "Spooler 启动耗时: $($duration.TotalSeconds.ToString('F2')) 秒"
  • 此方法适用于自动化修复脚本中增加耗时反馈,便于识别缓慢服务(如 >8 秒应告警)

批量监控多个服务并输出耗时报告

将上述逻辑封装为可复用函数,结合服务清单与阈值判断,生成结构化结果,便于后续导出 HTML 或发邮件。

  • 定义目标服务列表:
    $services = @('WinRM', 'Dhcp', 'BITS')
  • 逐个执行带计时的启动检查(跳过已运行项):
    $report = foreach ($svc in $services) {
      $s = Get-Service $svc -ErrorAction SilentlyContinue
      if (!$s) { continue }
      if ($s.Status -eq 'Running') {
        [PSCustomObject]@{ Service = $svc; Status = 'Running'; DurationSec = 0; Result = 'OK' }
      } else {
        $t0 = Get-Date
        try {
          Start-Service $svc -ErrorAction Stop
          Wait-Service $svc -Status Running -Timeout 15
          $t1 = Get-Date
          $sec = ($t1 - $t0).TotalSeconds
          [PSCustomObject]@{ Service = $svc; Status = 'Running'; DurationSec = [math]::Round($sec, 2); Result = if ($sec -gt 5) { 'Slow' } else { 'OK' } }
        } catch {
          [PSCustomObject]@{ Service = $svc; Status = 'Failed'; DurationSec = 0; Result = $_.Exception.Message.Substring(0, [Math]::Min(50, $_.Exception.Message.Length)) }
        }
      }
    }
  • 输出为表格或导出 CSV:
    $report | Where-Object Result -ne 'OK' | Format-Table -AutoSize
    $report | Export-Csv "$env:TEMP\ServiceStartupTimes_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation

关联启动失败原因(查事件 ID 7000 / 7009)

若某服务启动耗时异常长或最终失败,不能只看“花了多久”,更要查“为什么卡住”。系统会在服务控制管理器(Service Control Manager)日志中记录依赖超时(ID 7009)或服务未响应(ID 7000)。

  • 快速定位最近一次 Spooler 启动问题:
    Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'; Id=7000,7009} -MaxEvents 20 | Where-Object {$_.Message -match 'Spooler'} | Format-List TimeCreated, Id, Message
  • 常见根因包括:依赖服务未就绪、权限不足、二进制文件损坏、注册表配置错误——这些信息比单纯耗时更有诊断价值

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

windows

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3219

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2798

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1488

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2559

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3290

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1597

3

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2023.08.28

2477

4

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.30

4847

5

Window.setInterval()方法
Window.setInterval()方法

Window.setInterval() 方法的基本语法是“window.setInterval(function, delay)”,function是要重复执行的函数或代码块,delay是每次执行之间的时间间隔,以毫秒为单位。本专题为大家提供Window.setInterval()相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

715

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习