[記事公開日]2026/01/26
PowerShellでWindowsアップデート失敗履歴を確認する方法(原因の手掛かりをログで掴む)
更新失敗は「いつ・どのKBで・どの段階で」止まったかが重要。WindowsUpdateClient / Setup / CBS / Servicing のログをPowerShellで一覧化し、失敗コード・該当KB・前後関係を追う実務手順。
Windows Update
失敗履歴
切り分け
「更新に失敗しました」「インストールできませんでした」「再起動ループになった」――
Windowsアップデートの不具合は“表示されるメッセージ”だけだと情報が少なく、
何を直すべきか判断しづらいです。
ただしWindowsは、更新処理の各段階でログを残しています。
PowerShellでログを引き出せば、失敗したKBやエラーコード、失敗したタイミングが追えるため、
対処の優先順位が付けやすくなります。
この記事では、現場で使いやすい順に「失敗履歴の確認方法」を整理します。
※更新失敗の原因は、通信・空き容量・破損・ドライバ相性・セキュリティソフト・ストレージ不調など様々です。
本記事は「原因を断定」ではなく、ログで手掛かりを集めて原因範囲を絞る手順です。
もくじ
1. まず結論:更新失敗を見るログは3段階(見える範囲が違う)
- A:Windows Update クライアントのイベント(何をインストールしようとして、どう失敗したか)
- B:セットアップ/機能更新ログ(23H2/24H2など大型更新、再起動段階の失敗)
- C:CBS/Servicing(コンポーネントストアや更新パッケージ適用の詳細)
まずAで「KBと失敗コード」を掴み、次にB/Cで「失敗の段階」と「破損/依存関係」を追うのが最短です。
2. 最短:WindowsUpdateClient の失敗イベントを一覧表示する
まずはイベントログの「Windows Update クライアント」から失敗履歴を拾います。
ここで KB番号やエラーコードが取れることがあります。
2-1. Systemログ(WindowsUpdateClient)の警告/エラーを抽出
$days = 90
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
ProviderName = "Microsoft-Windows-WindowsUpdateClient"
} |
Where-Object { $_.LevelDisplayName -in @("Error","Warning") } |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
Message に KB(例:KB503xxxx)やエラーコード(0x8007xxxx 等)が含まれることがあります。
2-2. 「KB」っぽいものだけ抜き出す(読みやすく)
$days = 180
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
ProviderName = "Microsoft-Windows-WindowsUpdateClient"
} |
Where-Object { $_.LevelDisplayName -in @("Error","Warning") } |
ForEach-Object {
$msg = ($_.Message -replace "\r?\n"," ")
$kb = ([regex]::Matches($msg, "KB\d{6,7}") | ForEach-Object { $_.Value } | Select-Object -Unique) -join ","
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
EventId = $_.Id
Level = $_.LevelDisplayName
KB = $kb
Message = $msg
}
} |
Sort-Object TimeCreated -Descending |
Select-Object -First 200 |
Format-Table -AutoSize
3. “インストール履歴”として一覧化する(Get-HotFix / 更新パッケージ)
イベントログは詳細ですが、まずは「何が入っているか/入っていないか」の確認も重要です。
Get-HotFix は分かりやすい反面、環境によって表示が揺れることもあります。
3-1. インストール済みKB(Get-HotFix)
Get-HotFix |
Select-Object HotFixID, InstalledOn, Description |
Sort-Object InstalledOn -Descending |
Select-Object -First 50
「失敗したKB」と「実際に入っているKB」を照合すると、繰り返し失敗しているKBが見えることがあります。
4. 大型更新(機能更新/再起動段階)の失敗を追う:Setupログ
23H2/24H2のような大型更新や、再起動段階での失敗は「Setupログ」に痕跡が残ることがあります。
ここは“更新の段階”を掴むのに役立ちます。
4-1. Setupログのエラー/警告を抽出
$days = 180
Get-WinEvent -FilterHashtable @{
LogName = "Setup"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object { $_.LevelDisplayName -in @("Error","Warning") } |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
5. “実際に何が壊れているか”に寄る:CBS / Servicing(Component-Based Servicing)
更新失敗の原因が「コンポーネントストア破損」「依存関係の不整合」などの場合、
CBS/Servicingのログが手掛かりになります。
ただしCBS.logは巨大になりやすいので、PowerShellで“怪しい行”だけ抽出するのが現実的です。
5-1. CBS.log から Error/Failed/0x を含む行を抽出
※管理者権限で実行推奨。CBS.log が存在しない/アクセスできない環境もあります。
$path = "C:\Windows\Logs\CBS\CBS.log" if(Test-Path $path){ Select-String -Path $path -Pattern "error","failed","0x","corrupt","cannot" | Select-Object -Last 200 } else { "CBS.log が見つかりませんでした: $path" }
5-2. DISMログ(dism.log)も確認(修復失敗の手掛かり)
$path = "C:\Windows\Logs\DISM\dism.log"
if(Test-Path $path){
Select-String -Path $path -Pattern "error","failed","0x" |
Select-Object -Last 200
} else {
"dism.log が見つかりませんでした: $path"
}
6. 更新失敗の“原因の方向性”を絞るために一緒に見るべきもの
6-1. 空き容量(失敗理由で非常に多い)
Get-Volume | Where-Object { $_.DriveLetter } | Select-Object DriveLetter, FileSystem, SizeRemaining, Size | Format-Table -AutoSize
6-2. ストレージのエラー兆候(更新中にI/Oエラーが出ると失敗しやすい)
$days = 30
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
$_.ProviderName -in @("disk","Ntfs","volmgr","partmgr","storahci","stornvme","nvme","storport","iaStorA","iaStorAC")
-and $_.LevelDisplayName -in @("Error","Warning","Critical")
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
6-3. ドライバ/デバイスエラー(更新後に不安定になる原因にもなる)
$days = 30
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
更新失敗が繰り返されているPCは、裏でストレージ劣化(I/Oエラー)やシステム破損が進んでいることがあります。
「起動が遅い」「フリーズが増えた」「外付けが不安定」なども併発している場合は、更新対処より先にデータ保護を優先してください。
7. 実務の最短手順(迷ったらこの順)
- WindowsUpdateClient(System)で失敗イベントを一覧化し、KBとエラーコードの手掛かりを掴む
- Setupログで「再起動段階/機能更新」系の失敗がないか確認する
- CBS.log / dism.log で “破損/依存関係/0xエラー” の行を抽出する
- 空き容量・ストレージ兆候・ドライバエラーをセットで見て、原因の方向性を絞る
➡️ 関連記事(タイトル順)
- 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的観点)
