[記事公開日]2026/01/26
PowerShellで起動時間が遅い原因を調べる方法(イベントログでボトルネック特定)
体感ではなく「数値とログ」で遅い箇所を特定する。Diagnostics-Performance(起動・ログオン・シャットダウン)と、サービス/ドライバの遅延痕跡を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、インデックス)やストレージ遅延を疑う
起動が遅い状態で「ディスクが怪しい兆候(タイムアウト/リセット)」が出ている場合、
そのまま使い続けると起動不能やデータ損失に繋がることがあります。
兆候が強いときは、まずデータ保護(バックアップ/救出)を優先してください。
➡️ 関連記事(タイトル順)
- PowerShellで起動時間が遅い原因を調べる方法(イベントログでボトルネック特定)
- PowerShellで接続された外付けストレージ履歴を確認する方法(USB/外付けHDD/SSD/SDカード)
- PowerShellでブルースクリーン履歴を確認する方法(STOPコード/再起動痕跡)
- PowerShellでバッテリー劣化を数値で確認する方法(ノートPC)
- PowerShellでネットワーク切断履歴を調べる方法(有線・Wi-Fi共通)
- PowerShellでドライバーエラーを一覧表示する方法(デバイス不調の切り分け)
- PowerShellで「電源が落ちた原因」を調べる方法(Event ID 41 / 6008 実践)
- PowerShellでWindowsアップデート失敗履歴を確認する方法(原因の手掛かりをログで掴む)
- PowerShellでUSB抜き差し履歴を確認する方法(接続・切断・認識不良の痕跡)
- PowerShellでSSD / HDDの異常兆候を調べる方法(SMART的観点)
