[登録されているタグ]

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

PowerShellでWindowsアップデート失敗履歴を確認する方法(原因の手掛かりをログで掴む)

更新失敗は「いつ・どのKBで・どの段階で」止まったかが重要。WindowsUpdateClient / Setup / CBS / Servicing のログをPowerShellで一覧化し、失敗コード・該当KB・前後関係を追う実務手順。

PowerShell
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. 実務の最短手順(迷ったらこの順)

  1. WindowsUpdateClient(System)で失敗イベントを一覧化し、KBとエラーコードの手掛かりを掴む
  2. Setupログで「再起動段階/機能更新」系の失敗がないか確認する
  3. CBS.log / dism.log で “破損/依存関係/0xエラー” の行を抽出する
  4. 空き容量・ストレージ兆候・ドライバエラーをセットで見て、原因の方向性を絞る

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

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

ページ上部へ戻る