[登録されているタグ]

[記事公開日]2026/01/26

PowerShellで起動時間が遅い原因を調べる方法(イベントログでボトルネック特定)

体感ではなく「数値とログ」で遅い箇所を特定する。Diagnostics-Performance(起動・ログオン・シャットダウン)と、サービス/ドライバの遅延痕跡をPowerShellで一覧化する実務手順。

PowerShell
起動が遅い
イベントログ
切り分け

「最近、起動が遅い」「ログオン後しばらく固まる」「電源を入れてから使えるまでが長い」――
こうした症状は原因が幅広く、体感だけで当たりを付けると遠回りしがちです。
Windowsは起動やログオンのパフォーマンス情報をイベントログに記録しており、
PowerShellで引き出せば“どこで時間がかかっているか”を数値で把握できます。
この記事では、現場でよく使う順に「起動が遅い原因」を調べる方法をまとめます。

※起動が遅い原因は、ストレージ劣化・常駐アプリ・サービス遅延・ドライバ不調・更新失敗・プロファイル破損など様々です。
本記事は「原因を断定」ではなく、ログでボトルネックを特定して切り分ける手順です。

1. まず結論:起動の遅さは “どのフェーズが遅いか” で原因が変わる

  • 電源ON〜OS起動(ブート)が遅い:ストレージ、ドライバ、BIOS/UEFI、BitLocker、ハード寄り
  • ログオン〜操作可能が遅い:スタートアップ、サービス、常駐、ドメイン/ネットワーク、プロファイル寄り
  • 起動後に断続的に固まる:更新処理、インデックス、Defender、ディスクI/O、ストレージ不調寄り

WindowsのDiagnostics-Performanceログを見れば、どのフェーズで遅いかが数値で見えます。

2. 起動時間の本命ログ:Diagnostics-Performance(Event ID 100)

まずは起動(Boot)時間を、イベントログで数値として確認します。
起動パフォーマンスのログは以下にあります。

  • ログ:Microsoft-Windows-Diagnostics-Performance/Operational
  • 起動:Event ID 100(Boot Performance Monitoring)

2-1. 直近の起動時間を一覧表示(ID 100)

Get-WinEvent -FilterHashtable @{
  LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"
  Id      = 100
} -MaxEvents 30 |
Select-Object TimeCreated, Id, Message |
Sort-Object TimeCreated -Descending
      

Message内に「Boot Duration(起動時間)」などが含まれます。見づらい場合は次で“数値だけ”に整形します。

2-2. 起動時間(ms)を抽出して表にする(読みやすく)

Get-WinEvent -FilterHashtable @{
  LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"
  Id      = 100
} -MaxEvents 30 |
ForEach-Object {
  $xml = [xml]$_.ToXml()
  $data = @{}
  foreach($d in $xml.Event.EventData.Data){
    $data[$d.Name] = $d.'#text'
  }

  [PSCustomObject]@{
    TimeCreated         = $_.TimeCreated
    BootDuration_ms     = [int]$data["BootDuration"]
    MainPathBoot_ms     = [int]$data["MainPathBootTime"]
    BootPostBoot_ms     = [int]$data["BootPostBootTime"]
    IsDegradation       = $data["IsDegradation"]
  }
} |
Sort-Object TimeCreated -Descending |
Format-Table -AutoSize
      
  • MainPathBootTime:OSが立ち上がるまで(ドライバ/ストレージなどの影響が出やすい)
  • BootPostBootTime:ログオン後しばらく(常駐/サービス/更新処理などの影響が出やすい)

3. 「遅くなった時期」を掴む:Degradation(劣化)イベントを見る

「最近遅い」場合は、Windowsが“起動劣化”として記録していることがあります。
Diagnostics-Performanceには、劣化(Degradation)や遅延の詳細ログがあります。

3-1. 起動劣化(Boot Degradation)を確認(ID 101/102 系が出ることが多い)

Get-WinEvent -FilterHashtable @{
  LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"
} -MaxEvents 300 |
Where-Object { $_.Id -in 101,102,103,104,105,106,107,108,109,110 } |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending
      

出た場合、Message内に「どの処理が遅かったか」の手掛かりが書かれていることがあります(環境依存)。

4. “ログオン後が遅い” を疑う:ログオン(ID 200)を確認

「電源ONは普通だが、ログオンしてから固まる」場合は、
起動(100)よりログオン(200)周りが怪しいことがあります。

4-1. ログオンのパフォーマンス(ID 200)

Get-WinEvent -FilterHashtable @{
  LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"
  Id      = 200
} -MaxEvents 30 |
Select-Object TimeCreated, Id, Message |
Sort-Object TimeCreated -Descending
      

こちらもXMLにして時間(ms)を抽出できます(出力形式は環境差があります)。

5. 起動に絡む“犯人候補”を洗い出す(スタートアップ・サービス)

BootPostBootTime が長い場合は、スタートアップやサービス遅延が典型です。
まずは「自動起動系」を一覧で把握します。

5-1. スタートアップ(レジストリRun)を一覧表示

$runPaths = @(
  "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run",
  "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"
)

$runPaths | ForEach-Object {
  if(Test-Path $_){
    Get-ItemProperty $_ | Select-Object * | ForEach-Object {
      $_.PSObject.Properties |
      Where-Object { $_.Name -notmatch "^PS" } |
      ForEach-Object {
        [PSCustomObject]@{
          Location = $_
          Name     = $_.Name
          Command  = $_.Value
        }
      }
    }
  }
} | Format-Table -AutoSize
      

5-2. 自動起動サービスで「止まっている/失敗している」を抽出

Get-Service |
Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
Select-Object Name, DisplayName, Status, StartType |
Sort-Object Name
      

6. 起動が遅い時に一緒に見るべきログ(ストレージ/ドライバ/更新)

起動遅延は、根本がストレージやドライバ不調であることもあります。
「起動が遅い」相談の現場で、セットで見ることが多いログをまとめて抽出します。

6-1. ストレージ系(disk/Ntfs/stor*)のエラー兆候

$days = 14
Get-WinEvent -FilterHashtable @{
  LogName   = "System"
  StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
  $_.ProviderName -in @("disk","Ntfs","volmgr","partmgr","storahci","stornvme","nvme","storport","iaStorA","iaStorAC")
} |
Where-Object {
  $_.LevelDisplayName -in @("Error","Warning","Critical")
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
      

6-2. ドライバ初期化失敗(Kernel-PnP / DriverFrameworks)

$days = 14
Get-WinEvent -FilterHashtable @{
  LogName   = "System"
  StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
  $_.ProviderName -in @("Microsoft-Windows-Kernel-PnP","Microsoft-Windows-DriverFrameworks-UserMode")
  -and $_.LevelDisplayName -in @("Error","Warning")
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
      

6-3. Windows Update 失敗や長時間処理の痕跡(簡易)

$days = 14
Get-WinEvent -FilterHashtable @{
  LogName   = "System"
  StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
  $_.ProviderName -match "WindowsUpdate|Update|Servicing|TrustedInstaller"
  -and $_.LevelDisplayName -in @("Error","Warning")
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
      

7. 実務のまとめ:数字で“どこが遅いか”を確定してから対処へ

  • MainPathBootTime が長い:ストレージ/ドライバ/ファーム/BIOS/暗号化/ハード寄りを疑う
  • BootPostBootTime が長い:常駐/サービス/更新/セキュリティ/ドメイン寄りを疑う
  • 起動のたびにバラつく:バックグラウンド処理(更新、Defender、インデックス)やストレージ遅延を疑う

起動が遅い状態で「ディスクが怪しい兆候(タイムアウト/リセット)」が出ている場合、
そのまま使い続けると起動不能やデータ損失に繋がることがあります。
兆候が強いときは、まずデータ保護(バックアップ/救出)を優先してください。

➡️ 関連記事(タイトル順)

すべてを開く | すべてを閉じる

ページ上部へ戻る